⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataoutputstream.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        // 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 + -