📄 dataoutputstream.cpp
字号:
// id doesn't exist so create a new ID and // register the node. int id = _nodeMap.size(); _nodeMap[node] = id; // write the id. writeInt(id); // this follow code *really* should use a NodeVisitor... Robert Osfield August 2003. if(dynamic_cast<const osg::MatrixTransform*>(node)){ ((ive::MatrixTransform*)(node))->write(this); } else if(dynamic_cast<const osg::Camera*>(node)){ ((ive::Camera*)(node))->write(this); } else if(dynamic_cast<const osg::CameraView*>(node)){ ((ive::CameraView*)(node))->write(this); } else if(dynamic_cast<const osg::PositionAttitudeTransform*>(node)){ ((ive::PositionAttitudeTransform*)(node))->write(this); } else if(dynamic_cast<const osg::AutoTransform*>(node)){ ((ive::AutoTransform*)(node))->write(this); } else if(dynamic_cast<const osgSim::DOFTransform*>(node)){ ((ive::DOFTransform*)(node))->write(this); } else if(dynamic_cast<const osg::LightSource*>(node)){ ((ive::LightSource*)(node))->write(this); } else if(dynamic_cast<const osg::TexGenNode*>(node)){ ((ive::TexGenNode*)(node))->write(this); } else if(dynamic_cast<const osg::ClipNode*>(node)){ ((ive::ClipNode*)(node))->write(this); } else if(dynamic_cast<const osg::Sequence*>(node)){ ((ive::Sequence*)(node))->write(this); } else if(dynamic_cast<const osgSim::Impostor*>(node)){ ((ive::Impostor*)(node))->write(this); } else if(dynamic_cast<const osg::PagedLOD*>(node)){ ((ive::PagedLOD*)(node))->write(this); } else if(dynamic_cast<const osg::LOD*>(node)){ ((ive::LOD*)(node))->write(this); } else if(dynamic_cast<const osg::Switch*>(node)){ ((ive::Switch*)(node))->write(this); } else if(dynamic_cast<const osg::CoordinateSystemNode*>(node)){ ((ive::CoordinateSystemNode*)(node))->write(this); } else if(dynamic_cast<const osgSim::MultiSwitch*>(node)){ ((ive::MultiSwitch*)(node))->write(this); } else if(dynamic_cast<const osg::OccluderNode*>(node)){ ((ive::OccluderNode*)(node))->write(this); } else if(dynamic_cast<const osg::OcclusionQueryNode*>(node)){ ((ive::OcclusionQueryNode*)(node))->write(this); } else if(dynamic_cast<const osg::Transform*>(node)){ ((ive::Transform*)(node))->write(this); } else if(dynamic_cast<const osgSim::VisibilityGroup*>(node)){ ((ive::VisibilityGroup*)(node))->write(this); } else if(dynamic_cast<const osg::ProxyNode*>(node)){ ((ive::ProxyNode*)(node))->write(this); } else if(dynamic_cast<const osgFX::MultiTextureControl*>(node)){ ((ive::MultiTextureControl*)(node))->write(this); } else if(dynamic_cast<const osgFX::AnisotropicLighting*>(node)){ ((ive::AnisotropicLighting*)(node))->write(this); } else if(dynamic_cast<const osgFX::BumpMapping*>(node)){ ((ive::BumpMapping*)(node))->write(this); } else if(dynamic_cast<const osgFX::Cartoon*>(node)){ ((ive::Cartoon*)(node))->write(this); } else if(dynamic_cast<const osgFX::Scribe*>(node)){ ((ive::Scribe*)(node))->write(this); } else if(dynamic_cast<const osgFX::SpecularHighlights*>(node)){ ((ive::SpecularHighlights*)(node))->write(this); } else if(dynamic_cast<const osgTerrain::TerrainTile*>(node)){ ((ive::TerrainTile*)(node))->write(this); } else if(dynamic_cast<const osg::Group*>(node)){ ((ive::Group*)(node))->write(this); } else if(dynamic_cast<const osg::Billboard*>(node)){ ((ive::Billboard*)(node))->write(this); } else if(dynamic_cast<const osg::Geode*>(node)){ ((ive::Geode*)(node))->write(this); } else if(dynamic_cast<const osgSim::LightPointNode*>(node)){ ((ive::LightPointNode*)(node))->write(this); } else throw Exception("Unknown node in Group::write()"); if (_verboseOutput) std::cout<<"read/writeNode() ["<<id<<"]"<<std::endl; }}IncludeImageMode DataOutputStream::getIncludeImageMode(const osg::Image* image) const{ if (image) { if (image->getWriteHint()==osg::Image::STORE_INLINE) { return IMAGE_INCLUDE_DATA; } else if (image->getWriteHint()==osg::Image::EXTERNAL_FILE) { return IMAGE_REFERENCE_FILE; } } return getIncludeImageMode();}void DataOutputStream::writeImage(osg::Image *image){ IncludeImageMode mode = getIncludeImageMode(image); if ( getVersion() >= VERSION_0029) { osg::ImageSequence* is = dynamic_cast<osg::ImageSequence*>(image); if (is) { ((ive::ImageSequence*)(is))->write(this); } else { writeInt(IVEIMAGE); writeChar(mode); writeImage(mode,image); } } else { writeChar(mode); writeImage(mode,image); }}void DataOutputStream::writeImage(IncludeImageMode mode, osg::Image *image){ switch(mode) { case IMAGE_INCLUDE_DATA: // Include image data in stream writeBool(image!=0); if(image) ((ive::Image*)image)->write(this); break; case IMAGE_REFERENCE_FILE: // Only include image name in stream if (image && !(image->getFileName().empty())){ writeString(image->getFileName()); } else{ writeString(""); } break; case IMAGE_INCLUDE_FILE: // Include image file in stream if(image && !(image->getFileName().empty())) { std::string fullPath = osgDB::findDataFile(image->getFileName(),_options.get()); osgDB::ifstream infile(fullPath.c_str(), std::ios::in | std::ios::binary); if(infile) { //Write filename writeString(image->getFileName()); //Get size of file infile.seekg(0,std::ios::end); int size = infile.tellg(); infile.seekg(0,std::ios::beg); //Write file size writeInt(size); //Read file data char *buffer = new char[size]; infile.read(buffer,size); //Write file data writeCharArray(buffer,size); //Delete buffer delete [] buffer; //Close file infile.close(); } else { writeString(""); writeInt(0); } } else{ writeString(""); writeInt(0); } break; case IMAGE_COMPRESS_DATA: if(image) { //Get ReaderWriter for jpeg images std::string extension = "png"; if (image->getPixelFormat()==GL_RGB) extension = "jpg"; osgDB::ReaderWriter* writer = osgDB::Registry::instance()->getReaderWriterForExtension(extension); if(writer) { //Attempt to write the image to an output stream. //The reason this isn't performed directly on the internal _ostream //is because the writer might perform seek operations which could //corrupt the output stream. std::stringstream outputStream; osgDB::ReaderWriter::WriteResult wr; wr = writer->writeImage(*image,outputStream,_options.get()); if(wr.success()) { //Write file format. Do this for two reasons: // 1 - Same code can be used to read in as with IMAGE_INCLUDE_FILE mode // 2 - Maybe in future version user can specify which format to use writeString(std::string(".")+extension); //Need to add dot so osgDB::getFileExtension will work //Write size of stream int size = outputStream.tellp(); writeInt(size); //Write stream writeCharArray(outputStream.str().c_str(),size); return; } } } //Image compression failed, write blank data writeString(""); writeInt(0); break; default: throw Exception("DataOutputStream::writeImage(): Invalid IncludeImageMode value."); break; }}void DataOutputStream::writeLayer(const osgTerrain::Layer* layer){ if (layer==0) { writeInt(-1); return; } LayerMap::iterator itr = _layerMap.find(layer); if (itr!=_layerMap.end()) { // Id already exists so just write ID. writeInt(itr->second); if (_verboseOutput) std::cout<<"read/writeLayer() ["<<itr->second<<"]"<<std::endl; } else { // id doesn't exist so create a new ID and // register the stateset. int id = _layerMap.size(); _layerMap[layer] = id; // write the id. writeInt(id); if (dynamic_cast<const osgTerrain::HeightFieldLayer*>(layer)) { ((ive::HeightFieldLayer*)(layer))->write(this); } else if (dynamic_cast<const osgTerrain::ImageLayer*>(layer)) { ((ive::ImageLayer*)(layer))->write(this); } else if (dynamic_cast<const osgTerrain::SwitchLayer*>(layer)) { ((ive::SwitchLayer*)(layer))->write(this); } else if (dynamic_cast<const osgTerrain::CompositeLayer*>(layer)) { ((ive::CompositeLayer*)(layer))->write(this); } else if (dynamic_cast<const osgTerrain::ProxyLayer*>(layer)) { writeInt(IVEPROXYLAYER); writeString(layer->getFileName()); const osgTerrain::Locator* locator = layer->getLocator(); bool writeOutLocator = locator && !locator->getDefinedInFile(); writeLocator(writeOutLocator ? locator : 0 ); writeUInt(layer->getMinLevel()); writeUInt(layer->getMaxLevel()); } else { throw Exception("Unknown layer in DataOutputStream::writeLayer()"); } if (_verboseOutput) std::cout<<"read/writeLayer() ["<<id<<"]"<<std::endl; }}void DataOutputStream::writeLocator(const osgTerrain::Locator* locator){ if (locator==0) { writeInt(-1); return; } LocatorMap::iterator itr = _locatorMap.find(locator); if (itr!=_locatorMap.end()) { // Id already exists so just write ID. writeInt(itr->second); if (_verboseOutput) std::cout<<"read/writeLocator() ["<<itr->second<<"]"<<std::endl; } else { // id doesn't exist so create a new ID and // register the locator. int id = _locatorMap.size(); _locatorMap[locator] = id; // write the id. writeInt(id); // write the locator. ((ive::Locator*)(locator))->write(this); if (_verboseOutput) std::cout<<"read/writeLocator() ["<<id<<"]"<<std::endl; }}void DataOutputStream::writeObject(const osg::Object* object){ const osg::Node* node = dynamic_cast<const osg::Node*>(object); if (node) { writeInt(IVENODE); writeNode(node); return; } const osg::StateSet* stateset = dynamic_cast<const osg::StateSet*>(object); if (stateset) { writeInt(IVESTATESET); writeStateSet(stateset); return; } const osg::StateAttribute* sa = dynamic_cast<const osg::StateAttribute*>(object); if (sa) { writeInt(IVESTATEATTRIBUTE); writeStateAttribute(sa); return; } const osg::Drawable* drawable = dynamic_cast<const osg::Drawable*>(object); if (drawable) { writeInt(IVEDRAWABLE); writeDrawable(drawable); return; } const osgSim::ShapeAttributeList* sal = dynamic_cast<const osgSim::ShapeAttributeList*>(object); if (sal) { writeInt(IVESHAPEATTRIBUTELIST); ((ive::ShapeAttributeList*)sal)->write(this); return; } // fallback, osg::Object type not supported, so can't write out writeInt(-1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -