I'm having some problems connected with the use of textures embedded within IVE 
files. The problem arises when I use the same IVE model instance from within 
two instances of osgViewer::Viewer which results in unpredictable rendering of 
textures in one of the viewer instances, usually the texture goes white when I 
delete one viewer instance. If the embedded textures were also compressed, then 
I also get some GL errors, typically:

"Warning: detected OpenGL error 'invalid enumerant' at after 
RenderBin::draw(..)"

To be honest, I'm not surprised that this sharing of scene graph data between 
osg Viewer instances causes a problem. In fact, I’m surprised that more things 
don’t break. However, the reason this scenario crops up is that  my osg viewer 
is running inside a web based plugin, and hence I get an osg viewer instance 
within each instance of the plugin that the web browser creates.   You might 
now be wondering why the browser plugin instances share any scene graph data, 
and in fact I was a bit surprised that they were. I didn’t want them to share 
data! It turns out that the reason the browser plugin instances share data is 
because of the cache provided by the osg Registry singleton. It would have been 
nice if each browser plugin instance ended up with their own osg Registry 
singleton, but they don’t!
(I don’t really want to get on my hobby horse about all the pains that the 
singleton pattern can cause, but this is certainly one to add to my list)

So, my questions boil down to :
If viewer instance 1 caches “cow.ive” in Registry singleton, how do I prevent 
viewer instance 2 from using it? 
If it does use the cached version, why does cause a problem (seemingly only 
with textures that were embedded in IVE)?
Is there a way to “tweak” the IVE embedded textures so they can be shared 
successfully in this scenario?

I have reduced the problem down to a simple example (20 lines or so) that 
exhibits the same symptoms:


Code:
static osg::ref_ptr<osg::Node> model = NULL;

class ViewerThread : public OpenThreads::Thread
{
public:
    ViewerThread(int x, int y) : x(x), y(y) { }
    void run()
    {
        osgViewer::Viewer viewer;
        viewer.setUpViewInWindow(x, y, 400, 300);
        viewer.setSceneData(model);
        viewer.run();        
    }
    int x, y;
};

int main(int argc, char* argv[])
{
    model = osgDB::readNodeFile("cow.ive");

    ViewerThread* thread1 = new ViewerThread(100, 100);
    thread1->start();

    ViewerThread* thread2 = new ViewerThread(500, 100);
    thread2->start();

    while(true); 

        return 0;
}



Chris Denham

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=44810#44810





_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to