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..."
This commit is contained in:
Robert Osfield
2010-12-21 09:12:18 +00:00
parent 89f9aa2ddd
commit fce0121d26

View File

@@ -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<numVerts; vertexIdx++)
{
if( isTextured( idx, geom ) )
for( idx=1; idx<8; idx++)
{
osg::Array* t = const_cast<osg::Array*>( geom.getTexCoordArray( idx ) );
osg::ref_ptr<osg::Vec2Array> t2 = dynamic_cast<osg::Vec2Array*>( 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<osg::Array*>( geom.getTexCoordArray( idx ) );
osg::ref_ptr<osg::Vec2Array> t2 = dynamic_cast<osg::Vec2Array*>( 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; cIdx<numVerts; cIdx++)
{
int vIdx = indices[cIdx];
const int size = t2->getNumElements();
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<numVerts; vertexIdx++)
{
if( isTextured( idx, geom ) )
for( idx=1; idx<8; idx++)
{
osg::Array* t = const_cast<osg::Array*>( geom.getTexCoordArray( idx ) );
osg::ref_ptr<osg::Vec2Array> t2 = dynamic_cast<osg::Vec2Array*>( 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<osg::Array*>( geom.getTexCoordArray( idx ) );
osg::ref_ptr<osg::Vec2Array> t2 = dynamic_cast<osg::Vec2Array*>( 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; cIdx<numVerts; cIdx++)
{
int vIdx = first + cIdx;
const int size = t2->getNumElements();
int vIdx = first + vertexIdx;
osg::Vec2& tc( defaultCoord );
if (vIdx < size)
tc = (*t2)[ vIdx ];