From fce0121d2667da3aade785e57ba94b56c0747df0 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 21 Dec 2010 09:12:18 +0000 Subject: [PATCH] From Paul Martz, Fix for "in expGeometryRecords.cpp lines 813-820, we write the UV list data incorrectly. According to the FLT spec, the data should be grouped per-vertex, not per-layer. We should have: UV for vertex 0, layer 1 UV for vertex 0, layer 2 UV for vertex 1, layer 1 UV for vertex 1, layer 2 ...etc... Instead, we have this: UV for vertex 0, layer 1 UV for vertex 1, layer 1 ...etc... UV for vertex 0, layer 2 UV for vertex 1, layer 2 ...etc..." --- .../OpenFlight/expGeometryRecords.cpp | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/osgPlugins/OpenFlight/expGeometryRecords.cpp b/src/osgPlugins/OpenFlight/expGeometryRecords.cpp index b8167b9f7..9eb500e31 100644 --- a/src/osgPlugins/OpenFlight/expGeometryRecords.cpp +++ b/src/osgPlugins/OpenFlight/expGeometryRecords.cpp @@ -794,30 +794,30 @@ FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom, const st osg::Vec2 defaultCoord( 0., 0. ); // const osg::StateSet* ss = getCurrentStateSet(); - for( idx=1; idx<8; idx++) + for( int vertexIdx=0; vertexIdx( geom.getTexCoordArray( idx ) ); - osg::ref_ptr t2 = dynamic_cast( t ); - if (!t2.valid()) + if( isTextured( idx, geom ) ) { - std::ostringstream warning; - warning << "fltexp: No Texture2D for unit " << idx; - OSG_WARN << warning.str() << std::endl; - _fltOpt->getWriteResult().warn( warning.str() ); - t2 = new osg::Vec2Array; - } + 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_WARN << warning.str() << std::endl; + _fltOpt->getWriteResult().warn( warning.str() ); + t2 = new osg::Vec2Array; + } - const int size = t2->getNumElements(); - for( int cIdx=0; cIdxgetNumElements(); + int vIdx = indices[ vertexIdx ]; osg::Vec2& tc( defaultCoord ); if (vIdx < size) - tc = (*t2)[ vIdx ]; - _records->writeFloat32( tc[0] ); - _records->writeFloat32( tc[1] ); + tc = ( *t2 )[ vIdx ]; + _records->writeFloat32( tc[ 0 ] ); + _records->writeFloat32( tc[ 1 ] ); } } } @@ -848,33 +848,32 @@ FltExportVisitor::writeUVList( int numVerts, const osg::Geometry& geom, unsigned _records->writeInt32( flags ); osg::Vec2 defaultCoord( 0., 0. ); - for( idx=1; idx<8; idx++) + for( int vertexIdx=0; vertexIdx( geom.getTexCoordArray( idx ) ); - osg::ref_ptr t2 = dynamic_cast( t ); - if (!t2.valid()) + if( isTextured( idx, geom ) ) { - 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 (t2->getNumElements() < first + numVerts) - { - std::ostringstream warning; - warning << "fltexp: Invalid number of texture coordinates for unit " << idx; - OSG_WARN << warning.str() << std::endl; - _fltOpt->getWriteResult().warn( warning.str() ); - } + 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 (t2->getNumElements() < first + numVerts) + { + std::ostringstream warning; + warning << "fltexp: Invalid number of texture coordinates for unit " << idx; + OSG_WARN << warning.str() << std::endl; + _fltOpt->getWriteResult().warn( warning.str() ); + } - const int size = t2->getNumElements(); - int cIdx; - for( cIdx=0; cIdxgetNumElements(); + int vIdx = first + vertexIdx; osg::Vec2& tc( defaultCoord ); if (vIdx < size) tc = (*t2)[ vIdx ];