⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fltexportvisitor.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}// Billboards also go through this code. The Geode is passed// to writeFace and writeMesh. If those methods successfully cast// the Geode to a Billboard, then they set the template mode// bit accordingly.voidFltExportVisitor::apply( osg::Geode& node ){    _firstNode = false;    ScopedStatePushPop guard( this, node.getStateSet() );    unsigned int idx;    for (idx=0; idx<node.getNumDrawables(); idx++)    {        osg::Geometry* geom = node.getDrawable( idx )->asGeometry();        if (!geom)        {            std::string warning( "fltexp: Non-Geometry Drawable encountered. Ignoring." );            osg::notify( osg::WARN ) << warning << std::endl;            _fltOpt->getWriteResult().warn( warning );            continue;        }        ScopedStatePushPop drawableGuard( this, geom->getStateSet() );        // Push and pop subfaces if polygon offset is on.        SubfaceHelper subface( *this, getCurrentStateSet() );        if (atLeastOneFace( *geom ))        {            // If at least one record will be a Face record, then we            //   need to write to the vertex palette.            _vertexPalette->add( *geom );            // Iterate over all PrimitiveSets and output Face records.            unsigned int jdx;            for (jdx=0; jdx < geom->getNumPrimitiveSets(); jdx++)            {                osg::PrimitiveSet* prim = geom->getPrimitiveSet( jdx );                if ( isMesh( prim->getMode() ) )                    continue;                if (prim->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType)                    handleDrawArrays( dynamic_cast<osg::DrawArrays*>( prim ), *geom, node );                else if (prim->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType)                    handleDrawArrayLengths( dynamic_cast<osg::DrawArrayLengths*>( prim ), *geom, node );                else if ( (prim->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) ||                        (prim->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) ||                        (prim->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) )                    handleDrawElements( dynamic_cast<osg::DrawElements*>( prim ), *geom, node );                else                {                    std::string warning( "fltexp: Unknown PrimitiveSet type." );                    osg::notify( osg::WARN ) << warning << std::endl;                    _fltOpt->getWriteResult().warn( warning );                    return;                }            }        }        if (atLeastOneMesh( *geom ))        {            // If at least one Mesh record, write out preamble mesh records            //   followed by a Mesh Primitive record per PrimitiveSet.            writeMesh( node, *geom );            writeMatrix( node.getUserData() );            writeComment( node );            writeMultitexture( *geom );            writeLocalVertexPool( *geom );            writePush();            unsigned int jdx;            for (jdx=0; jdx < geom->getNumPrimitiveSets(); jdx++)            {                osg::PrimitiveSet* prim = geom->getPrimitiveSet( jdx );                if ( !isMesh( prim->getMode() ) )                    continue;                if (prim->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType)                    handleDrawArrays( dynamic_cast<osg::DrawArrays*>( prim ), *geom, node );                else if (prim->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType)                    handleDrawArrayLengths( dynamic_cast<osg::DrawArrayLengths*>( prim ), *geom, node );                else if ( (prim->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) ||                        (prim->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) ||                        (prim->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) )                    handleDrawElements( dynamic_cast<osg::DrawElements*>( prim ), *geom, node );                else                {                    std::string warning( "fltexp: Unknown PrimitiveSet type." );                    osg::notify( osg::WARN ) << warning << std::endl;                    _fltOpt->getWriteResult().warn( warning );                    return;                }            }            writePop();        }    }    // Would traverse here if this node could have children.    //   traverse( (osg::Node&)node );}voidFltExportVisitor::apply( osg::Node& node ){    _firstNode = false;    ScopedStatePushPop guard( this, node.getStateSet() );    osgSim::LightPointNode* lpn = dynamic_cast< osgSim::LightPointNode* >( &node );    if (lpn)    {        writeLightPoint( lpn );    }    else    {        // Unknown Node. Warn and return.        // (Note, if the base class of this Node was a Group, then apply(Group&)        //   would export a Group record then continue traversal. Because we are        //   a Node, there's no way to continue traversal, so just return.)        std::string warning( "fltexp: Unknown Node in OpenFlight export." );        osg::notify( osg::WARN ) << warning << std::endl;        _fltOpt->getWriteResult().warn( warning );        return;    }}voidFltExportVisitor::apply( osg::ProxyNode& node ){    _firstNode = false;    ScopedStatePushPop guard( this, node.getStateSet() );    writeExternalReference( node );    writeMatrix( node.getUserData() );    writeComment( node );}boolFltExportVisitor::complete( const osg::Node& node ){    // Always write final pop level    writePop();    // Done writing records, close the record data temp file.    _recordsStr.close();    // Write OpenFlight file front matter: header, vertex palette, etc.    writeHeader( node.getName() );    writeColorPalette();    _materialPalette->write( _dos );    _texturePalette->write( _dos );    _lightSourcePalette->write( _dos );    _vertexPalette->write( _dos );    // Write Comment ancillary record and specify the _dos DataOutputStream.    writeComment( node, &_dos );    // Copy record data temp file into final OpenFlight file.    // Yee-uck. TBD need better stream copy routine.    char buf;    osgDB::ifstream recIn;    recIn.open( _recordsTempName.c_str(), std::ios::in | std::ios::binary );    while (!recIn.eof() )    {        recIn.read( &buf, 1 );        if (recIn.good())            _dos << buf;    }    recIn.close();    return true;}//// StateSet stack supportvoidFltExportVisitor::pushStateSet( const osg::StateSet* rhs ){    osg::StateSet* ss = new osg::StateSet( *( _stateSetStack.back().get() ) );    if (rhs)        ss->merge( *rhs );    _stateSetStack.push_back( ss );}voidFltExportVisitor::popStateSet(){    _stateSetStack.pop_back();}const osg::StateSet*FltExportVisitor::getCurrentStateSet() const{    return _stateSetStack.back().get();}voidFltExportVisitor::clearStateSetStack(){    _stateSetStack.clear();}voidFltExportVisitor::writeATTRFile( int unit, const osg::Texture2D* texture ) const{    std::string name;    if (_fltOpt->getStripTextureFilePath())        name = osgDB::getSimpleFileName( texture->getImage()->getFileName() );    else        name = texture->getImage()->getFileName();    name += std::string( ".attr" );    if ( osgDB::findDataFile( name ).empty() )    {        // No .attr file found. We should write one out.        // Fill AttrData fields from current state.        AttrData ad;        ad.texels_u = texture->getImage()->s();        ad.texels_v = texture->getImage()->t();        switch( texture->getFilter( osg::Texture::MIN_FILTER ) )        {        case osg::Texture::LINEAR:            ad.minFilterMode = AttrData::MIN_FILTER_BILINEAR;            break;        case osg::Texture::LINEAR_MIPMAP_LINEAR:            ad.minFilterMode = AttrData::MIN_FILTER_MIPMAP_TRILINEAR;            break;        case osg::Texture::LINEAR_MIPMAP_NEAREST:            ad.minFilterMode = AttrData::MIN_FILTER_MIPMAP_BILINEAR;            break;        case osg::Texture::NEAREST:            ad.minFilterMode = AttrData::MIN_FILTER_POINT;            break;        case osg::Texture::NEAREST_MIPMAP_LINEAR:            ad.minFilterMode = AttrData::MIN_FILTER_MIPMAP_LINEAR;            break;        case osg::Texture::NEAREST_MIPMAP_NEAREST:            ad.minFilterMode = AttrData::MIN_FILTER_MIPMAP_POINT;            break;        default:            ad.minFilterMode = AttrData::MIN_FILTER_MIPMAP_TRILINEAR;            break;        }        switch( texture->getFilter( osg::Texture::MAG_FILTER ) )        {        case osg::Texture::NEAREST:            ad.magFilterMode = AttrData::MAG_FILTER_POINT;            break;        default:            ad.magFilterMode = AttrData::MAG_FILTER_BILINEAR;            break;        }        // Repeat and Clamp        switch( texture->getWrap( osg::Texture::WRAP_S ) )        {        case osg::Texture::CLAMP:        case osg::Texture::CLAMP_TO_EDGE:        case osg::Texture::CLAMP_TO_BORDER:            ad.wrapMode_u = AttrData::WRAP_CLAMP;            break;        case osg::Texture::REPEAT:        default:            ad.wrapMode_u = AttrData::WRAP_REPEAT;            break;        case osg::Texture::MIRROR:            if (_fltOpt->getFlightFileVersionNumber() >= 1610)                ad.wrapMode_u = AttrData::WRAP_MIRRORED_REPEAT;            else                ad.wrapMode_u = AttrData::WRAP_REPEAT;            break;        }        switch( texture->getWrap( osg::Texture::WRAP_T ) )        {        case osg::Texture::CLAMP:        case osg::Texture::CLAMP_TO_EDGE:        case osg::Texture::CLAMP_TO_BORDER:            ad.wrapMode_v = AttrData::WRAP_CLAMP;            break;        case osg::Texture::REPEAT:        default:            ad.wrapMode_v = AttrData::WRAP_REPEAT;            break;        case osg::Texture::MIRROR:            if (_fltOpt->getFlightFileVersionNumber() >= 1610)                ad.wrapMode_v = AttrData::WRAP_MIRRORED_REPEAT;            else                ad.wrapMode_v = AttrData::WRAP_REPEAT;            break;        }        const osg::StateSet* ss = getCurrentStateSet();        const osg::TexEnv* texenv = dynamic_cast<const osg::TexEnv*>(            ss->getTextureAttribute( unit, osg::StateAttribute::TEXENV ) );        switch( texenv->getMode())        {        case osg::TexEnv::DECAL:            ad.texEnvMode = AttrData::TEXENV_DECAL;            break;        case osg::TexEnv::MODULATE:        default:            ad.texEnvMode = AttrData::TEXENV_MODULATE;            break;        case osg::TexEnv::BLEND:            ad.texEnvMode = AttrData::TEXENV_BLEND;            break;        case osg::TexEnv::REPLACE:            ad.texEnvMode = AttrData::TEXENV_COLOR;            break;        case osg::TexEnv::ADD:            ad.texEnvMode = AttrData::TEXENV_ADD;            break;        }        osgDB::writeObjectFile( ad, name, _fltOpt.get() );    }}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -