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