diff --git a/src/osgPlugins/OpenFlight/FltExportVisitor.h b/src/osgPlugins/OpenFlight/FltExportVisitor.h index 21d2e4161..e125d8166 100644 --- a/src/osgPlugins/OpenFlight/FltExportVisitor.h +++ b/src/osgPlugins/OpenFlight/FltExportVisitor.h @@ -136,7 +136,8 @@ public: void writeMeshPrimitive( const std::vector& indices, GLenum mode ); void writeLocalVertexPool( const osg::Geometry& geom ); void writeMultitexture( const osg::Geometry& geom ); - void writeUVList( int numVerts, const osg::Geometry& geom ); + void writeUVList( int numVerts, const osg::Geometry& geom, const std::vector& indices ); + void writeUVList( int numVerts, const osg::Geometry& geom, unsigned int first); // Light Point records void writeLightPoint(); diff --git a/src/osgPlugins/OpenFlight/expGeometryRecords.cpp b/src/osgPlugins/OpenFlight/expGeometryRecords.cpp index 443f543c8..a712efb66 100644 --- a/src/osgPlugins/OpenFlight/expGeometryRecords.cpp +++ b/src/osgPlugins/OpenFlight/expGeometryRecords.cpp @@ -770,7 +770,7 @@ FltExportVisitor::writeMultitexture( const osg::Geometry& geom ) } void -FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom ) +FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom, const std::vector& indices ) { unsigned int numLayers( 0 ); uint32 flags( 0 ); @@ -808,7 +808,61 @@ FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom ) _fltOpt->getWriteResult().warn( warning.str() ); t2 = new osg::Vec2Array; } - else if (static_cast(t2->getNumElements()) != numVerts) + + const int size = t2->getNumElements(); + for( int cIdx=0; cIdxwriteFloat32( tc[0] ); + _records->writeFloat32( tc[1] ); + } + } + } +} + + +void +FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom, unsigned int first ) +{ + unsigned int numLayers( 0 ); + uint32 flags( 0 ); + unsigned int idx; + for( idx=1; idx<8; idx++) + { + if( isTextured( idx, geom ) ) + { + flags |= LAYER_1 >> (idx-1); + numLayers++; + } + } + if( numLayers == 0 ) + return; + + uint16 length( 8 + (8*numLayers*numVerts) ); + + _records->writeInt16( (int16) UV_LIST_OP ); + _records->writeUInt16( length ); + _records->writeInt32( flags ); + + osg::Vec2 defaultCoord( 0., 0. ); + for( idx=1; idx<8; idx++) + { + if( isTextured( idx, geom ) ) + { + osg::Array* t = const_cast( geom.getTexCoordArray( idx ) ); + osg::ref_ptr t2 = dynamic_cast( t ); + if (!t2.valid()) + { + std::ostringstream warning; + warning << "fltexp: No Texture2D for unit " << idx; + osg::notify( osg::WARN ) << warning.str() << std::endl; + _fltOpt->getWriteResult().warn( warning.str() ); + t2 = new osg::Vec2Array; + } + else if (static_cast(t2->getNumElements()) < first + numVerts) { std::ostringstream warning; warning << "fltexp: Invalid number of texture coordinates for unit " << idx; @@ -817,9 +871,10 @@ FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom ) } const int size = t2->getNumElements(); - int vIdx; - for( vIdx=0; vIdx