Commit 470c0819 authored by Sebastian Eichelbaum's avatar Sebastian Eichelbaum

[MERGE]

parents a4222460 7449d082
......@@ -5,15 +5,15 @@
Hello User! New to OpenWalnut? Have a look at <a href="http://www.openwalnut.org">http://www.openwalnut.org</a>!
We provide
<ul>
<li> user-/video documentation
<li> user-/video documentation,
<li> programming tutorials
<li> and the newest information
<li> and the latest information on OpenWalnut.
</ul>
Do you have problems using OpenWalnut? Do not hesitate to ask:
<ul>
<li><a href="mailto:openwalnut@lists.informatik.uni-leipzig.de">Mailing List</a>
<li><a href="mailto:openwalnut@lists.informatik.uni-leipzig.de">Mailing list</a>
<li>IRC Chat on irc.freenode.net in #ow
</ul>
Found a Bug? Do you have ideas for improvement? Please <a href="http://www.openwalnut.org/projects/openwalnut/wiki/Contribute">report</a> these issues! We can improve OpenWalnut only with your help and ideas.
Found a bug? Do you have ideas for improvements? Please <a href="http://www.openwalnut.org/projects/openwalnut/wiki/Contribute">report</a> these issues! We can improve OpenWalnut only with your help and ideas.
<br><br>
<i>Thank you for using OpenWalnut!</i>
......@@ -196,29 +196,16 @@ osg::Vec3 WTriangleMesh::getVertex( size_t index ) const
osg::Vec4 WTriangleMesh::getVertColor( size_t index ) const
{
WAssert( index < m_countVerts, "get vertex: index out of range" );
WAssert( index < m_countVerts, "get vertex color: index out of range" );
return ( *m_vertColors )[index];
}
WPosition WTriangleMesh::getVertexAsPosition( size_t index ) const
{
WAssert( index < m_countVerts, "get vertex as position: index out of range" );
return WPosition( ( *m_verts )[index][0], ( *m_verts )[index][1], ( *m_verts )[index][2] );
}
WPosition WTriangleMesh::getNormalAsPosition( size_t index ) const
WVector3d WTriangleMesh::getNormal( size_t index ) const
{
WAssert( index < m_countVerts, "get vertex as position: index out of range" );
WAssert( index < m_countVerts, "get normal as position: index out of range" );
return WPosition( ( *m_vertNormals )[index][0], ( *m_vertNormals )[index][1], ( *m_vertNormals )[index][2] );
}
WPosition WTriangleMesh::getVertexAsPosition( size_t triangleIndex, size_t vertNum )
{
WAssert( triangleIndex < m_countTriangles, "get vertex as position: index out of range" );
osg::Vec3 v = getTriVert( triangleIndex, vertNum );
return WPosition( v[0], v[1], v[2] );
}
void WTriangleMesh::removeVertex( size_t index )
{
WAssert( index < m_countVerts, "remove vertex: index out of range" );
......@@ -382,13 +369,13 @@ void WTriangleMesh::doLoopSubD()
osg::Vec3* newVertexPositions = new osg::Vec3[m_numTriVerts];
//std::cout << "loop subdivision pass 1" << std::endl;
//std::cout << "Loop subdivision pass 1" << std::endl;
for( size_t i = 0; i < m_numTriVerts; ++i )
{
newVertexPositions[i] = loopCalcNewPosition( i );
}
//std::cout << "loop subdivision pass 2" << std::endl;
//std::cout << "Loop subdivision pass 2" << std::endl;
for( size_t i = 0; i < m_numTriFaces; ++i )
{
loopInsertCenterTriangle( i );
......@@ -397,13 +384,13 @@ void WTriangleMesh::doLoopSubD()
std::vector< size_t >v;
m_vertexIsInTriangle.resize( ( *m_verts ).size(), v );
//std::cout << "loop subdivision pass 3" << std::endl;
//std::cout << "Loop subdivision pass 3" << std::endl;
for( size_t i = 0; i < m_numTriFaces; ++i )
{
loopInsertCornerTriangles( i );
}
//std::cout << "loop subdivision pass 4" << std::endl;
//std::cout << "Loop subdivision pass 4" << std::endl;
for( size_t i = 0; i < m_numTriVerts; ++i )
{
( *m_verts )[i] = newVertexPositions[i];
......
......@@ -213,7 +213,7 @@ public:
*
* \return vertex array
*/
osg::ref_ptr< const osg::Vec3Array >getVertexArray() const;
osg::ref_ptr< const osg::Vec3Array > getVertexArray() const;
/**
* Returns a reference pointer to the texture coordinate array.
......@@ -235,14 +235,14 @@ public:
* \param forceRecalc
* \return pointer to the vertex normal array
*/
osg::ref_ptr< osg::Vec3Array >getVertexNormalArray( bool forceRecalc = false );
osg::ref_ptr< osg::Vec3Array > getVertexNormalArray( bool forceRecalc = false );
/**
* getter
*
* \return pointer to the vertex color array
*/
osg::ref_ptr< osg::Vec4Array >getVertexColorArray();
osg::ref_ptr< osg::Vec4Array > getVertexColorArray();
/**
* Returns a const reference to the vertex ids of the triangles.
......@@ -257,7 +257,7 @@ public:
* \param forceRecalc
* \return pointer to the triangle normal array
*/
osg::ref_ptr< osg::Vec3Array >getTriangleNormalArray( bool forceRecalc = false );
osg::ref_ptr< osg::Vec3Array > getTriangleNormalArray( bool forceRecalc = false );
/**
......@@ -285,30 +285,13 @@ public:
*/
osg::Vec3 getTriVert( size_t triId, size_t vertNum );
/**
* getter
*
* \param index
* \return vertex
*/
WPosition getVertexAsPosition( size_t index ) const;
/**
* getter
*
* \param index
* \return normal
*/
WPosition getNormalAsPosition( size_t index ) const;
/**
* getter
*
* \param triangleIndex
* \param vertNum
* \return vertex
*/
WPosition getVertexAsPosition( size_t triangleIndex, size_t vertNum );
WVector3d getNormal( size_t index ) const;
/**
* getter
......
......@@ -136,10 +136,7 @@ void WMClusterParamDisplay::initSubModules()
// preset properties
debugLog() << "Start step submodule properties";
m_detTractClustering->getProperties()->getProperty( "active" )->toPropBool()->set( false, true );
m_voxelizer->getProperties()->getProperty( "Fiber Tracts" )->toPropBool()->set( false, true );
m_voxelizer->getProperties()->getProperty( "Display Voxels" )->toPropBool()->set( false, true );
m_voxelizer->getProperties()->getProperty( "Bounding Box Enable Feature" )->toPropBool()->set( false, true );
m_voxelizer->getProperties()->getProperty( "Lighting" )->toPropBool()->set( false, true );
m_voxelizer->getProperties()->getProperty( "active" )->toPropBool()->set( false, true );
m_gaussFiltering->getProperties()->getProperty( "Iterations" )->toPropInt()->set( 3, true );
m_clusterSlicer->getProperties()->getProperty( "Show|Hide Iso Voxels" )->toPropBool()->set( false );
m_clusterSlicer->getProperties()->getProperty( "Biggest Component Only" )->toPropBool()->set( false );
......@@ -168,13 +165,8 @@ void WMClusterParamDisplay::initSubModules()
m_properties->addProperty( m_detTractClustering->getProperties()->getProperty( "Output cluster ID" ) );
m_properties->addProperty( m_detTractClustering->getProperties()->getProperty( "Max cluster distance" ) );
m_properties->addProperty( m_detTractClustering->getProperties()->getProperty( "Min point distance" ) );
m_properties->addProperty( m_voxelizer->getProperties()->getProperty( "Fiber Tracts" ) );
m_properties->addProperty( m_voxelizer->getProperties()->getProperty( "Center Line" ) );
m_properties->addProperty( m_voxelizer->getProperties()->getProperty( "Lighting" ) );
m_properties->addProperty( m_voxelizer->getProperties()->getProperty( "Fiber Transparency" ) );
m_properties->addProperty( m_gaussFiltering->getProperties()->getProperty( "Iterations" ) );
m_properties->addProperty( m_meshRenderer->getProperties()->getProperty( "Opacity %" ) );
m_properties->addProperty( m_meshRenderer->getProperties()->getProperty( "Mesh Color" ) );
m_properties->addProperty( m_meshRenderer->getProperties()->getProperty( "Coloring" ) );
m_properties->addProperty( m_clusterSlicer->getProperties()->getProperty( "Show|Hide Iso Voxels" ) );
m_properties->addProperty( m_clusterSlicer->getProperties()->getProperty( "Mean Type" ) );
m_properties->addProperty( m_clusterSlicer->getProperties()->getProperty( "Show|Hide Slices" ) );
......
......@@ -134,7 +134,7 @@ void WMExportGeometry::writeFile()
std::stringstream points;
for( size_t i = 0; i < mesh->vertSize(); ++i )
{
WPosition pos = mesh->getVertexAsPosition( i );
WPosition pos = mesh->getVertex( i );
points << "" << pos[0] << " " << pos[1] << " " << pos[2];
if( i < mesh->vertSize() - 1 )
{
......
......@@ -290,7 +290,7 @@ bool WMSplineSurface::save() const
// dataFile << "POINTS " << m_triMesh->vertSize() << " float\n";
// for( size_t i = 0; i < m_triMesh->vertSize(); ++i )
// {
// point = m_triMesh->getVertexAsPosition( i );
// point = m_triMesh->getVertex( i );
// if( !( myIsfinite( point[0] ) && myIsfinite( point[1] ) && myIsfinite( point[2] ) ) )
// {
// WLogger::getLogger()->addLogMessage( "Will not write file from data that contains NAN or INF.", "Marching Cubes", LL_ERROR );
......
......@@ -130,7 +130,7 @@ private:
double getMedian( double x, double y, double z ) const;
/**
* Calculates the center point of an given interval. This simply is \f$x_{min} + \frac{x_{max} - x_{min}}{2}\f$.
* Calculates the center point of a given interval. This simply is \f$x_{min} + \frac{x_{max} - x_{min}}{2}\f$.
*
* \param min interval min
* \param max interval max
......
......@@ -45,6 +45,7 @@
#include "core/dataHandler/WGridTransformOrtho.h"
#include "core/graphicsEngine/WGEGeodeUtils.h"
#include "core/graphicsEngine/WGEGeometryUtils.h"
#include "core/graphicsEngine/WGEManagedGroupNode.h"
#include "core/graphicsEngine/WGEUtils.h"
#include "core/kernel/WKernel.h"
#include "core/kernel/WModuleInputData.h"
......@@ -61,10 +62,6 @@ W_LOADABLE_MODULE( WMVoxelizer )
WMVoxelizer::WMVoxelizer()
: WModule(),
m_osgNode( new WGEGroupNode ),
m_fiberGeode( new osg::Geode ),
m_centerLineGeode( new osg::Geode ),
m_boundingBoxGeode( new osg::Geode ),
m_fullUpdate( new WCondition() )
{
}
......@@ -88,7 +85,10 @@ void WMVoxelizer::moduleMain()
m_moduleState.setResetable();
m_moduleState.add( m_input->getDataChangedCondition() ); // additional fire-condition: "data changed" flag
m_moduleState.add( m_fullUpdate );
m_moduleState.add( m_drawCenterLine->getCondition() );
m_rootNode = new WGEManagedGroupNode( m_active );
m_rootNode->getOrCreateStateSet()->setMode( GL_BLEND, osg::StateAttribute::ON );
WKernel::getRunningKernel()->getGraphicsEngine()->getScene()->insert( m_rootNode );
ready();
......@@ -97,10 +97,8 @@ void WMVoxelizer::moduleMain()
if( !m_input->getData() ) // ok, the output has not yet sent data
{
// since there is no data yet we will eat property changes
m_drawVoxels->get( true );
m_rasterAlgo->get( true );
m_antialiased->get( true );
m_drawfibers->get( true );
continue;
}
if( m_input->getData()->size() == 0 )
......@@ -115,35 +113,24 @@ void WMVoxelizer::moduleMain()
++*progress;
// full update
if( m_antialiased->changed() || m_drawVoxels->changed() || m_rasterAlgo->changed() || m_voxelsPerUnit->changed() ||
if( m_antialiased->changed() || m_rasterAlgo->changed() || m_voxelsPerUnit->changed() ||
m_clusters != m_input->getData() || m_parameterAlgo->changed() )
{
m_drawVoxels->get( true );
m_rasterAlgo->get( true );
m_antialiased->get( true );
m_clusters = m_input->getData();
update();
}
++*progress;
if( m_drawfibers->changed() || m_explicitFiberColor->changed() || m_fiberTransparency->changed() )
{
updateFibers();
}
++*progress;
if( m_drawCenterLine->changed() )
{
updateCenterLine();
}
++*progress;
progress->finish();
m_moduleState.wait(); // waits for firing of m_moduleState ( dataChanged, shutdown, etc. )
}
m_rootNode->clear();
WKernel::getRunningKernel()->getGraphicsEngine()->getScene()->remove( m_rootNode );
}
void WMVoxelizer::properties()
......@@ -155,11 +142,6 @@ void WMVoxelizer::properties()
m_paramAlgoSelections->addItem( "By Integration", "Integrate along the voxelized line." );
m_antialiased = m_properties->addProperty( "Antialiasing", "Enable/Disable antialiased drawing of voxels.", true, m_fullUpdate );
m_drawfibers = m_properties->addProperty( "Fiber Tracts", "Enable/Disable drawing of the fibers of a cluster.", true, m_fullUpdate );
m_drawBoundingBox = m_properties->addProperty( "Bounding Box Enable Feature", "Enable/Disable drawing of a clusters BoundingBox.", true );
m_drawCenterLine = m_properties->addProperty( "Center Line", "Enable/Disable display of the center line", true );
m_lighting = m_properties->addProperty( "Lighting", "Enable/Disable lighting.", true );
m_drawVoxels = m_properties->addProperty( "Display Voxels", "Enable/Disable drawing of marked voxels.", true, m_fullUpdate );
m_rasterAlgo = m_properties->addProperty( "Raster Algo", "Specifies the algorithm you may want to use for voxelization.",
std::string( "WBresenham" ), m_fullUpdate );
m_voxelsPerUnit = m_properties->addProperty( "Voxels per Unit", "Specified the number of voxels per unit in the coordinate system. This "
......@@ -168,74 +150,10 @@ void WMVoxelizer::properties()
m_paramAlgoSelections->getSelectorFirst(), m_fullUpdate );
WPropertyHelper::PC_SELECTONLYONE::addTo( m_parameterAlgo );
WPropertyHelper::PC_NOTEMPTY::addTo( m_parameterAlgo );
m_fiberTransparency = m_properties->addProperty( "Fiber Transparency", "", 1.0, m_fullUpdate );
m_fiberTransparency->setMin( 0.0 );
m_fiberTransparency->setMax( 1.0 );
m_explicitFiberColor = m_properties->addProperty( "Explicit Fiber Color", "", WColor( 0.2, 0.2, 0.2, 1.0 ), m_fullUpdate );
WModule::properties();
}
void WMVoxelizer::activate()
{
if( m_osgNode )
{
if( m_active->get() )
{
m_osgNode->setNodeMask( 0xFFFFFFFF );
}
else
{
m_osgNode->setNodeMask( 0x0 );
}
}
WModule::activate();
}
osg::ref_ptr< osg::Geode > WMVoxelizer::genFiberGeode() const
{
using osg::ref_ptr;
ref_ptr< osg::Vec3Array > vertices = ref_ptr< osg::Vec3Array >( new osg::Vec3Array );
ref_ptr< osg::Vec4Array > colors = ref_ptr< osg::Vec4Array >( new osg::Vec4Array );
ref_ptr< osg::Geometry > geometry = ref_ptr< osg::Geometry >( new osg::Geometry );
const WDataSetFiberVector& fibs = *m_clusters->getDataSetReference();
const std::list< size_t >& fiberIDs = m_clusters->getIndices();
std::list< size_t >::const_iterator cit = fiberIDs.begin();
assert( fibs.size() > 0 && "no empty fiber dataset for clusters allowed in WMVoxelizer::createBoundingBox" );
assert( fibs[0].size() > 0 && "no empty fibers in a cluster allowed in WMVoxelizer::createBoundingBox" );
assert( fiberIDs.size() > 0 && "no empty clusters allowed in WMVoxelizer::createBoundingBox" );
for( cit = fiberIDs.begin(); cit != fiberIDs.end(); ++cit )
{
const WFiber& fib = fibs[*cit];
vertices->push_back( osg::Vec3( fib[0][0], fib[0][1], fib[0][2] ) );
for( size_t i = 1; i < fib.size(); ++i )
{
vertices->push_back( osg::Vec3( fib[i][0], fib[i][1], fib[i][2] ) );
WColor col = m_explicitFiberColor->get( true );
if( m_explicitFiberColor->get() == WColor( 0.2, 0.2, 0.2, 1.0 ) )
{
col = wge::getRGBAColorFromDirection( fib[i], fib[i-1] );
}
col[3] = m_fiberTransparency->get( true );
colors->push_back( col );
}
colors->push_back( colors->back() );
geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::LINE_STRIP, vertices->size() - fib.size(), fib.size() ) );
}
geometry->setVertexArray( vertices );
geometry->setColorArray( colors );
geometry->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
osg::ref_ptr< osg::Geode > geode = osg::ref_ptr< osg::Geode >( new osg::Geode );
geode->addDrawable( geometry.get() );
return geode;
}
boost::shared_ptr< WGridRegular3D > WMVoxelizer::constructGrid( const WBoundingBox& bb ) const
{
int32_t nbVoxelsPerUnit = m_voxelsPerUnit->get( true );
......@@ -264,62 +182,9 @@ boost::shared_ptr< WGridRegular3D > WMVoxelizer::constructGrid( const WBoundingB
return grid;
}
void WMVoxelizer::updateFibers()
{
debugLog() << "Fiber Update";
assert( m_osgNode );
if( m_drawfibers->get( true ) )
{
m_osgNode->remove( m_fiberGeode );
m_fiberGeode = genFiberGeode();
m_osgNode->insert( m_fiberGeode );
}
else
{
m_osgNode->remove( m_fiberGeode );
}
}
void WMVoxelizer::updateCenterLine()
{
assert( m_osgNode );
if( m_drawCenterLine->get( true ) )
{
boost::shared_ptr< WFiber > centerLine = m_clusters->getCenterLine();
if( centerLine )
{
m_centerLineGeode = wge::generateLineStripGeode( *centerLine, 3.f );
}
else
{
warnLog() << "CenterLine update on non existing CenterLine (null)";
m_centerLineGeode = osg::ref_ptr< osg::Geode >( new osg::Geode() );
}
m_osgNode->insert( m_centerLineGeode );
}
else
{
m_osgNode->remove( m_centerLineGeode );
}
}
void WMVoxelizer::update()
{
WKernel::getRunningKernel()->getGraphicsEngine()->getScene()->remove( m_osgNode );
m_osgNode = osg::ref_ptr< WGEGroupNode >( new WGEGroupNode );
m_osgNode->addUpdateCallback( new OSGCB_HideUnhideBB( this ) );
m_osgNode->addUpdateCallback( new OSGCB_ChangeLighting( this ) );
updateFibers();
updateCenterLine();
WBoundingBox bb = createBoundingBox( *m_clusters );
m_boundingBoxGeode = wge::generateBoundingBoxGeode( bb, WColor( 0.3, 0.3, 0.3, 1 ) );
m_osgNode->insert( m_boundingBoxGeode );
boost::shared_ptr< WGridRegular3D > grid = constructGrid( bb );
boost::shared_ptr< WGridRegular3D > grid = constructGrid( createBoundingBox( *m_clusters ) );
debugLog() << "Created grid of size: " << grid->size();
......@@ -384,15 +249,8 @@ void WMVoxelizer::update()
m_parameterizationOutput->updateData( outputDataSetIntegration );
}
if( m_drawVoxels->get() )
{
m_voxelGeode = genDataSetGeode( outputDataSet );
m_osgNode->insert( m_voxelGeode );
}
m_osgNode->setNodeMask( m_active->get() ? 0xFFFFFFFF : 0x0 );
m_osgNode->getOrCreateStateSet()->setMode( GL_BLEND, osg::StateAttribute::ON );
WKernel::getRunningKernel()->getGraphicsEngine()->getScene()->insert( m_osgNode );
m_rootNode->clear();
m_rootNode->insert( genDataSetGeode( outputDataSet ) );
}
void WMVoxelizer::raster( boost::shared_ptr< WRasterAlgorithm > algo ) const
......@@ -413,12 +271,6 @@ void WMVoxelizer::raster( boost::shared_ptr< WRasterAlgorithm > algo ) const
algo->raster( fibs.at( *cit ) );
}
algo->finished();
// TODO(math): This is just a line for testing purposes
// WLine l;
// l.push_back( WPosition( 73, 38, 29 ) );
// l.push_back( WPosition( 120, 150, 130 ) );
// algo->raster( l );
}
void WMVoxelizer::connectors()
......@@ -513,37 +365,5 @@ osg::ref_ptr< osg::Geode > WMVoxelizer::genDataSetGeode( boost::shared_ptr< WDat
depth->setWriteMask( false );
state->setAttributeAndModes( depth, osg::StateAttribute::ON );
// disable light for this geode as lines can't be lit properly
state->setMode( GL_LIGHTING, osg::StateAttribute::ON | osg::StateAttribute::PROTECTED );
return geode;
}
void WMVoxelizer::OSGCB_HideUnhideBB::operator()( osg::Node* node, osg::NodeVisitor* nv )
{
if( m_module->m_boundingBoxGeode )
{
if( m_module->m_drawBoundingBox->get() )
{
m_module->m_boundingBoxGeode->setNodeMask( 0xFFFFFFFF );
}
else
{
m_module->m_boundingBoxGeode->setNodeMask( 0x0 );
}
}
traverse( node, nv );
}
void WMVoxelizer::OSGCB_ChangeLighting::operator()( osg::Node* node, osg::NodeVisitor* nv )
{
if( m_module->m_lighting->get() )
{
m_module->m_osgNode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::ON );
}
else
{
m_module->m_osgNode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
}
traverse( node, nv );
}
......@@ -36,6 +36,7 @@ class WBresenhamDBL;
class WDataSetScalar;
class WFiberCluster;
class WRasterAlgorithm;
class WGEManagedGroupNode;
template< class T > class WModuleInputData;
/**
......@@ -101,17 +102,8 @@ protected:
*/
virtual void properties();
/**
* Generates an OSG geode for the fibers in the given cluster to display
* only this cluster.
*
* \return OSG geode containing the fibers of the cluster.
*/
osg::ref_ptr< osg::Geode > genFiberGeode() const;
/**
* Every parameter change this function is doing:
* - redraw fibers
* - bounding box and grid generation
* - executing a rasterization algo for the fibers
* - generate dataset out of the grid and a value set
......@@ -119,11 +111,6 @@ protected:
*/
void update();
/**
* Removes or inserts new fiber Geode into this modules group node.
*/
void updateFibers();
/**
* Removes or inserts geode for the center line of the current cluster into this modules group node.
*/
......@@ -164,15 +151,21 @@ protected:
*/
boost::shared_ptr< WGridRegular3D > constructGrid( const WBoundingBox& bb ) const;
private:
/**
* Input connector for a fiber cluster
*/
boost::shared_ptr< WModuleInputData< const WFiberCluster > > m_input;
/**
* Callback for m_active. Overwrite this in your modules to handle m_active changes separately.
* Output connector for a voxelized cluster
*/
virtual void activate();
boost::shared_ptr< WModuleOutputData< WDataSetScalar > > m_output;
private:
boost::shared_ptr< WModuleInputData< const WFiberCluster > > m_input; //!< Input connector for a fiber cluster
boost::shared_ptr< WModuleOutputData< WDataSetScalar > > m_output; //!< Output connector for a voxelized cluster
boost::shared_ptr< WModuleOutputData< WDataSetScalar > > m_dirOutput; //!< Output connector for a voxelized cluster (the fiber directions)
/**
* Output connector for a voxelized cluster (the fiber directions)
*/
boost::shared_ptr< WModuleOutputData< WDataSetScalar > > m_dirOutput;
/**
* Output providing parameterization to other algorithms. It provides a scalar field which gets filled with the parameterization of the
......@@ -180,100 +173,45 @@ private:
*/
boost::shared_ptr< WModuleOutputData< WDataSetScalar > > m_parameterizationOutput;
boost::shared_ptr< const WFiberCluster > m_clusters; //!< Reference to the fiber cluster
osg::ref_ptr< WGEGroupNode > m_osgNode; //!< OSG root node for this module
osg::ref_ptr< osg::Geode > m_fiberGeode; //!< OSG fiber geode
osg::ref_ptr< osg::Geode > m_centerLineGeode; //!< OSG center line of the current cluster geode
osg::ref_ptr< osg::Geode > m_boundingBoxGeode; //!< OSG bounding box geode
osg::ref_ptr< osg::Geode > m_voxelGeode; //!< OSG voxel geode
/**
* Reference to the fiber cluster
*/
boost::shared_ptr< const WFiberCluster > m_clusters;
boost::shared_ptr< WCondition > m_fullUpdate; //!< module is performing an expensive update
/**
* OSG root node for this module
*/
osg::ref_ptr< WGEManagedGroupNode > m_rootNode;
WPropBool m_antialiased; //!< Enable/Disable anti-aliased drawing of voxels
WPropBool m_drawfibers; //!< Enable/Disable drawing of the fibers of a cluster
WPropBool m_drawBoundingBox; //!< Enable/Disable drawing of a clusters BoundingBox
WPropBool m_drawCenterLine; //!< Enable/Disable drawing of the current clusters CenterLine
WPropBool m_lighting; //!< Enable/Disable lighting
WPropBool m_drawVoxels; //!< Enable/Disable drawing of marked voxels (this is not hide/unhide since its expensive computation time too!)