/********************************************************************** * * FILE: DataOutputStream.cpp * * DESCRIPTION: Implements methods to write simpel datatypes to an * output stream. * * CREATED BY: Rune Schmidt Jensen * * HISTORY: Created 11.03.2003 * * Copyright 2003 VR-C **********************************************************************/ #include "DataOutputStream.h" #include "Exception.h" #include "StateSet.h" #include "BlendFunc.h" #include "Material.h" #include "CullFace.h" #include "PolygonOffset.h" #include "ShadeModel.h" #include "Point.h" #include "Texture2D.h" #include "TextureCubeMap.h" #include "TexEnv.h" #include "TexEnvCombine.h" #include "TexGen.h" #include "Group.h" #include "MatrixTransform.h" #include "Geode.h" #include "LightSource.h" #include "Billboard.h" #include "Sequence.h" #include "LOD.h" #include "PagedLOD.h" #include "PositionAttitudeTransform.h" #include "DOFTransform.h" #include "Transform.h" #include "Switch.h" #include "OccluderNode.h" #include "Impostor.h" #include "LightPointNode.h" #include "Geometry.h" using namespace ive; DataOutputStream::DataOutputStream(std::ostream * ostream) { _verboseOutput = false; _includeImageData= true; _ostream = ostream; if(!_ostream) throw Exception("DataOutputStream::DataOutputStream(): null pointer exception in argument."); writeInt(VERSION); } DataOutputStream::~DataOutputStream(){} void DataOutputStream::writeBool(bool b) { char c = b?1:0; _ostream->write(&c, CHARSIZE); if (_verboseOutput) std::cout<<"read/writeBool() ["<<(int)c<<"]"<write(&c, CHARSIZE); if (_verboseOutput) std::cout<<"read/writeChar() ["<<(int)c<<"]"<write((char*)&c, CHARSIZE); if (_verboseOutput) std::cout<<"read/writeUChar() ["<<(int)c<<"]"<write((char*)&s, SHORTSIZE); if (_verboseOutput) std::cout<<"read/writeUShort() ["<write((char*)&s, INTSIZE); if (_verboseOutput) std::cout<<"read/writeUInt() ["<write((char*)&i, INTSIZE); if (_verboseOutput) std::cout<<"read/writeInt() ["<write((char*)&f, FLOATSIZE); if (_verboseOutput) std::cout<<"read/writeFloat() ["<write((char*)&l, LONGSIZE); if (_verboseOutput) std::cout<<"read/writeLong() ["<write((char*)&l, LONGSIZE); if (_verboseOutput) std::cout<<"read/writeULong() ["<write((char*)&d, DOUBLESIZE); if (_verboseOutput) std::cout<<"read/writeDouble() ["<write(s.c_str(), s.size()); if (_verboseOutput) std::cout<<"read/writeString() ["<write(data, size); if (_verboseOutput) std::cout<<"read/writeCharArray() ["<getType()){ case osg::Array::IntArrayType: writeChar((char)0); writeIntArray(static_cast(a)); break; case osg::Array::UByteArrayType: writeChar((char)1); writeUByteArray(static_cast(a)); break; case osg::Array::UShortArrayType: writeChar((char)2); writeUShortArray(static_cast(a)); break; case osg::Array::UIntArrayType: writeChar((char)3); writeUIntArray(static_cast(a)); break; case osg::Array::UByte4ArrayType: writeChar((char)4); writeUByte4Array(static_cast(a)); break; case osg::Array::FloatArrayType: writeChar((char)5); writeFloatArray(static_cast(a)); break; case osg::Array::Vec2ArrayType: writeChar((char)6); writeVec2Array(static_cast(a)); break; case osg::Array::Vec3ArrayType: writeChar((char)7); writeVec3Array(static_cast(a)); break; case osg::Array::Vec4ArrayType: writeChar((char)8); writeVec4Array(static_cast(a)); break; default: throw Exception("Unknown array type in DataOutputStream::writeArray()"); } } void DataOutputStream::writeIntArray(const osg::IntArray* a) { int size = a->getNumElements(); writeInt(size); for(int i =0; iindex(i)); } if (_verboseOutput) std::cout<<"read/writeIntArray() ["<getNumElements(); writeInt(size); for(int i =0; igetNumElements(); writeInt(size); for(int i =0; igetNumElements(); writeInt(size); for(int i =0; igetNumElements(); writeInt(size); for(int i =0; igetNumElements(); writeInt(size); for(int i =0; isize(); writeInt(size); for(int i=0;isize(); writeInt(size); for(int i = 0; i < size; i++){ writeVec3((*a)[i]); } if (_verboseOutput) std::cout<<"read/writeVec3Array() ["<size(); writeInt(size); for(int i=0;isecond); if (_verboseOutput) std::cout<<"read/writeStateSet() ["<second<<"]"<write(this); if (_verboseOutput) std::cout<<"read/writeStateSet() ["<second); if (_verboseOutput) std::cout<<"read/writeStateAttribute() ["<second<<"]"<(attribute)){ ((ive::BlendFunc*)(attribute))->write(this); } // This is a Material else if(dynamic_cast(attribute)){ ((ive::Material*)(attribute))->write(this); } // This is a CullFace else if(dynamic_cast(attribute)){ ((ive::CullFace*)(attribute))->write(this); } // This is a PolygonOffset else if(dynamic_cast(attribute)){ ((ive::PolygonOffset*)(attribute))->write(this); } else if(dynamic_cast(attribute)){ ((ive::ShadeModel*)(attribute))->write(this); } else if(dynamic_cast(attribute)){ ((ive::Point*)(attribute))->write(this); } // This is a Texture2D else if(dynamic_cast(attribute)){ ((ive::Texture2D*)(attribute))->write(this); } // This is a TextureCubeMap else if(dynamic_cast(attribute)){ ((ive::TextureCubeMap*)(attribute))->write(this); } // This is a TexEnv else if(dynamic_cast(attribute)){ ((ive::TexEnv*)(attribute))->write(this); } // This is a TexEnvCombine else if(dynamic_cast(attribute)){ ((ive::TexEnvCombine*)(attribute))->write(this); } // This is a TexGen else if(dynamic_cast(attribute)){ ((ive::TexGen*)(attribute))->write(this); } else{ std::string className = attribute->className(); throw Exception(std::string("StateSet::write(): Unknown StateAttribute: ").append(className)); } if (_verboseOutput) std::cout<<"read/writeStateAttribute() ["<second); if (_verboseOutput) std::cout<<"read/writeDrawable() ["<second<<"]"<(drawable)) ((ive::Geometry*)(drawable))->write(this); else{ throw Exception("Unknown drawable in DataOutputStream::writeDrawable()"); } if (_verboseOutput) std::cout<<"read/writeDrawable() ["<second); if (_verboseOutput) std::cout<<"read/writeNode() ["<second<<"]"<(node)){ ((ive::MatrixTransform*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::PositionAttitudeTransform*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::DOFTransform*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::LightSource*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Sequence*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Impostor*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::PagedLOD*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::LOD*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Switch*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::OccluderNode*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Transform*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Group*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Billboard*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::Geode*)(node))->write(this); } else if(dynamic_cast(node)){ ((ive::LightPointNode*)(node))->write(this); } else throw Exception("Unknown node in Group::write()"); if (_verboseOutput) std::cout<<"read/writeNode() ["<