📄 fltexportvisitor.cpp
字号:
}// 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 + -