Improved the handling of endian swap of osg::Array
This commit is contained in:
@@ -129,6 +129,7 @@ public:
|
||||
void advanceToCurrentEndBracket() { _in->advanceToCurrentEndBracket(); }
|
||||
void readWrappedString( std::string& str ) { _in->readWrappedString(str); checkStream(); }
|
||||
void readCharArray( char* s, unsigned int size ) { _in->readCharArray(s, size); }
|
||||
void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes) { _in->readComponentArray( s, numElements, numComponentsPerElements, componentSizeInBytes); }
|
||||
|
||||
// readSize() use unsigned int for all sizes.
|
||||
unsigned int readSize() { unsigned int size; *this>>size; return size; }
|
||||
@@ -140,9 +141,6 @@ public:
|
||||
osg::Object* readObject( osg::Object* existingObj=0 );
|
||||
osg::Object* readObjectFields( const std::string& className, unsigned int id, osg::Object* existingObj=0);
|
||||
|
||||
void setByteSwap(int byteSwap) { _byteSwap = byteSwap; }
|
||||
int getByteSwap() const { return _byteSwap; }
|
||||
|
||||
/// set an input iterator, used directly when not using InputStream with a traditional file releated stream.
|
||||
void setInputIterator( InputIterator* ii ) { _in = ii; }
|
||||
|
||||
@@ -164,13 +162,12 @@ protected:
|
||||
void setWrapperSchema( const std::string& name, const std::string& properties );
|
||||
|
||||
template<typename T>
|
||||
void readArrayImplementation( T* a, int read_size, bool useByteSwap=false );
|
||||
void readArrayImplementation( T* a, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes );
|
||||
|
||||
ArrayMap _arrayMap;
|
||||
IdentifierMap _identifierMap;
|
||||
|
||||
int _fileVersion;
|
||||
int _byteSwap;
|
||||
bool _useSchemaData;
|
||||
bool _forceReadingImage;
|
||||
std::vector<std::string> _fields;
|
||||
|
||||
@@ -22,7 +22,7 @@ public:
|
||||
void setStream( std::ostream* ostream ) { _out = ostream; }
|
||||
std::ostream* getStream() { return _out; }
|
||||
const std::ostream* getStream() const { return _out; }
|
||||
|
||||
|
||||
virtual bool isBinary() const = 0;
|
||||
|
||||
virtual void writeBool( bool b ) = 0;
|
||||
@@ -115,6 +115,8 @@ public:
|
||||
|
||||
void throwException( const std::string& msg );
|
||||
|
||||
void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes);
|
||||
|
||||
protected:
|
||||
std::istream* _in;
|
||||
osgDB::InputStream* _inputStream;
|
||||
|
||||
@@ -24,7 +24,7 @@ using namespace osgDB;
|
||||
static std::string s_lastSchema;
|
||||
|
||||
InputStream::InputStream( const osgDB::Options* options )
|
||||
: _fileVersion(0), _byteSwap(0), _useSchemaData(false), _forceReadingImage(false), _dataDecompress(0)
|
||||
: _fileVersion(0), _useSchemaData(false), _forceReadingImage(false), _dataDecompress(0)
|
||||
{
|
||||
if ( !options ) return;
|
||||
_options = options;
|
||||
@@ -240,147 +240,147 @@ osg::Array* InputStream::readArray()
|
||||
case ID_BYTE_ARRAY:
|
||||
{
|
||||
osg::ByteArray* ba = new osg::ByteArray;
|
||||
readArrayImplementation( ba, CHAR_SIZE, true );
|
||||
readArrayImplementation( ba, 1, CHAR_SIZE);
|
||||
array = ba;
|
||||
}
|
||||
break;
|
||||
case ID_UBYTE_ARRAY:
|
||||
{
|
||||
osg::UByteArray* uba = new osg::UByteArray;
|
||||
readArrayImplementation( uba, CHAR_SIZE, true );
|
||||
readArrayImplementation( uba, 1, CHAR_SIZE );
|
||||
array = uba;
|
||||
}
|
||||
break;
|
||||
case ID_SHORT_ARRAY:
|
||||
{
|
||||
osg::ShortArray* sa = new osg::ShortArray;
|
||||
readArrayImplementation( sa, SHORT_SIZE, true );
|
||||
readArrayImplementation( sa, 1, SHORT_SIZE );
|
||||
array = sa;
|
||||
}
|
||||
break;
|
||||
case ID_USHORT_ARRAY:
|
||||
{
|
||||
osg::UShortArray* usa = new osg::UShortArray;
|
||||
readArrayImplementation( usa, SHORT_SIZE, true );
|
||||
readArrayImplementation( usa, 1, SHORT_SIZE );
|
||||
array = usa;
|
||||
}
|
||||
break;
|
||||
case ID_INT_ARRAY:
|
||||
{
|
||||
osg::IntArray* ia = new osg::IntArray;
|
||||
readArrayImplementation( ia, INT_SIZE, true );
|
||||
readArrayImplementation( ia, 1, INT_SIZE );
|
||||
array = ia;
|
||||
}
|
||||
break;
|
||||
case ID_UINT_ARRAY:
|
||||
{
|
||||
osg::UIntArray* uia = new osg::UIntArray;
|
||||
readArrayImplementation( uia, INT_SIZE, true );
|
||||
readArrayImplementation( uia, 1, INT_SIZE );
|
||||
array = uia;
|
||||
}
|
||||
break;
|
||||
case ID_FLOAT_ARRAY:
|
||||
{
|
||||
osg::FloatArray* fa = new osg::FloatArray;
|
||||
readArrayImplementation( fa, FLOAT_SIZE, true );
|
||||
readArrayImplementation( fa, 1, FLOAT_SIZE );
|
||||
array = fa;
|
||||
}
|
||||
break;
|
||||
case ID_DOUBLE_ARRAY:
|
||||
{
|
||||
osg::DoubleArray* da = new osg::DoubleArray;
|
||||
readArrayImplementation( da, DOUBLE_SIZE, true );
|
||||
readArrayImplementation( da, 1, DOUBLE_SIZE );
|
||||
array = da;
|
||||
}
|
||||
break;
|
||||
case ID_VEC2B_ARRAY:
|
||||
{
|
||||
osg::Vec2bArray* va = new osg::Vec2bArray;
|
||||
readArrayImplementation( va, 2*CHAR_SIZE );
|
||||
readArrayImplementation( va, 2, CHAR_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC3B_ARRAY:
|
||||
{
|
||||
osg::Vec3bArray* va = new osg::Vec3bArray;
|
||||
readArrayImplementation( va, 3*CHAR_SIZE );
|
||||
readArrayImplementation( va, 3, CHAR_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC4B_ARRAY:
|
||||
{
|
||||
osg::Vec4bArray* va = new osg::Vec4bArray;
|
||||
readArrayImplementation( va, 4*CHAR_SIZE );
|
||||
readArrayImplementation( va, 4, CHAR_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC4UB_ARRAY:
|
||||
{
|
||||
osg::Vec4ubArray* va = new osg::Vec4ubArray;
|
||||
readArrayImplementation( va, 4*CHAR_SIZE );
|
||||
readArrayImplementation( va, 4, CHAR_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC2S_ARRAY:
|
||||
{
|
||||
osg::Vec2sArray* va = new osg::Vec2sArray;
|
||||
readArrayImplementation( va, 2*SHORT_SIZE );
|
||||
readArrayImplementation( va, 2, SHORT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC3S_ARRAY:
|
||||
{
|
||||
osg::Vec3sArray* va = new osg::Vec3sArray;
|
||||
readArrayImplementation( va, 3*SHORT_SIZE );
|
||||
readArrayImplementation( va, 3, SHORT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC4S_ARRAY:
|
||||
{
|
||||
osg::Vec4sArray* va = new osg::Vec4sArray;
|
||||
readArrayImplementation( va, 4*SHORT_SIZE );
|
||||
readArrayImplementation( va, 4, SHORT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC2_ARRAY:
|
||||
{
|
||||
osg::Vec2Array* va = new osg::Vec2Array;
|
||||
readArrayImplementation( va, 2*FLOAT_SIZE );
|
||||
readArrayImplementation( va, 2, FLOAT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC3_ARRAY:
|
||||
{
|
||||
osg::Vec3Array* va = new osg::Vec3Array;
|
||||
readArrayImplementation( va, 3*FLOAT_SIZE );
|
||||
readArrayImplementation( va, 3, FLOAT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC4_ARRAY:
|
||||
{
|
||||
osg::Vec4Array* va = new osg::Vec4Array;
|
||||
readArrayImplementation( va, 4*FLOAT_SIZE );
|
||||
readArrayImplementation( va, 4, FLOAT_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC2D_ARRAY:
|
||||
{
|
||||
osg::Vec2dArray* va = new osg::Vec2dArray;
|
||||
readArrayImplementation( va, 2*DOUBLE_SIZE );
|
||||
readArrayImplementation( va, 2, DOUBLE_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC3D_ARRAY:
|
||||
{
|
||||
osg::Vec3dArray* va = new osg::Vec3dArray;
|
||||
readArrayImplementation( va, 3*DOUBLE_SIZE );
|
||||
readArrayImplementation( va, 3, DOUBLE_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
case ID_VEC4D_ARRAY:
|
||||
{
|
||||
osg::Vec4dArray* va = new osg::Vec4dArray;
|
||||
readArrayImplementation( va, 4*DOUBLE_SIZE );
|
||||
readArrayImplementation( va, 4, DOUBLE_SIZE );
|
||||
array = va;
|
||||
}
|
||||
break;
|
||||
@@ -683,9 +683,6 @@ InputStream::ReadType InputStream::start( InputIterator* inIterator )
|
||||
{
|
||||
_fields.clear();
|
||||
_fields.push_back( "Start" );
|
||||
|
||||
OSG_INFO<<"InputStream::start( InputIterator* inIterator ) calling setByteSwap("<<inIterator->getByteSwap()<<")"<<std::endl;
|
||||
setByteSwap(inIterator->getByteSwap());
|
||||
|
||||
ReadType type = READ_UNKNOWN;
|
||||
_in = inIterator;
|
||||
@@ -806,7 +803,7 @@ void InputStream::resetSchema()
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void InputStream::readArrayImplementation( T* a, int read_size, bool useByteSwap )
|
||||
void InputStream::readArrayImplementation( T* a, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes )
|
||||
{
|
||||
int size = 0;
|
||||
*this >> size >> BEGIN_BRACKET;
|
||||
@@ -815,12 +812,8 @@ void InputStream::readArrayImplementation( T* a, int read_size, bool useByteSwap
|
||||
a->resize( size );
|
||||
if ( isBinary() )
|
||||
{
|
||||
readCharArray( (char*)&((*a)[0]), read_size*size ); checkStream();
|
||||
if ( useByteSwap && _byteSwap )
|
||||
{
|
||||
for ( int i=0; i<size; ++i )
|
||||
osg::swapBytes( (char*)&((*a)[i]), read_size );
|
||||
}
|
||||
readComponentArray( (char*)&((*a)[0]), size, numComponentsPerElements, componentSizeInBytes );
|
||||
checkStream();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -16,6 +16,28 @@
|
||||
|
||||
using namespace osgDB;
|
||||
|
||||
void InputIterator::readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes)
|
||||
{
|
||||
unsigned int size = numElements * numComponentsPerElements * componentSizeInBytes;
|
||||
if ( size>0 )
|
||||
{
|
||||
readCharArray( s, size);
|
||||
|
||||
if (_byteSwap && componentSizeInBytes>1)
|
||||
{
|
||||
char* ptr = s;
|
||||
for(unsigned int i=0; i<numElements; ++i)
|
||||
{
|
||||
for(unsigned int j=0; j<numComponentsPerElements; ++j)
|
||||
{
|
||||
osg::swapBytes( ptr, componentSizeInBytes );
|
||||
ptr += componentSizeInBytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InputIterator::throwException( const std::string& msg )
|
||||
{
|
||||
if (_inputStream) _inputStream->throwException(msg);
|
||||
|
||||
@@ -209,8 +209,8 @@ public:
|
||||
virtual void readMark( osgDB::ObjectMark& mark ) {}
|
||||
|
||||
virtual void readCharArray( char* s, unsigned int size )
|
||||
{ if ( size>0 ) _in->read( s, size ); }
|
||||
|
||||
{ if ( size>0 ) _in->read( s, size ); }
|
||||
|
||||
virtual void readWrappedString( std::string& str )
|
||||
{ readString( str ); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user