[osg-users] Texture Caching Problem with 3.6.3/4

Greg D g.danaha at networkharbor.com
Fri Dec 6 11:35:45 PST 2019



I have been using OSG for a number of years for a commercial product.  Our 
product loads various models and earth views as the user requires them (for 
security monitoring – buildings and campuses mostly).  I have a problem 
with 3.6.3/4 that wasn't there in 3.4.0.

 

I have an OpenFlight model (sample/demo model) that uses textures for 
terrain and on buildings.  The first time I load it all is fine.  However, 
if I load another model (or another graphics file – the application 
supports AutoCAD, raster, OSG Earth, and ArcGIS formats as well) then 
reload the model the terrain is black and the textures are corrupted if 
they are not black.  This worked fine with 3.4.0 and 3.4.1 but does not 
work with 3.6.3 or 3.6.4.

 

I have debugged into the code and it appears that the model and textures 
are always reloaded from the cache and I cannot override this (setting 
Options::CACHE_NONE doesn’t affect it - in 3.4.0 the model always loaded 
from files with Options set to CACHE_NONE).  If I look at the model graph 
in memory (after the first load), the textures appear to be erased or 
over-written during the traversals in one of the classes called in 
ViewerBase::runOperations() (though it’s a little confusing to me at that 
point, it appears to be when GlobalObjectVisitor::compile() calls 
node.accept(*this)).  During the traversals where the textures appear to be 
over-written, I noticed the context ID is always 0, so the textures appear 
to be reloaded, over-writing the original data in the process (though I 
could be quite confused as to what I am seeing and it may all be irrelevant 
to the issue). 


Below is a short snippet from my initialization and cleanup code between 
model loads.  I load the model, add a clip node to peel down through the 
models vertically.  I also add other nodes to hold embedded bitmaps 
(Billboards) representing security devices – cameras, doors, alarm points, 
etc.  Those details are omitted from the code below.  After the model is 
loaded I set up the graphics context and render the image to an offscreen 
window (which is then copied to a memory bitmap).  The application is a 
Windows console app (with hidden window) that streams bitmap images to the 
client app via named pipe on the same machine (I know, it’s complicated, 
but it’s a complex environment, including live video windows).

 

As I said, it has worked fine with previous versions of OSG (back to 3.0.1, 
if not earlier).  This may be specific to Open Flight models, as I can load 
FBX models, OSG earth files, or the cessnafire.osg model and the textures 
appear correct.


Any help would be appreciated.  If the model would always be loaded from 
the file when Options::CACHE_NONE were set it would solve my problem.


OSGLoadResult OpenSceneGraphBitmap::LoadModel(std::string fileName, osgDB::
Options* dbOptions)

{

       CleanupModel();

 

       if (m_Root == nullptr)

              m_Root = new osg::Group;          // Init the main Root 
Node/Group

 

       // Load the Model from the model name

       osg::Group* model = dynamic_cast<osg::Group*>(osgDB::readNodeFile(
fileName, dbOptions));

       if (model != nullptr)

       {

              // Optimize the model

              osgUtil::Optimizer optimizer;

              optimizer.optimize(model);

              optimizer.reset();

 

              // Create the clip node and add to scene

              osg::ComputeBoundsVisitor cbbv;

              model->accept(cbbv);

              osg::BoundingBox bb = cbbv.getBoundingBox();

 

              osg::ref_ptr<osg::ClipPlane> clipPlane = new osg::ClipPlane;

              clipPlane->setClipPlane(0.0, 0.0, -1.0, bb.zMin() + 
(bb.zMax() - bb.zMin()));

              clipPlane->setClipPlaneNum(0);

 

              osg::ref_ptr<osg::ClipNode> clipNode = new osg::ClipNode;

              clipNode->setName("CLIP_NODE");

              clipNode->addClipPlane(clipPlane.get());

 

              clipNode->setCullingActive(false);

 

              model->setStateSet(clipNode->getStateSet());

 

              m_Root->addChild(clipNode);

 

              m_Root->addChild(model);

 

              m_Root->setDataVariance(osg::Object::DYNAMIC);

 

 

              return OSGLoadResult::Sucess;

       }

 

       // since load failed, reset the wait event so the render thread 
resumes

       return OSGLoadResult::FileLoadError;

}

 

void OpenSceneGraphBitmap::CleanupModel()

{

       RemoveViews();

 

       if (m_Root != nullptr)     // if root already exists (already loaded 
previous scene) remove children to clean up

       {

              m_Root->releaseGLObjects();

              m_Root->removeChildren(0, m_Root->getNumChildren());

 

              void* ptr = m_Root.release();

              delete ptr;

              m_Root = nullptr;

       }

}

 

void OpenSceneGraphBitmap::RemoveViews()

{

       if (m_nhiCompositeViewer != nullptr)

       {

              m_nhiCompositeViewer->setDone(true);

 

              delete m_nhiCompositeViewer;

              m_nhiCompositeViewer = nullptr;

       }

}

 

-- 
You received this message because you are subscribed to the Google Groups "OpenSceneGraph Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to osg-users+unsubscribe at googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/osg-users/6f68265d-b8d2-4f74-b55a-f119fc807d37%40googlegroups.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20191206/abb680a9/attachment.html>


More information about the osg-users mailing list