root/OpenSceneGraph/trunk/src/osgPlugins/ive/DataInputStream.cpp @ 9527

Revision 9527, 50.4 kB (checked in by robert, 6 years ago)

Replaced readImageFile() usage with readRefImageFile() to prevent threading issues with caching of imagery in the osgDB::Registry cache.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/**********************************************************************
2 *
3 *    FILE:            DataInputStream.cpp
4 *
5 *    DESCRIPTION:    Implements methods to read simple datatypes from an
6 *                    input stream.
7 *
8 *    CREATED BY:        Rune Schmidt Jensen
9 *
10 *    HISTORY:        Created 11.03.2003
11 *                    Updated for texture1D by Don Burns, 27.1.2004
12 *                      Updated for light model - Stan Blinov at 25 august 7512 from World Creation (7.09.2004)
13 *
14 *
15 *    Copyright 2003 VR-C
16 **********************************************************************/
17
18#include "DataInputStream.h"
19#include "StateSet.h"
20#include "AlphaFunc.h"
21#include "BlendColor.h"
22#include "Stencil.h"
23#include "BlendFunc.h"
24#include "BlendEquation.h"
25#include "Depth.h"
26#include "Material.h"
27#include "CullFace.h"
28#include "ColorMask.h"
29#include "ClipPlane.h"
30#include "PolygonOffset.h"
31#include "PolygonMode.h"
32#include "ShadeModel.h"
33#include "Point.h"
34#include "LineWidth.h"
35#include "LineStipple.h"
36#include "Texture1D.h"
37#include "Texture2D.h"
38#include "Texture3D.h"
39#include "TextureCubeMap.h"
40#include "TextureRectangle.h"
41#include "TexEnv.h"
42#include "TexEnvCombine.h"
43#include "TexGen.h"
44#include "TexMat.h"
45#include "FragmentProgram.h"
46#include "VertexProgram.h"
47#include "LightModel.h"
48#include "ProxyNode.h"
49#include "FrontFace.h"
50#include "Program.h"
51#include "Viewport.h"
52#include "Scissor.h"
53#include "Image.h"
54#include "ImageSequence.h"
55#include "PointSprite.h"
56#include "Multisample.h"
57#include "Fog.h"
58#include "Light.h"
59
60
61#include "Group.h"
62#include "MatrixTransform.h"
63#include "Camera.h"
64#include "CameraView.h"
65#include "Geode.h"
66#include "LightSource.h"
67#include "TexGenNode.h"
68#include "ClipNode.h"
69#include "Billboard.h"
70#include "Sequence.h"
71#include "LOD.h"
72#include "PagedLOD.h"
73#include "PositionAttitudeTransform.h"
74#include "AutoTransform.h"
75#include "DOFTransform.h"
76#include "Transform.h"
77#include "Switch.h"
78#include "OccluderNode.h"
79#include "OcclusionQueryNode.h"
80#include "Impostor.h"
81#include "CoordinateSystemNode.h"
82#include "Uniform.h"
83#include "Shader.h"
84
85#include "LightPointNode.h"
86#include "MultiSwitch.h"
87#include "VisibilityGroup.h"
88
89#include "MultiTextureControl.h"
90#include "ShapeAttributeList.h"
91#include "Effect.h"
92#include "AnisotropicLighting.h"
93#include "BumpMapping.h"
94#include "Cartoon.h"
95#include "Scribe.h"
96#include "SpecularHighlights.h"
97
98#include "Geometry.h"
99#include "ShapeDrawable.h"
100#include "Shape.h"
101
102#include "Text.h"
103
104#include "TerrainTile.h"
105#include "Locator.h"
106#include "ImageLayer.h"
107#include "HeightFieldLayer.h"
108#include "CompositeLayer.h"
109#include "SwitchLayer.h"
110
111#include "FadeText.h"
112#include "Text3D.h"
113
114#include <osg/Endian>
115#include <osg/Notify>
116#include <osg/io_utils>
117#include <osgDB/ReadFile>
118#include <osgDB/FileNameUtils>
119
120#include <stdio.h>
121#include <sstream>
122
123using namespace ive;
124using namespace std;
125
126DataInputStream::DataInputStream(std::istream* istream, const osgDB::ReaderWriter::Options* options)
127{
128    unsigned int endianType ;
129
130    _loadExternalReferenceFiles = false;
131
132    _verboseOutput = false;
133
134    _istream = istream;
135    _owns_istream = false;
136    _peeking = false;
137    _peekValue = 0;
138    _byteswap = 0;
139
140    _options = options;
141
142    if (_options.get())
143    {
144        setLoadExternalReferenceFiles(_options->getOptionString().find("noLoadExternalReferenceFiles")==std::string::npos);
145        osg::notify(osg::DEBUG_INFO) << "ive::DataInputStream.setLoadExternalReferenceFiles()=" << getLoadExternalReferenceFiles() << std::endl;
146    }
147
148    if(!istream){
149        throw Exception("DataInputStream::DataInputStream(): null pointer exception in argument.");
150    }
151
152    endianType = readUInt() ;
153
154    if ( endianType != ENDIAN_TYPE) {
155      // Make sure the file is simply swapped
156      if ( endianType != OPPOSITE_ENDIAN_TYPE ) {
157         throw Exception("DataInputStream::DataInputStream(): This file has an unreadable endian type.") ;
158      }
159      osg::notify(osg::INFO)<<"DataInputStream::DataInputStream: Reading a byteswapped file" << std::endl ;
160      _byteswap = 1 ;
161   }
162
163    _version = readUInt();
164
165    // Are we trying to open a binary .ive file which version are newer than this library.
166    if(_version>VERSION){
167        throw Exception("DataInputStream::DataInputStream(): The version found in the file is newer than this library can handle.");
168    }
169   
170    if (_version>=VERSION_0033)
171    {
172        int compressionLevel = readInt();
173       
174        if (compressionLevel>0)
175        {
176            osg::notify(osg::INFO)<<"compressed ive stream"<<std::endl;
177           
178            unsigned int maxSize = readUInt();
179           
180            std::string data;
181            data.reserve(maxSize);
182           
183            if (!uncompress(*istream, data))
184            {
185                throw Exception("Error in uncompressing .ive");
186            }
187           
188            _istream = new std::stringstream(data);
189            _owns_istream = true;
190        }
191        else
192        {
193            osg::notify(osg::INFO)<<"uncompressed ive stream"<<std::endl;
194        }
195    }
196}
197
198DataInputStream::~DataInputStream()
199{
200    if (_owns_istream) delete _istream;
201}
202
203#ifdef USE_ZLIB
204
205#include <zlib.h>
206
207bool DataInputStream::uncompress(std::istream& fin, std::string& destination) const
208{
209    //#define CHUNK 16384
210    #define CHUNK 32768
211
212    int ret;
213    unsigned have;
214    z_stream strm;
215    unsigned char in[CHUNK];
216    unsigned char out[CHUNK];
217   
218    /* allocate inflate state */
219    strm.zalloc = Z_NULL;
220    strm.zfree = Z_NULL;
221    strm.opaque = Z_NULL;
222    strm.avail_in = 0;
223    strm.next_in = Z_NULL;
224    ret = inflateInit2(&strm,
225                       15 + 32 // autodected zlib or gzip header
226                       );
227    if (ret != Z_OK)
228    {
229        osg::notify(osg::INFO)<<"failed to init"<<std::endl;
230        return ret != 0;
231    }
232   
233    /* decompress until deflate stream ends or end of file */
234    do {
235        //strm.avail_in = fin.readsome((char*)in, CHUNK);
236        fin.read((char *)in, CHUNK);
237        strm.avail_in = fin.gcount();
238       
239        if (strm.avail_in == 0)
240        {
241            break;
242        }
243        strm.next_in = in;
244
245        /* run inflate() on input until output buffer not full */
246        do {
247            strm.avail_out = CHUNK;
248            strm.next_out = out;
249            ret = inflate(&strm, Z_NO_FLUSH);
250
251            switch (ret) {
252            case Z_NEED_DICT:
253            case Z_DATA_ERROR:
254            case Z_MEM_ERROR:
255                (void)inflateEnd(&strm);
256                return false;
257            }
258            have = CHUNK - strm.avail_out;
259
260            destination.append((char*)out, have);
261           
262        } while (strm.avail_out == 0);
263
264        /* done when inflate() says it's done */
265    } while (ret != Z_STREAM_END);
266
267    /* clean up and return */
268    (void)inflateEnd(&strm);
269   
270    return ret == Z_STREAM_END ? true : false;
271}
272#else
273bool DataInputStream::uncompress(std::istream& fin, std::string& destination) const
274{
275    return false;
276}
277#endif
278
279bool DataInputStream::readBool(){
280    char c;
281    _istream->read(&c, CHARSIZE);
282
283    if (_istream->rdstate() & _istream->failbit)
284        throw Exception("DataInputStream::readBool(): Failed to read boolean value.");
285
286    if (_verboseOutput) std::cout<<"read/writeBool() ["<<(int)c<<"]"<<std::endl;
287
288    return c!=0;
289}
290
291char DataInputStream::readChar(){
292    char c;
293    _istream->read(&c, CHARSIZE);
294
295    if (_istream->rdstate() & _istream->failbit)
296        throw Exception("DataInputStream::readChar(): Failed to read char value.");
297
298    if (_verboseOutput) std::cout<<"read/writeChar() ["<<(int)c<<"]"<<std::endl;
299
300    return c;
301}
302
303unsigned char DataInputStream::readUChar(){
304    unsigned char c;
305    _istream->read((char*)&c, CHARSIZE);
306
307    if (_istream->rdstate() & _istream->failbit)
308        throw Exception("DataInputStream::readUChar(): Failed to read unsigned char value.");
309
310    if (_verboseOutput) std::cout<<"read/writeUChar() ["<<(int)c<<"]"<<std::endl;
311
312    return c;
313}
314
315unsigned short DataInputStream::readUShort(){
316    unsigned short s;
317    _istream->read((char*)&s, SHORTSIZE);
318    if (_istream->rdstate() & _istream->failbit)
319        throw Exception("DataInputStream::readUShort(): Failed to read unsigned short value.");
320
321    if (_verboseOutput) std::cout<<"read/writeUShort() ["<<s<<"]"<<std::endl;
322
323    if (_byteswap) osg::swapBytes((char *)&s,SHORTSIZE);
324
325    return s;
326}
327
328unsigned int DataInputStream::readUInt(){
329    unsigned int s;
330    _istream->read((char*)&s, INTSIZE);
331
332    if (_istream->rdstate() & _istream->failbit)
333        throw Exception("DataInputStream::readUInt(): Failed to read unsigned int value.");
334
335    if (_byteswap) osg::swapBytes((char *)&s,INTSIZE) ;
336
337    if (_verboseOutput) std::cout<<"read/writeUInt() ["<<s<<"]"<<std::endl;
338
339    return s;
340}
341
342int DataInputStream::readInt(){
343    if(_peeking){
344        _peeking = false;
345        return _peekValue;
346    }
347    int i;
348    _istream->read((char*)&i, INTSIZE);
349
350    // comment out for time being as this check seems to eroneously cause a
351    // premature exit when reading .ive files under OSX!#?:!
352    // Robet Osfield, September 12th 2003.
353    // if (_istream->rdstate() & _istream->failbit)
354    //    throw Exception("DataInputStream::readInt(): Failed to read int value.");
355
356
357    if (_byteswap) osg::swapBytes((char *)&i,INTSIZE) ;
358
359    if (_verboseOutput) std::cout<<"read/writeInt() ["<<i<<"]"<<std::endl;
360
361    return i;
362}
363
364/**
365 * Read an integer from the stream, but
366 * save it such that the next readInt call will
367 * return the same integer.
368 */
369int DataInputStream::peekInt(){
370    if(_peeking){
371        return _peekValue;
372    }
373    _peekValue  = readInt();
374    _peeking = true;
375    return _peekValue;
376}
377
378float DataInputStream::readFloat(){
379    float f;
380    _istream->read((char*)&f, FLOATSIZE);
381    if (_istream->rdstate() & _istream->failbit)
382        throw Exception("DataInputStream::readFloat(): Failed to read float value.");
383
384    if (_byteswap) osg::swapBytes((char *)&f,FLOATSIZE) ;
385
386    if (_verboseOutput) std::cout<<"read/writeFloat() ["<<f<<"]"<<std::endl;
387    return f;
388}
389
390long DataInputStream::readLong(){
391    long l;
392    _istream->read((char*)&l, LONGSIZE);
393    if (_istream->rdstate() & _istream->failbit)
394        throw Exception("DataInputStream::readLong(): Failed to read long value.");
395
396    if (_byteswap) osg::swapBytes((char *)&l,LONGSIZE) ;
397
398    if (_verboseOutput) std::cout<<"read/writeLong() ["<<l<<"]"<<std::endl;
399    return l;
400}
401
402unsigned long DataInputStream::readULong(){
403    unsigned long l;
404    _istream->read((char*)&l, LONGSIZE);
405    if (_istream->rdstate() & _istream->failbit)
406        throw Exception("DataInputStream::readULong(): Failed to read unsigned long value.");
407
408    if (_byteswap) osg::swapBytes((char *)&l,LONGSIZE) ;
409
410    if (_verboseOutput) std::cout<<"read/writeULong() ["<<l<<"]"<<std::endl;
411
412    return l;
413}
414
415double DataInputStream::readDouble()
416{
417    double d;
418    _istream->read((char*)&d, DOUBLESIZE);
419    if (_istream->rdstate() & _istream->failbit)
420        throw Exception("DataInputStream::readDouble(): Failed to read double value.");
421
422    if (_byteswap) osg::swapBytes((char *)&d,DOUBLESIZE) ;
423    if (_verboseOutput) std::cout<<"read/writeDouble() ["<<d<<"]"<<std::endl;
424    return d;
425}
426
427std::string DataInputStream::readString()
428{
429    std::string s;
430    int size = readInt();
431    if (size != 0)
432    {
433        s.resize(size);
434        _istream->read((char*)s.c_str(), size);
435        //if (_istream->rdstate() & _istream->failbit)
436        //   throw Exception("DataInputStream::readString(): Failed to read string value.");
437
438        if (_verboseOutput) std::cout<<"read/writeString() ["<<s<<"]"<<std::endl;
439    }
440
441    return s;
442}
443
444void DataInputStream::readCharArray(char* data, int size)
445{
446    _istream->read(data, size);
447    if (_istream->rdstate() & _istream->failbit)
448        throw Exception("DataInputStream::readCharArray(): Failed to read char value.");
449
450    if (_verboseOutput) std::cout<<"read/writeCharArray() ["<<data<<"]"<<std::endl;
451}
452
453osg::Vec2 DataInputStream::readVec2()
454{
455    osg::Vec2 v;
456    v.x()=readFloat();
457    v.y()=readFloat();
458
459    if (_verboseOutput) std::cout<<"read/writeVec2() ["<<v<<"]"<<std::endl;
460
461    return v;
462}
463
464osg::Vec3 DataInputStream::readVec3(){
465    osg::Vec3 v;
466    v.x()=readFloat();
467    v.y()=readFloat();
468    v.z()=readFloat();
469
470    if (_verboseOutput) std::cout<<"read/writeVec3() ["<<v<<"]"<<std::endl;
471
472    return v;
473}
474
475osg::Vec4 DataInputStream::readVec4(){
476    osg::Vec4 v;
477    v.x()=readFloat();
478    v.y()=readFloat();
479    v.z()=readFloat();
480    v.w()=readFloat();
481
482    if (_verboseOutput) std::cout<<"read/writeVec4() ["<<v<<"]"<<std::endl;
483
484    return v;
485}
486osg::Vec2d DataInputStream::readVec2d()
487{
488    osg::Vec2d v;
489    v.x()=readDouble();
490    v.y()=readDouble();
491
492    if (_verboseOutput) std::cout<<"read/writeVec2d() ["<<v<<"]"<<std::endl;
493
494    return v;
495}
496
497osg::Vec3d DataInputStream::readVec3d(){
498    osg::Vec3d v;
499    v.x()=readDouble();
500    v.y()=readDouble();
501    v.z()=readDouble();
502
503    if (_verboseOutput) std::cout<<"read/writeVec3d() ["<<v<<"]"<<std::endl;
504
505    return v;
506}
507
508osg::Vec4d DataInputStream::readVec4d(){
509    osg::Vec4d v;
510    v.x()=readDouble();
511    v.y()=readDouble();
512    v.z()=readDouble();
513    v.w()=readDouble();
514
515    if (_verboseOutput) std::cout<<"read/writeVec4d() ["<<v<<"]"<<std::endl;
516
517    return v;
518}
519
520osg::Plane DataInputStream::readPlane(){
521    osg::Plane v;
522
523    if (getVersion() <= VERSION_0018)
524    {
525        v[0]=readFloat();
526        v[1]=readFloat();
527        v[2]=readFloat();
528        v[3]=readFloat();
529    }
530    else
531    {
532        // assume double for planes even if Plane::value_type is float
533        // to ensure that the .ive format does vary.
534        v[0]=readDouble();
535        v[1]=readDouble();
536        v[2]=readDouble();
537        v[3]=readDouble();
538    }
539
540    if (_verboseOutput) std::cout<<"read/writePlane() ["<<v<<"]"<<std::endl;
541
542    return v;
543}
544
545osg::Vec4ub DataInputStream::readVec4ub(){
546    osg::Vec4ub v;
547    v.r()=readChar();
548    v.g()=readChar();
549    v.b()=readChar();
550    v.a()=readChar();
551
552    if (_verboseOutput) std::cout<<"read/writeVec4ub() ["<<v<<"]"<<std::endl;
553
554    return v;
555}
556
557osg::Quat DataInputStream::readQuat(){
558    osg::Quat q;
559    q.x()=readFloat();
560    q.y()=readFloat();
561    q.z()=readFloat();
562    q.w()=readFloat();
563
564    if (_verboseOutput) std::cout<<"read/writeQuat() ["<<q<<"]"<<std::endl;
565
566    return q;
567}
568
569
570
571
572osg::Geometry::AttributeBinding DataInputStream::readBinding(){
573    char c = readChar();
574
575    if (_verboseOutput) std::cout<<"read/writeBinding() ["<<(int)c<<"]"<<std::endl;
576
577    switch((int)c){
578        case 0:    return osg::Geometry::BIND_OFF;
579        case 1: return osg::Geometry::BIND_OVERALL;
580        case 2: return osg::Geometry::BIND_PER_PRIMITIVE;
581        case 3: return osg::Geometry::BIND_PER_PRIMITIVE_SET;
582        case 4: return osg::Geometry::BIND_PER_VERTEX;
583        default: throw Exception("Unknown binding type in DataInputStream::readBinding()");
584    }
585}
586
587osg::Array* DataInputStream::readArray(){
588    char c = readChar();
589    switch((int)c){
590        case 0: return readIntArray();
591        case 1: return readUByteArray();
592        case 2: return readUShortArray();
593        case 3: return readUIntArray();
594        case 4: return readVec4ubArray();
595        case 5: return readFloatArray();
596        case 6:    return readVec2Array();
597        case 7:    return readVec3Array();
598        case 8:    return readVec4Array();
599        case 9:    return readVec2sArray();
600        case 10:   return readVec3sArray();
601        case 11:   return readVec4sArray();
602        case 12:   return readVec2bArray();
603        case 13:   return readVec3bArray();
604        case 14:   return readVec4bArray();
605        case 15:   return readVec2dArray();
606        case 16:   return readVec3dArray();
607        case 17:   return readVec4dArray();
608        default: throw Exception("Unknown array type in DataInputStream::readArray()");
609    }
610}
611
612osg::IntArray* DataInputStream::readIntArray()
613{
614    int size = readInt();
615    if (size == 0)
616        return NULL;
617    osg::IntArray* a = new osg::IntArray(size);
618
619    _istream->read((char*)&((*a)[0]), INTSIZE*size);
620
621    if (_istream->rdstate() & _istream->failbit)
622        throw Exception("DataInputStream::readIntArray(): Failed to read Int array.");
623
624    if (_verboseOutput) std::cout<<"read/writeIntArray() ["<<size<<"]"<<std::endl;
625
626    if (_byteswap) {
627       for (int  i = 0 ; i < size ; i++ ) osg::swapBytes((char *)&((*a)[i]),INTSIZE) ;
628    }
629
630    return a;
631}
632
633osg::UByteArray* DataInputStream::readUByteArray()
634{
635    int size = readInt();
636    if (size == 0)
637        return NULL;
638    osg::UByteArray* a = new osg::UByteArray(size);
639
640    _istream->read((char*)&((*a)[0]), CHARSIZE*size);
641
642    if (_istream->rdstate() & _istream->failbit)
643        throw Exception("DataInputStream::readUByteArray(): Failed to read UByte array.");
644
645    if (_verboseOutput) std::cout<<"read/writeUByteArray() ["<<size<<"]"<<std::endl;
646
647    return a;
648}
649
650osg::UShortArray* DataInputStream::readUShortArray()
651{
652    int size = readInt();
653    if (size == 0)
654        return NULL;
655    osg::UShortArray* a = new osg::UShortArray(size);
656
657    _istream->read((char*)&((*a)[0]), SHORTSIZE*size);
658
659    if (_istream->rdstate() & _istream->failbit)
660        throw Exception("DataInputStream::readUShortArray(): Failed to read UShort array.");
661
662    if (_verboseOutput) std::cout<<"read/writeUShortArray() ["<<size<<"]"<<std::endl;
663
664    if (_byteswap)
665    {
666        for (int i = 0 ; i < size ; i++ )
667            osg::swapBytes((char *)&((*a)[i]),SHORTSIZE) ;
668    }
669    return a;
670}
671
672osg::UIntArray* DataInputStream::readUIntArray()
673{
674    int size = readInt();
675    if (size == 0)
676        return NULL;
677    osg::UIntArray* a = new osg::UIntArray(size);
678
679    _istream->read((char*)&((*a)[0]), INTSIZE*size);
680
681    if (_istream->rdstate() & _istream->failbit)
682        throw Exception("DataInputStream::readUIntArray(): Failed to read UInt array.");
683
684    if (_verboseOutput) std::cout<<"read/writeUIntArray() ["<<size<<"]"<<std::endl;
685
686    if (_byteswap)
687    {
688        for (int i = 0 ; i < size ; i++ )
689            osg::swapBytes((char *)&((*a)[i]),INTSIZE) ;
690    }
691    return a;
692}
693
694osg::Vec4ubArray* DataInputStream::readVec4ubArray()
695{
696    int size = readInt();
697    if (size == 0)
698        return NULL;
699    osg::Vec4ubArray* a = new osg::Vec4ubArray(size);
700
701    _istream->read((char*)&((*a)[0]), INTSIZE*size);
702
703    if (_istream->rdstate() & _istream->failbit)
704        throw Exception("DataInputStream::readVec4ubArray(): Failed to read Vec4ub array.");
705
706    if (_verboseOutput) std::cout<<"read/writeVec4ubArray() ["<<size<<"]"<<std::endl;
707
708    return a;
709}
710
711bool DataInputStream::readPackedFloatArray(osg::FloatArray* a)
712{
713    int size = readInt();
714
715    a->resize(size);       
716
717    if (size == 0)
718        return true;
719
720    if (readBool())
721    {
722        float value = readFloat();
723       
724        for(int i=0; i<size; ++i)
725        {
726            (*a)[i] = value;
727        }
728    }
729    else
730    {
731        int packingSize = readInt();
732       
733        if (packingSize==1)
734        {
735            float minValue = readFloat();
736            float maxValue = readFloat();
737
738            float byteMultiplier = 255.0f/(maxValue-minValue);
739            float byteInvMultiplier = 1.0f/byteMultiplier;
740
741            for(int i=0; i<size; ++i)
742            {
743                unsigned char byte_value = readUChar();
744                float value = minValue + float(byte_value)*byteInvMultiplier;
745                (*a)[i] = value;
746            }
747        }
748        else if (packingSize==2)
749        {
750            float minValue = readFloat();
751            float maxValue = readFloat();
752
753            float shortMultiplier = 65535.0f/(maxValue-minValue);
754            float shortInvMultiplier = 1.0f/shortMultiplier;
755
756            for(int i=0; i<size; ++i)
757            {
758                unsigned short short_value = readUShort();
759                float value = minValue + float(short_value)*shortInvMultiplier;
760                (*a)[i] = value;
761            }
762        }
763        else
764        {
765            for(int i=0; i<size; ++i)
766            {
767                (*a)[i] = readFloat();
768            }
769        }       
770    }
771   
772    if (_istream->rdstate() & _istream->failbit)
773        throw Exception("DataInputStream::readFloatArray(): Failed to read float array.");
774
775    if (_verboseOutput) std::cout<<"read/writeFloatArray() ["<<size<<"]"<<std::endl;
776
777    return true;
778}
779
780
781osg::FloatArray* DataInputStream::readFloatArray()
782{
783    int size = readInt();
784    if (size == 0)
785        return NULL;
786
787    osg::FloatArray* a = new osg::FloatArray(size);
788
789    _istream->read((char*)&((*a)[0]), FLOATSIZE*size);
790
791    if (_istream->rdstate() & _istream->failbit)
792        throw Exception("DataInputStream::readFloatArray(): Failed to read float array.");
793
794    if (_verboseOutput) std::cout<<"read/writeFloatArray() ["<<size<<"]"<<std::endl;
795
796    if (_byteswap)
797    {
798        for (int i = 0 ; i < size ; i++ )
799            osg::swapBytes((char *)&((*a)[i]),FLOATSIZE) ;
800    }
801    return a;
802}
803
804osg::Vec2Array* DataInputStream::readVec2Array()
805{
806    int size = readInt();
807    if (size == 0)
808        return NULL;
809
810    osg::Vec2Array* a = new osg::Vec2Array(size);
811
812    _istream->read((char*)&((*a)[0]), FLOATSIZE*2*size);
813
814    if (_istream->rdstate() & _istream->failbit)
815        throw Exception("DataInputStream::readVec2Array(): Failed to read Vec2 array.");
816
817    if (_verboseOutput) std::cout<<"read/writeVec2Array() ["<<size<<"]"<<std::endl;
818
819    if (_byteswap)
820    {
821       float *ptr = (float*)&((*a)[0]) ;
822       for (int i = 0 ; i < size*2 ; i++ )
823       {
824          osg::swapBytes((char *)&(ptr[i]), FLOATSIZE) ;
825       }
826    }
827    return a;
828}
829
830osg::Vec3Array* DataInputStream::readVec3Array()
831{
832    int size = readInt();
833    if (size == 0)
834        return NULL;
835    osg::Vec3Array* a = new osg::Vec3Array(size);
836
837    _istream->read((char*)&((*a)[0]), FLOATSIZE*3*size);
838
839    if (_istream->rdstate() & _istream->failbit)
840        throw Exception("DataInputStream::readVec3Array(): Failed to read Vec3 array.");
841
842    if (_verboseOutput) std::cout<<"read/writeVec3Array() ["<<size<<"]"<<std::endl;
843
844
845    if (_byteswap)
846    {
847       float *ptr = (float*)&((*a)[0]) ;
848       for (int i = 0 ; i < size*3 ; i++ )
849       {
850          osg::swapBytes((char *)&(ptr[i]),FLOATSIZE) ;
851       }
852    }
853    return a;
854}
855
856osg::Vec4Array* DataInputStream::readVec4Array(){
857    int size = readInt();
858    if (size == 0)
859        return NULL;
860    osg::Vec4Array* a = new osg::Vec4Array(size);
861
862    _istream->read((char*)&((*a)[0]), FLOATSIZE*4*size);
863
864    if (_istream->rdstate() & _istream->failbit)
865        throw Exception("DataInputStream::readVec4Array(): Failed to read Vec4 array.");
866
867    if (_verboseOutput) std::cout<<"read/writeVec4Array() ["<<size<<"]"<<std::endl;
868
869    if (_byteswap) {
870       float *ptr = (float*)&((*a)[0]) ;
871       for (int i = 0 ; i < size*4 ; i++ ) {
872          osg::swapBytes((char *)&(ptr[i]),FLOATSIZE) ;
873       }
874    }
875    return a;
876}
877
878osg::Vec2bArray* DataInputStream::readVec2bArray()
879{
880    int size = readInt();
881    if (size == 0)
882        return NULL;
883    osg::Vec2bArray* a = new osg::Vec2bArray(size);
884
885    _istream->read((char*)&((*a)[0]), CHARSIZE * 2 * size);
886
887    if (_istream->rdstate() & _istream->failbit)
888        throw Exception("DataInputStream::readVec2bArray(): Failed to read Vec2b array.");
889
890    if (_verboseOutput) std::cout<<"read/writeVec2bArray() ["<<size<<"]"<<std::endl;
891
892    return a;
893}
894
895osg::Vec3bArray* DataInputStream::readVec3bArray()
896{
897    int size = readInt();
898    if (size == 0)
899        return NULL;
900    osg::Vec3bArray* a = new osg::Vec3bArray(size);
901
902    _istream->read((char*)&((*a)[0]), CHARSIZE * 3 * size);
903
904    if (_istream->rdstate() & _istream->failbit)
905        throw Exception("DataInputStream::readVec3bArray(): Failed to read Vec3b array.");
906
907    if (_verboseOutput) std::cout<<"read/writeVec3bArray() ["<<size<<"]"<<std::endl;
908
909    return a;
910}
911
912osg::Vec4bArray* DataInputStream::readVec4bArray()
913{
914    int size = readInt();
915    if (size == 0)
916        return NULL;
917    osg::Vec4bArray* a = new osg::Vec4bArray(size);
918
919    _istream->read((char*)&((*a)[0]), CHARSIZE * 4 * size);
920
921    if (_istream->rdstate() & _istream->failbit)
922        throw Exception("DataInputStream::readVec4bArray(): Failed to read Vec4b array.");
923
924    if (_verboseOutput) std::cout<<"read/writeVec4bArray() ["<<size<<"]"<<std::endl;
925
926    return a;
927}
928
929osg::Vec2sArray* DataInputStream::readVec2sArray()
930{
931    int size = readInt();
932    if (size == 0)
933        return NULL;
934    osg::Vec2sArray* a = new osg::Vec2sArray(size);
935
936    _istream->read((char*)&((*a)[0]), SHORTSIZE * 2 * size);
937
938    if (_istream->rdstate() & _istream->failbit)
939        throw Exception("DataInputStream::readVec2sArray(): Failed to read Vec2s array.");
940
941    if (_verboseOutput) std::cout<<"read/writeVec2sArray() ["<<size<<"]"<<std::endl;
942
943    if (_byteswap)
944    {
945       short *ptr = (short*)&((*a)[0]) ;
946       for (int i = 0 ; i < size*2 ; i++ )
947       {
948          osg::swapBytes((char *)&(ptr[i]), SHORTSIZE) ;
949       }
950    }
951
952    return a;
953}
954
955osg::Vec3sArray* DataInputStream::readVec3sArray()
956{
957    int size = readInt();
958    if (size == 0)
959        return NULL;
960    osg::Vec3sArray* a = new osg::Vec3sArray(size);
961
962    _istream->read((char*)&((*a)[0]), SHORTSIZE * 3 * size);
963
964    if (_istream->rdstate() & _istream->failbit)
965        throw Exception("DataInputStream::readVec3sArray(): Failed to read Vec3s array.");
966
967    if (_verboseOutput) std::cout<<"read/writeVec3sArray() ["<<size<<"]"<<std::endl;
968
969
970    if (_byteswap)
971    {
972       short *ptr = (short*)&((*a)[0]) ;
973       for (int i = 0 ; i < size*3 ; i++ )
974       {
975          osg::swapBytes((char *)&(ptr[i]), SHORTSIZE) ;
976       }
977    }
978
979    return a;
980}
981
982osg::Vec4sArray* DataInputStream::readVec4sArray()
983{
984    int size = readInt();
985    if (size == 0)
986        return NULL;
987    osg::Vec4sArray* a = new osg::Vec4sArray(size);
988
989    _istream->read((char*)&((*a)[0]), SHORTSIZE * 4 * size);
990
991    if (_istream->rdstate() & _istream->failbit)
992        throw Exception("DataInputStream::readVec4sArray(): Failed to read Vec4s array.");
993
994    if (_verboseOutput) std::cout<<"read/writeVec4sArray() ["<<size<<"]"<<std::endl;
995
996    if (_byteswap)
997    {
998       short *ptr = (short*)&((*a)[0]) ;
999       for (int i = 0 ; i < size*4 ; i++ )
1000       {
1001          osg::swapBytes((char *)&(ptr[i]), SHORTSIZE) ;
1002       }
1003    }
1004
1005    return a;
1006}
1007
1008osg::Vec2dArray* DataInputStream::readVec2dArray()
1009{
1010    int size = readInt();
1011    if (size == 0)
1012        return NULL;
1013
1014    osg::Vec2dArray* a = new osg::Vec2dArray(size);
1015
1016    _istream->read((char*)&((*a)[0]), DOUBLESIZE*2*size);
1017
1018    if (_istream->rdstate() & _istream->failbit)
1019        throw Exception("DataInputStream::readVec2dArray(): Failed to read Vec2d array.");
1020
1021    if (_verboseOutput) std::cout<<"read/writeVec2dArray() ["<<size<<"]"<<std::endl;
1022
1023    if (_byteswap)
1024    {
1025       double *ptr = (double*)&((*a)[0]) ;
1026       for (int i = 0 ; i < size*2 ; i++ )
1027       {
1028          osg::swapBytes((char *)&(ptr[i]), DOUBLESIZE) ;
1029       }
1030    }
1031    return a;
1032}
1033
1034osg::Vec3dArray* DataInputStream::readVec3dArray()
1035{
1036    int size = readInt();
1037    if (size == 0)
1038        return NULL;
1039    osg::Vec3dArray* a = new osg::Vec3dArray(size);
1040
1041    _istream->read((char*)&((*a)[0]), DOUBLESIZE*3*size);
1042
1043    if (_istream->rdstate() & _istream->failbit)
1044        throw Exception("DataInputStream::readVec3dArray(): Failed to read Vec3d array.");
1045
1046    if (_verboseOutput) std::cout<<"read/writeVec3dArray() ["<<size<<"]"<<std::endl;
1047
1048
1049    if (_byteswap)
1050    {
1051       double *ptr = (double*)&((*a)[0]) ;
1052       for (int i = 0 ; i < size*3 ; i++ )
1053       {
1054          osg::swapBytes((char *)&(ptr[i]),DOUBLESIZE) ;
1055       }
1056    }
1057    return a;
1058}
1059
1060osg::Vec4dArray* DataInputStream::readVec4dArray(){
1061    int size = readInt();
1062    if (size == 0)
1063        return NULL;
1064    osg::Vec4dArray* a = new osg::Vec4dArray(size);
1065
1066    _istream->read((char*)&((*a)[0]), DOUBLESIZE*4*size);
1067
1068    if (_istream->rdstate() & _istream->failbit)
1069        throw Exception("DataInputStream::readVec4dArray(): Failed to read Vec4d array.");
1070
1071    if (_verboseOutput) std::cout<<"read/writeVec4dArray() ["<<size<<"]"<<std::endl;
1072
1073    if (_byteswap) {
1074       double *ptr = (double*)&((*a)[0]) ;
1075       for (int i = 0 ; i < size*4 ; i++ ) {
1076          osg::swapBytes((char *)&(ptr[i]),DOUBLESIZE) ;
1077       }
1078    }
1079    return a;
1080}
1081
1082osg::Matrixf DataInputStream::readMatrixf()
1083{
1084    osg::Matrixf mat;
1085    for(int r=0;r<4;r++)
1086    {
1087        for(int c=0;c<4;c++)
1088        {
1089            mat(r,c) = readFloat();
1090        }
1091    }
1092
1093    if (_istream->rdstate() & _istream->failbit)
1094        throw Exception("DataInputStream::readMatrix(): Failed to read Matrix array.");
1095
1096    if (_verboseOutput) std::cout<<"read/writeMatrix() ["<<mat<<"]"<<std::endl;
1097
1098
1099    return mat;
1100}
1101
1102osg::Matrixd DataInputStream::readMatrixd()
1103{
1104    osg::Matrixd mat;
1105    for(int r=0;r<4;r++)
1106    {
1107        for(int c=0;c<4;c++)
1108        {
1109            mat(r,c) = readDouble();
1110        }
1111    }
1112
1113    if (_istream->rdstate() & _istream->failbit)
1114        throw Exception("DataInputStream::readMatrix(): Failed to read Matrix array.");
1115
1116    if (_verboseOutput) std::cout<<"read/writeMatrix() ["<<mat<<"]"<<std::endl;
1117
1118
1119    return mat;
1120}
1121
1122osg::Image* DataInputStream::readImage(std::string filename)
1123{
1124    // If image is already read and in list
1125    // then just return pointer to this.
1126    ImageMap::iterator mitr=_imageMap.find(filename);
1127    if (mitr!=_imageMap.end()) return mitr->second.get();
1128
1129    // Image is not in list.
1130    // Read it from disk,
1131    osg::ref_ptr<osg::Image> image = osgDB::readRefImageFile(filename.c_str(),_options.get());
1132
1133    // add it to the imageList,
1134    _imageMap[filename] = image;
1135    // and return image pointer.
1136
1137    if (_verboseOutput) std::cout<<"read/writeImage() ["<<image<<"]"<<std::endl;
1138
1139    return image.release();
1140}
1141
1142osg::Image* DataInputStream::readImage()
1143{
1144    if ( getVersion() >= VERSION_0029 )
1145    {
1146        int id = peekInt();
1147        if(id == IVEIMAGESEQUENCE)
1148        {
1149            osg::ImageSequence* image = new osg::ImageSequence();
1150            ((ive::ImageSequence*)image)->read(this);
1151            return image;
1152        }
1153        else
1154        {
1155            readInt();
1156            IncludeImageMode includeImg = (IncludeImageMode)readChar();
1157            return readImage(includeImg);
1158        }
1159    }
1160    else
1161    {
1162        IncludeImageMode includeImg = (IncludeImageMode)readChar();
1163        return readImage(includeImg);
1164    }
1165}
1166
1167osg::Image* DataInputStream::readImage(IncludeImageMode mode)
1168{
1169    switch(mode) {
1170        case IMAGE_INCLUDE_DATA:
1171            // Read image data from stream
1172            if(readBool())
1173            {
1174                osg::Image* image = new osg::Image();
1175                ((ive::Image*)image)->read(this);
1176                return image;
1177            }
1178            break;
1179        case IMAGE_REFERENCE_FILE:
1180            // Only read image name from stream.
1181            {
1182                std::string filename = readString();
1183                if(!filename.empty()){
1184                    return readImage(filename);
1185                }
1186            }
1187            break;
1188        case IMAGE_INCLUDE_FILE:
1189        case IMAGE_COMPRESS_DATA:
1190            // Read image file from stream
1191            {
1192                std::string filename = readString();
1193                int size = readInt();
1194                if(filename.compare("")!=0 && size > 0){
1195
1196                    //Read in file
1197                    char *buffer = new char[size];
1198                    readCharArray(buffer,size);
1199
1200                    //Get ReaderWriter from file extension
1201                    std::string ext = osgDB::getFileExtension(filename);
1202                    osgDB::ReaderWriter *reader = osgDB::Registry::instance()->getReaderWriterForExtension(ext);
1203
1204                    osgDB::ReaderWriter::ReadResult rr;
1205                    if(reader) {
1206                        //Convert data to istream
1207                        std::stringstream inputStream;
1208                        inputStream.write(buffer,size);
1209
1210                        //Attempt to read the image
1211                        rr = reader->readImage(inputStream,_options.get());
1212                    }
1213
1214                    //Delete buffer
1215                    delete [] buffer;
1216
1217                    //Return result
1218                    if(rr.validImage()) {
1219                        return rr.takeImage();
1220                    }
1221                }
1222            }
1223            break;
1224        default:
1225            throw Exception("DataInputStream::readImage(): Invalid IncludeImageMode value.");
1226            break;
1227    }
1228    return 0;
1229}
1230
1231osg::StateSet* DataInputStream::readStateSet()
1232{
1233    // Read statesets unique ID.
1234    int id = readInt();
1235    // See if stateset is already in the list.
1236    StateSetMap::iterator itr= _statesetMap.find(id);
1237    if (itr!=_statesetMap.end()) return itr->second.get();
1238
1239    // StateSet is not in list.
1240    // Create a new stateset,
1241    osg::StateSet* stateset = new osg::StateSet();
1242
1243    // read its properties from stream
1244    ((ive::StateSet*)(stateset))->read(this);
1245
1246    // and add it to the stateset map,
1247    _statesetMap[id] = stateset;
1248
1249
1250    if (_verboseOutput) std::cout<<"read/writeStateSet() ["<<id<<"]"<<std::endl;
1251
1252    return stateset;
1253}
1254
1255osg::StateAttribute* DataInputStream::readStateAttribute()
1256{
1257    // Read stateattributes unique ID.
1258    int id = readInt();
1259    // See if stateattribute is already in the list.
1260    StateAttributeMap::iterator itr= _stateAttributeMap.find(id);
1261    if (itr!=_stateAttributeMap.end()) return itr->second.get();
1262
1263    // stateattribute is not in list.
1264    // Create a new stateattribute,
1265
1266
1267    osg::StateAttribute* attribute;
1268    int attributeID = peekInt();
1269    if(attributeID == IVEALPHAFUNC){
1270        attribute = new osg::AlphaFunc();
1271        ((ive::AlphaFunc*)(attribute))->read(this);
1272    }
1273    else if(attributeID == IVEBLENDCOLOR){
1274        attribute = new osg::BlendColor();
1275        ((ive::BlendColor*)(attribute))->read(this);
1276    }
1277    else if(attributeID == IVEBLENDFUNC ||
1278            attributeID == IVEBLENDFUNCSEPARATE){
1279        attribute = new osg::BlendFunc();
1280        ((ive::BlendFunc*)(attribute))->read(this);
1281    }
1282    else if(attributeID == IVEBLENDEQUATION){
1283        attribute = new osg::BlendEquation();
1284        ((ive::BlendEquation*)(attribute))->read(this);
1285    }
1286    else if(attributeID == IVEDEPTH){
1287        attribute = new osg::Depth();
1288        ((ive::Depth*)(attribute))->read(this);
1289    }
1290    else if(attributeID == IVEVIEWPORT){
1291        attribute = new osg::Viewport();
1292        ((ive::Viewport*)(attribute))->read(this);
1293    }
1294    else if(attributeID == IVESCISSOR){
1295        attribute = new osg::Scissor();
1296        ((ive::Scissor*)(attribute))->read(this);
1297    }
1298    else if(attributeID == IVEMATERIAL){
1299        attribute = new osg::Material();
1300        ((ive::Material*)(attribute))->read(this);
1301    }
1302    else if(attributeID == IVECULLFACE){
1303        attribute = new osg::CullFace();
1304        ((ive::CullFace*)(attribute))->read(this);
1305    }
1306    else if(attributeID == IVECOLORMASK){
1307        attribute = new osg::ColorMask();
1308        ((ive::ColorMask*)(attribute))->read(this);
1309    }
1310    else if(attributeID == IVECLIPPLANE){
1311        attribute = new osg::ClipPlane();
1312        ((ive::ClipPlane*)(attribute))->read(this);
1313    }
1314    else if(attributeID == IVEPOLYGONOFFSET){
1315        attribute = new osg::PolygonOffset();
1316        ((ive::PolygonOffset*)(attribute))->read(this);
1317    }
1318    else if(attributeID == IVEPOLYGONMODE){
1319        attribute = new osg::PolygonMode();
1320        ((ive::PolygonMode*)(attribute))->read(this);
1321    }
1322    else if(attributeID == IVESHADEMODEL){
1323        attribute = new osg::ShadeModel();
1324        ((ive::ShadeModel*)(attribute))->read(this);
1325    }
1326    else if(attributeID == IVEPOINT){
1327        attribute = new osg::Point();
1328        ((ive::Point*)(attribute))->read(this);
1329    }
1330    else if(attributeID == IVELINEWIDTH){
1331        attribute = new osg::LineWidth();
1332        ((ive::LineWidth*)(attribute))->read(this);
1333    }
1334    else if(attributeID == IVETEXTURE1D){
1335        attribute = new osg::Texture1D();
1336        ((ive::Texture1D*)(attribute))->read(this);
1337    }
1338    else if(attributeID == IVETEXTURE2D){
1339        attribute = new osg::Texture2D();
1340        ((ive::Texture2D*)(attribute))->read(this);
1341    }
1342    else if(attributeID == IVETEXTURE3D){
1343        attribute = new osg::Texture3D();
1344        ((ive::Texture3D*)(attribute))->read(this);
1345    }
1346    else if(attributeID == IVETEXTURECUBEMAP){
1347        attribute = new osg::TextureCubeMap();
1348        ((ive::TextureCubeMap*)(attribute))->read(this);
1349    }
1350    else if(attributeID == IVETEXTURERECTANGLE){
1351        attribute = new osg::TextureRectangle();
1352        ((ive::TextureRectangle*)(attribute))->read(this);
1353    }
1354    else if(attributeID == IVETEXENV){
1355        attribute = new osg::TexEnv();
1356        ((ive::TexEnv*)(attribute))->read(this);
1357    }
1358    else if(attributeID == IVETEXENVCOMBINE){
1359        attribute = new osg::TexEnvCombine();
1360        ((ive::TexEnvCombine*)(attribute))->read(this);
1361    }
1362    else if(attributeID == IVETEXGEN){
1363        attribute = new osg::TexGen();
1364        ((ive::TexGen*)(attribute))->read(this);
1365    }
1366    else if(attributeID == IVETEXMAT){
1367        attribute = new osg::TexMat();
1368        ((ive::TexMat*)(attribute))->read(this);
1369    }
1370    else if(attributeID == IVEFRAGMENTPROGRAM){
1371        attribute = new osg::FragmentProgram();
1372        ((ive::FragmentProgram*)(attribute))->read(this);
1373    }
1374    else if(attributeID == IVEVERTEXPROGRAM){
1375        attribute = new osg::VertexProgram();
1376        ((ive::VertexProgram*)(attribute))->read(this);
1377    }
1378    else if(attributeID == IVELIGHTMODEL){
1379        attribute = new osg::LightModel();
1380        ((ive::LightModel*)(attribute))->read(this);
1381    }
1382    else if(attributeID == IVEFRONTFACE){
1383        attribute = new osg::FrontFace();
1384        ((ive::FrontFace*)(attribute))->read(this);
1385    }
1386    else if(attributeID == IVEPROGRAM){
1387        attribute = new osg::Program();
1388        ((ive::Program*)(attribute))->read(this);
1389    }
1390    else if(attributeID == IVEPOINTSPRITE){
1391        attribute = new osg::PointSprite();
1392        ((ive::PointSprite*)(attribute))->read(this);
1393    }
1394    else if(attributeID == IVEMULTISAMPLE){
1395        attribute = new osg::Multisample();
1396        ((ive::Multisample*)(attribute))->read(this);
1397    }
1398    else if(attributeID == IVELINESTIPPLE){
1399        attribute = new osg::LineStipple();
1400        ((ive::LineStipple*)(attribute))->read(this);
1401    }
1402    else if(attributeID == IVESTENCIL){
1403        attribute = new osg::Stencil();
1404        ((ive::Stencil*)(attribute))->read(this);
1405    }
1406    else if(attributeID == IVEFOG){
1407        attribute = new osg::Fog();
1408        ((ive::Fog*)(attribute))->read(this);
1409    }
1410    else if(attributeID == IVELIGHT){
1411        attribute = new osg::Light();
1412        ((ive::Light*)(attribute))->read(this);
1413    }
1414    else{
1415        throw Exception("Unknown StateAttribute in StateSet::read()");
1416    }
1417
1418    // and add it to the stateattribute map,
1419    _stateAttributeMap[id] = attribute;
1420
1421
1422    if (_verboseOutput) std::cout<<"read/writeStateAttribute() ["<<id<<"]"<<std::endl;
1423
1424    return attribute;
1425}
1426
1427osg::Uniform* DataInputStream::readUniform()
1428{
1429    // Read uniforms unique ID.
1430    int id = readInt();
1431    // See if uniform is already in the list.
1432    UniformMap::iterator itr= _uniformMap.find(id);
1433    if (itr!=_uniformMap.end()) return itr->second.get();
1434
1435    // Uniform is not in list.
1436    // Create a new uniform,
1437    osg::Uniform* uniform = new osg::Uniform();
1438
1439    // read its properties from stream
1440    ((ive::Uniform*)(uniform))->read(this);
1441
1442    // and add it to the uniform map,
1443    _uniformMap[id] = uniform;
1444
1445
1446    if (_verboseOutput) std::cout<<"read/writeUniform() ["<<id<<"]"<<std::endl;
1447
1448    return uniform;
1449}
1450
1451
1452osg::Shader* DataInputStream::readShader()
1453{
1454    // Read shaders unique ID.
1455    int id = readInt();
1456    // See if shader is already in the list.
1457    ShaderMap::iterator itr= _shaderMap.find(id);
1458    if (itr!=_shaderMap.end()) return itr->second.get();
1459
1460    // Shader is not in list.
1461    // Create a new shader,
1462    osg::Shader* shader = new osg::Shader();
1463
1464    // read its properties from stream
1465    ((ive::Shader*)(shader))->read(this);
1466
1467    // and add it to the shader map,
1468    _shaderMap[id] = shader;
1469
1470
1471    if (_verboseOutput) std::cout<<"read/writeShader() ["<<id<<"]"<<std::endl;
1472
1473    return shader;
1474}
1475
1476osg::Drawable* DataInputStream::readDrawable()
1477{
1478    // Read stateattributes unique ID.
1479    int id = readInt();
1480    // See if stateattribute is already in the list.
1481    DrawableMap::iterator itr= _drawableMap.find(id);
1482    if (itr!=_drawableMap.end()) return itr->second.get();
1483
1484    // stateattribute is not in list.
1485    // Create a new stateattribute,
1486
1487    int drawableTypeID = peekInt();
1488    osg::Drawable* drawable;
1489    if(drawableTypeID == IVEGEOMETRY)
1490    {
1491        drawable = new osg::Geometry();
1492        ((Geometry*)(drawable))->read(this);
1493    }
1494    else if(drawableTypeID == IVESHAPEDRAWABLE)
1495    {
1496        drawable = new osg::ShapeDrawable();
1497        ((ShapeDrawable*)(drawable))->read(this);
1498    }
1499    else if(drawableTypeID == IVETEXT){
1500        drawable = new osgText::Text();
1501        ((Text*)(drawable))->read(this);
1502    }
1503    else if(drawableTypeID == IVEFADETEXT){
1504        drawable = new osgText::FadeText();
1505        ((FadeText*)(drawable))->read(this);
1506    }
1507    else if(drawableTypeID == IVETEXT3D){
1508        drawable = new osgText::Text3D();
1509        ((Text3D*)(drawable))->read(this);
1510    }
1511    else
1512        throw Exception("Unknown drawable drawableTypeIDentification in Geode::read()");
1513
1514
1515    // and add it to the stateattribute map,
1516    _drawableMap[id] = drawable;
1517
1518
1519    if (_verboseOutput) std::cout<<"read/writeDrawable() ["<<id<<"]"<<std::endl;
1520
1521    return drawable;
1522}
1523
1524osg::Shape* DataInputStream::readShape()
1525{
1526    // Read stateattributes unique ID.
1527    int id = readInt();
1528    // See if stateattribute is already in the list.
1529    ShapeMap::iterator itr= _shapeMap.find(id);
1530    if (itr!=_shapeMap.end()) return itr->second.get();
1531
1532    // stateattribute is not in list.
1533    // Create a new stateattribute,
1534
1535    int shapeTypeID = peekInt();
1536    osg::Shape* shape;
1537    if(shapeTypeID == IVESPHERE)
1538    {
1539        shape = new osg::Sphere();
1540        ((Sphere*)(shape))->read(this);
1541    }
1542    else if(shapeTypeID == IVEBOX)
1543    {
1544        shape = new osg::Box();
1545        ((Box*)(shape))->read(this);
1546    }
1547    else if(shapeTypeID == IVECONE)
1548    {
1549        shape = new osg::Cone();
1550        ((Cone*)(shape))->read(this);
1551    }
1552    else if(shapeTypeID == IVECYLINDER)
1553    {
1554        shape = new osg::Cylinder();
1555        ((Cylinder*)(shape))->read(this);
1556    }
1557    else if(shapeTypeID == IVECAPSULE)
1558    {
1559        shape = new osg::Capsule();
1560        ((Capsule*)(shape))->read(this);
1561    }
1562    else if(shapeTypeID == IVEHEIGHTFIELD)
1563    {
1564        shape = new osg::HeightField();
1565        ((HeightField*)(shape))->read(this);
1566    }
1567    else
1568        throw Exception("Unknown shape shapeTypeIDentification in Shape::read()");
1569
1570
1571    // and add it to the stateattribute map,
1572    _shapeMap[id] = shape;
1573
1574
1575    if (_verboseOutput) std::cout<<"read/writeShape() ["<<id<<"]"<<std::endl;
1576
1577    return shape;
1578}
1579
1580osg::Node* DataInputStream::readNode()
1581{
1582    // Read node unique ID.
1583    int id = readInt();
1584    // See if node is already in the list.
1585    NodeMap::iterator itr= _nodeMap.find(id);
1586    if (itr!=_nodeMap.end()) return itr->second.get();
1587
1588    // stateattribute is not in list.
1589    // Create a new node,
1590
1591    osg::Node* node;
1592    int nodeTypeID= peekInt();
1593
1594    if(nodeTypeID== IVEMATRIXTRANSFORM){
1595        node = new osg::MatrixTransform();
1596        ((ive::MatrixTransform*)(node))->read(this);
1597    }
1598    else if(nodeTypeID== IVECAMERA){
1599        node = new osg::Camera();
1600        ((ive::Camera*)(node))->read(this);
1601    }
1602    else if(nodeTypeID== IVECAMERAVIEW){
1603        node = new osg::CameraView();
1604        ((ive::CameraView*)(node))->read(this);
1605    }
1606    else if(nodeTypeID== IVEPOSITIONATTITUDETRANSFORM){
1607        node = new osg::PositionAttitudeTransform();
1608        ((ive::PositionAttitudeTransform*)(node))->read(this);
1609    }
1610    else if(nodeTypeID== IVEAUTOTRANSFORM){
1611        node = new osg::AutoTransform();
1612        ((ive::AutoTransform*)(node))->read(this);
1613    }
1614    else if(nodeTypeID== IVEDOFTRANSFORM){
1615        node = new osgSim::DOFTransform();
1616        ((ive::DOFTransform*)(node))->read(this);
1617    }
1618    else if(nodeTypeID== IVETRANSFORM){
1619        node = new osg::Transform();
1620        ((ive::Transform*)(node))->read(this);
1621    }
1622    else if(nodeTypeID== IVELIGHTSOURCE){
1623        node = new osg::LightSource();
1624        ((ive::LightSource*)(node))->read(this);
1625    }
1626    else if(nodeTypeID== IVETEXGENNODE){
1627        node = new osg::TexGenNode();
1628        ((ive::TexGenNode*)(node))->read(this);
1629    }
1630    else if(nodeTypeID== IVECLIPNODE){
1631        node = new osg::ClipNode();
1632        ((ive::ClipNode*)(node))->read(this);
1633    }
1634    else if(nodeTypeID== IVESEQUENCE){
1635        node = new osg::Sequence();
1636        ((ive::Sequence*)(node))->read(this);
1637    }
1638    else if(nodeTypeID== IVELOD){
1639        node = new osg::LOD();
1640        ((ive::LOD*)(node))->read(this);
1641    }
1642    else if(nodeTypeID== IVEPAGEDLOD){
1643        node = new osg::PagedLOD();
1644        ((ive::PagedLOD*)(node))->read(this);
1645    }
1646    else if(nodeTypeID== IVECOORDINATESYSTEMNODE){
1647        node = new osg::CoordinateSystemNode();
1648        ((ive::CoordinateSystemNode*)(node))->read(this);
1649    }
1650    else if(nodeTypeID== IVESWITCH){
1651        node = new osg::Switch();
1652        ((ive::Switch*)(node))->read(this);
1653    }
1654    else if(nodeTypeID== IVEMULTISWITCH){
1655        node = new osgSim::MultiSwitch();
1656        ((ive::MultiSwitch*)(node))->read(this);
1657    }
1658    else if(nodeTypeID== IVEIMPOSTOR){
1659        node = new osgSim::Impostor();
1660        ((ive::Impostor*)(node))->read(this);
1661    }
1662    else if(nodeTypeID== IVEOCCLUDERNODE){
1663        node = new osg::OccluderNode();
1664        ((ive::OccluderNode*)(node))->read(this);
1665    }
1666    else if(nodeTypeID== IVEOCCLUSIONQUERYNODE){
1667        node = new osg::OcclusionQueryNode();
1668        ((ive::OcclusionQueryNode*)(node))->read(this);
1669    }
1670    else if(nodeTypeID== IVEVISIBILITYGROUP){
1671        node = new osgSim::VisibilityGroup();
1672        ((ive::VisibilityGroup*)(node))->read(this);
1673    }
1674    else if(nodeTypeID== IVEPROXYNODE){
1675        node = new osg::ProxyNode();
1676        ((ive::ProxyNode*)(node))->read(this);
1677    }
1678    else if(nodeTypeID== IVEGROUP){
1679        node = new osg::Group();
1680        ((ive::Group*)(node))->read(this);
1681    }
1682    else if(nodeTypeID== IVEBILLBOARD){
1683        node = new osg::Billboard();
1684        ((ive::Billboard*)(node))->read(this);
1685    }
1686    else if(nodeTypeID== IVEGEODE){
1687        node = new osg::Geode();
1688        ((ive::Geode*)(node))->read(this);
1689    }
1690    else if(nodeTypeID== IVELIGHTPOINTNODE){
1691        node = new osgSim::LightPointNode();
1692        ((ive::LightPointNode*)(node))->read(this);
1693    }
1694    else if(nodeTypeID== IVEMULTITEXTURECONTROL){
1695        node = new osgFX::MultiTextureControl();
1696        ((ive::MultiTextureControl*)(node))->read(this);
1697    }
1698
1699    else if(nodeTypeID== IVEANISOTROPICLIGHTING){
1700        node = new osgFX::AnisotropicLighting();
1701        ((ive::AnisotropicLighting*)(node))->read(this);
1702    }
1703    else if(nodeTypeID== IVEBUMPMAPPING){
1704        node = new osgFX::BumpMapping();
1705        ((ive::BumpMapping*)(node))->read(this);
1706    }
1707    else if(nodeTypeID== IVECARTOON){
1708        node = new osgFX::Cartoon();
1709        ((ive::Cartoon*)(node))->read(this);
1710    }
1711    else if(nodeTypeID== IVESCRIBE){
1712        node = new osgFX::Scribe();
1713        ((ive::Scribe*)(node))->read(this);
1714    }
1715    else if(nodeTypeID== IVESPECULARHIGHLIGHTS){
1716        node = new osgFX::SpecularHighlights();
1717        ((ive::SpecularHighlights*)(node))->read(this);
1718    }
1719
1720    else if(nodeTypeID== IVETERRAINTILE){
1721        node = new osgTerrain::TerrainTile();
1722        ((ive::TerrainTile*)(node))->read(this);
1723    }
1724    else{
1725        throw Exception("Unknown node identification in DataInputStream::readNode()");
1726    }
1727
1728    // and add it to the node map,
1729    _nodeMap[id] = node;
1730
1731
1732    if (_verboseOutput) std::cout<<"read/writeNode() ["<<id<<"]"<<std::endl;
1733
1734    return node;
1735}
1736
1737osgTerrain::Layer* DataInputStream::readLayer()
1738{
1739    // Read node unique ID.
1740    int id = readInt();
1741    if (id<0) return 0;
1742
1743    // See if layer is already in the list.
1744    LayerMap::iterator itr= _layerMap.find(id);
1745    if (itr!=_layerMap.end()) return itr->second.get();
1746
1747    // Layer is not in list.
1748    // Create a new Layer,
1749
1750    osgTerrain::Layer* layer = 0;
1751    int layerid = peekInt();
1752
1753    if (layerid==IVEHEIGHTFIELDLAYER)
1754    {
1755        layer = new osgTerrain::HeightFieldLayer;
1756        ((ive::HeightFieldLayer*)(layer))->read(this);
1757    }
1758    else if (layerid==IVEIMAGELAYER)
1759    {
1760        layer = new osgTerrain::ImageLayer;
1761        ((ive::ImageLayer*)(layer))->read(this);
1762    }
1763    else if (layerid==IVESWITCHLAYER)
1764    {
1765        layer = new osgTerrain::SwitchLayer;
1766        ((ive::SwitchLayer*)(layer))->read(this);
1767    }
1768    else if (layerid==IVECOMPOSITELAYER)
1769    {
1770        layer = new osgTerrain::CompositeLayer;
1771        ((ive::CompositeLayer*)(layer))->read(this);
1772    }
1773    else if (layerid==IVEPROXYLAYER)
1774    {
1775        std::string filename = readString();
1776        osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(filename+".gdal");
1777        osgTerrain::ProxyLayer* proxyLayer = dynamic_cast<osgTerrain::ProxyLayer*>(object.get());
1778
1779        osg::ref_ptr<osgTerrain::Locator> locator = readLocator();
1780        unsigned int minLevel = readUInt();
1781        unsigned int maxLevel = readUInt();
1782
1783        if (proxyLayer)
1784        {
1785            if (locator.valid()) proxyLayer->setLocator(locator.get());
1786
1787            proxyLayer->setMinLevel(minLevel);
1788            proxyLayer->setMaxLevel(maxLevel);
1789        }
1790
1791        layer = proxyLayer;
1792    }
1793    else{
1794        throw Exception("Unknown layer identification in DataInputStream::readLayer()");
1795    }
1796
1797    // and add it to the node map,
1798    _layerMap[id] = layer;
1799
1800
1801    if (_verboseOutput) std::cout<<"read/writeLayer() ["<<id<<"]"<<std::endl;
1802
1803    return layer;
1804}
1805
1806
1807osgTerrain::Locator* DataInputStream::readLocator()
1808{
1809    // Read statesets unique ID.
1810    int id = readInt();
1811    if (id<0) return 0;
1812
1813    // See if stateset is already in the list.
1814    LocatorMap::iterator itr= _locatorMap.find(id);
1815    if (itr!=_locatorMap.end()) return itr->second.get();
1816
1817    // Locator is not in list.
1818    // Create a new locator,
1819    osgTerrain::Locator* locator = new osgTerrain::Locator();
1820
1821    // read its properties from stream
1822    ((ive::Locator*)(locator))->read(this);
1823
1824    // and add it to the locator map,
1825    _locatorMap[id] = locator;
1826
1827    if (_verboseOutput) std::cout<<"read/writeLocator() ["<<id<<"]"<<std::endl;
1828
1829    return locator;
1830}
1831
1832osg::Object* DataInputStream::readObject()
1833{
1834    int id = readInt();
1835    if (id<0) return 0;
1836   
1837    if (id==IVENODE)
1838    {
1839        return readNode();       
1840    }
1841    else if (id==IVESTATESET)
1842    {
1843        return readStateSet();
1844    }
1845    else if (id==IVESTATEATTRIBUTE)
1846    {
1847        return readStateAttribute();
1848    }
1849    else if (id==IVEDRAWABLE)
1850    {
1851        return readDrawable();
1852    }
1853    else if (id==IVESHAPEATTRIBUTELIST)
1854    {
1855        osgSim::ShapeAttributeList* sal = new osgSim::ShapeAttributeList;
1856        ((ive::ShapeAttributeList*)sal)->read(this);
1857        return sal;
1858    }
1859   
1860    return 0;
1861}
1862
Note: See TracBrowser for help on using the browser.