void DatasetIsosurface::draw( QMatrix4x4 pMatrix, QMatrix4x4 mvMatrix, int width, int height, int renderMode, QString target ) { if ( !properties( target ).get( Fn::Property::D_ACTIVE ).toBool() ) { return; } if ( m_renderer == 0 ) { m_renderer = new MeshRenderer( m_mesh[0] ); m_renderer->init(); } m_isoLevel = properties( "maingl" ).get( Fn::Property::D_ISO_VALUE ).toFloat(); if ( m_oldIsoValue != m_isoLevel ) { delete m_mesh[0]; m_mesh.clear(); generateSurface(); m_oldIsoValue = m_isoLevel; m_renderer->setMesh( m_mesh[0] ); } m_renderer->draw( pMatrix, mvMatrix, width, height, renderMode, properties( target ) ); GLFunctions::drawColormapBar( properties( target ), width, height, renderMode ); }
DatasetIsosurface::DatasetIsosurface( DatasetScalar* ds ) : DatasetMesh( QString( "isosurface" ), Fn::DatasetType::MESH_ISOSURFACE ), m_oldIsoValue( -1 ) { m_scalarField = *(ds->getData() ); m_properties.set( Fn::Property::NX, ds->properties()->get( Fn::Property::NX ).toInt() ); m_properties.set( Fn::Property::NY, ds->properties()->get( Fn::Property::NY ).toInt() ); m_properties.set( Fn::Property::NZ, ds->properties()->get( Fn::Property::NZ ).toInt() ); m_properties.set( Fn::Property::DX, ds->properties()->get( Fn::Property::DX ).toFloat() ); m_properties.set( Fn::Property::DY, ds->properties()->get( Fn::Property::DY ).toFloat() ); m_properties.set( Fn::Property::DZ, ds->properties()->get( Fn::Property::DZ ).toFloat() ); m_properties.set( Fn::Property::DIM, 0 ); m_properties.set( Fn::Property::CREATED_BY, (int)Fn::Algo::ISOSURFACE ); m_properties.set( Fn::Property::TYPE, (int)Fn::DatasetType::MESH_ISOSURFACE ); m_properties.set( Fn::Property::NAME, QString( "isosurface" ) ); m_properties.set( Fn::Property::ISO_VALUE, 80.0f, ds->properties()->get( Fn::Property::MIN ).toFloat(), ds->properties()->get( Fn::Property::MAX ).toFloat(), true ); m_nX = m_properties.get( Fn::Property::NX ).toInt() - 1; m_nY = m_properties.get( Fn::Property::NY ).toInt() - 1; m_nZ = m_properties.get( Fn::Property::NZ ).toInt() - 1; m_dX = m_properties.get( Fn::Property::DX ).toFloat(); m_dY = m_properties.get( Fn::Property::DY ).toFloat(); m_dZ = m_properties.get( Fn::Property::DZ ).toFloat(); m_nPointsInXDirection = ( m_nX + 1 ); m_nPointsInSlice = m_nPointsInXDirection * ( m_nY + 1 ); QMutex* mutex = new QMutex(); m_numThreads = GLFunctions::idealThreadCount; // create threads for ( int i = 0; i < m_numThreads; ++i ) { m_threads.push_back( new IsoSurfaceThread( &m_scalarField, mutex, &m_i2pt3idVertices, &m_trivecTriangles, m_nX, m_nY, m_nZ, m_dX, m_dY, m_dZ, i ) ); } generateSurface(); }
void DatasetIsosurface::draw( QMatrix4x4 pMatrix, QMatrix4x4 mvMatrix, int width, int height, int renderMode ) { if ( m_renderer == 0 ) { m_renderer = new MeshRenderer( m_mesh ); m_renderer->setModel( Models::g() ); m_renderer->init(); } m_isoLevel = m_properties.get( Fn::Property::ISO_VALUE ).toFloat(); if ( m_oldIsoValue != m_isoLevel ) { delete m_mesh; generateSurface(); m_oldIsoValue = m_isoLevel; m_renderer->setMesh( m_mesh ); } m_renderer->draw( pMatrix, mvMatrix, width, height, renderMode, &m_properties ); }
DatasetIsosurface::DatasetIsosurface( DatasetScalar* ds, float isoValue ) : DatasetMesh( QString( "isosurface" ), Fn::DatasetType::MESH_ISOSURFACE ), m_oldIsoValue( -1 ) { m_scalarField = *(ds->getData() ); m_properties["maingl"].createInt( Fn::Property::D_NX, ds->properties( "maingl" ).get( Fn::Property::D_NX ).toInt() ); m_properties["maingl"].createInt( Fn::Property::D_NY, ds->properties( "maingl" ).get( Fn::Property::D_NY ).toInt() ); m_properties["maingl"].createInt( Fn::Property::D_NZ, ds->properties( "maingl" ).get( Fn::Property::D_NZ ).toInt() ); m_properties["maingl"].createFloat( Fn::Property::D_DX, ds->properties( "maingl" ).get( Fn::Property::D_DX ).toFloat() ); m_properties["maingl"].createFloat( Fn::Property::D_DY, ds->properties( "maingl" ).get( Fn::Property::D_DY ).toFloat() ); m_properties["maingl"].createFloat( Fn::Property::D_DZ, ds->properties( "maingl" ).get( Fn::Property::D_DZ ).toFloat() ); m_properties["maingl"].createInt( Fn::Property::D_DIM, 1 ); m_properties["maingl"].createInt( Fn::Property::D_CREATED_BY, (int)Fn::Algo::ISOSURFACE ); m_properties["maingl"].createInt( Fn::Property::D_TYPE, (int)Fn::DatasetType::MESH_ISOSURFACE ); QString name = ds->properties( "maingl" ).get( Fn::Property::D_NAME ).toString(); if ( !name.contains( "isosurface" ) ) { name += " (isosurface)"; } m_properties["maingl"].createString( Fn::Property::D_NAME, name ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_LOWER_X, false, "special" ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_LOWER_Y, false, "special" ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_LOWER_Z, false, "special" ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_HIGHER_X, false, "special" ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_HIGHER_Y, false, "special" ); m_properties["maingl"].createBool( Fn::Property::D_MESH_CUT_HIGHER_Z, false, "special" ); m_properties["maingl"].createInt( Fn::Property::D_START_INDEX, 0 ); m_properties["maingl"].createInt( Fn::Property::D_END_INDEX, 0 ); finalizeProperties(); if ( isoValue > 0 ) { m_properties["maingl"].createFloat( Fn::Property::D_ISO_VALUE, isoValue, ds->properties( "maingl" ).get( Fn::Property::D_MIN ).toFloat(), ds->properties( "maingl" ).get( Fn::Property::D_MAX ).toFloat(), "general" ); } else { m_properties["maingl"].createFloat( Fn::Property::D_ISO_VALUE, ds->properties( "maingl" ).get( Fn::Property::D_MAX ).toFloat() * 0.3, ds->properties( "maingl" ).get( Fn::Property::D_MIN ).toFloat(), ds->properties( "maingl" ).get( Fn::Property::D_MAX ).toFloat(), "general" ); } m_nX = m_properties["maingl"].get( Fn::Property::D_NX ).toInt() - 1; m_nY = m_properties["maingl"].get( Fn::Property::D_NY ).toInt() - 1; m_nZ = m_properties["maingl"].get( Fn::Property::D_NZ ).toInt() - 1; m_dX = m_properties["maingl"].get( Fn::Property::D_DX ).toFloat(); m_dY = m_properties["maingl"].get( Fn::Property::D_DY ).toFloat(); m_dZ = m_properties["maingl"].get( Fn::Property::D_DZ ).toFloat(); m_plusX = ds->properties( "maingl" ).get( Fn::Property::D_ADJUST_X ).toFloat(); m_plusY = ds->properties( "maingl" ).get( Fn::Property::D_ADJUST_Y ).toFloat(); m_plusZ = ds->properties( "maingl" ).get( Fn::Property::D_ADJUST_Z ).toFloat(); m_nPointsInXDirection = ( m_nX + 1 ); m_nPointsInSlice = m_nPointsInXDirection * ( m_nY + 1 ); QMutex* mutex = new QMutex(); m_numThreads = GLFunctions::idealThreadCount; // create threads for ( int i = 0; i < m_numThreads; ++i ) { m_threads.push_back( new IsoSurfaceThread( &m_scalarField, mutex, &m_i2pt3idVertices, &m_trivecTriangles, m_nX, m_nY, m_nZ, m_dX, m_dY, m_dZ, i ) ); } generateSurface(); }