[osg-users] writeNode after readNode makes the osgb model much bigger size
Julien Valentin
julienvalentin51 at gmail.com
Fri Jan 12 12:42:48 PST 2018
Hi Tangrijing
You may use osgDB::writeNode(*node, “456.osgb.zip”,options);
or try store Images as external compressed ive
Cheers
jane_rita wrote:
> Hi,
>
> I read 123.osgb file to a node, and then write it to 456.osgb ,however,the 456.osgb has a 10 times bigger size than 123.osgb. My code is here:
>
> osg::ref_ptr<osg::Node> node = osgDB::readRefNodeFile(123.osgb);
>
> osg::ref_ptr<osgDB::ReaderWriter::Options> options = new osgDB::ReaderWriter::Options;
> options->setOptionString("WriteImageHint=IncludeData");
>
> osgDB::ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeNode(*node, “456.osgb”,options);
>
>
> I than use a texure compress method cited from osgconv.cpp, the result is still 2 times bigger size than the original file.
>
>
> void MyNodeVisitor::compress()
> {
> MyGraphicsContext context;
> if (!context.valid())
> {
> osg::notify(osg::NOTICE) << "Error: Unable to create graphis context, problem with running osgViewer-" << osgViewerGetVersion() << ", cannot run compression." << std::endl;
> return;
> }
>
> osg::ref_ptr<osg::State> state = new osg::State;
> state->initializeExtensionProcs();
>
> for (TextureSet::iterator itr = _textureSet.begin();
> itr != _textureSet.end();
> ++itr)
> {
> osg::Texture* texture = const_cast<osg::Texture*>(itr->get());
>
> osg::Texture2D* texture2D = dynamic_cast<osg::Texture2D*>(texture);
> osg::Texture3D* texture3D = dynamic_cast<osg::Texture3D*>(texture);
>
> osg::ref_ptr<osg::Image> image = texture2D ? texture2D->getImage() : (texture3D ? texture3D->getImage() : 0);
> if (image.valid() &&
> (image->getPixelFormat() == GL_RGB || image->getPixelFormat() == GL_RGBA) &&
> (image->s() >= 32 && image->t() >= 32))
> {
> texture->setInternalFormatMode(_internalFormatMode);
>
> // need to disable the unref after apply, otherwise the image could go out of scope.
> bool unrefImageDataAfterApply = texture->getUnRefImageDataAfterApply();
> texture->setUnRefImageDataAfterApply(false);
>
> // get OpenGL driver to create texture from image.
> texture->apply(*state);
>
> // restore the original setting
> texture->setUnRefImageDataAfterApply(unrefImageDataAfterApply);
>
> image->readImageFromCurrentTexture(0, true);
>
> texture->setInternalFormatMode(osg::Texture::USE_IMAGE_DATA_FORMAT);
> }
> }
> }
>
>
>
> my question is ,how can i make the 456.osgb has the same size with 123.osgb
>
> Thank you!
>
> Cheers,
> tangrijing
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=72746#72746
More information about the osg-users
mailing list