Hi Robert,

attached is the sample that crashes. Please let me know if crash for you as
well


-Nick


On Fri, Feb 19, 2010 at 7:10 PM, Robert Osfield <[email protected]>wrote:

> Hi Nick,
>
> On Fri, Feb 19, 2010 at 4:43 PM, Trajce (Nick) Nikolov
> <[email protected]> wrote:
> > the dll is not undloaded. When I do
> > viewer = 0;
> > the viewer address and the one that gets down to objectDeleted(void* ptr)
> > are slightly different, means viewer.get() != ptr.
> > _ptr is not equal to obj
>
> OK, things are getting odder... but I guess we uncover a clue soon.
>
> What happens to the viewer, _ptr and obj values if you modify
> osgviewer to construct a viewer on the heap and the delete it by
> setting the ref_ptr<> to 0 or letting it go out of scope?
>
> Testing whether the same problems with pointers mismatching when using
> a the dll or straight app may give some more clues.
>
> Robert.
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield 
 *
 * This application is open source and may be redistributed and/or modified   
 * freely and without restriction, both in commericial and non commericial 
applications,
 * as long as this copyright notice is maintained.
 * 
 * This application is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

#include <osgDB/ReadFile>
#include <osgUtil/Optimizer>
#include <osg/CoordinateSystemNode>

#include <osg/Switch>
#include <osgText/Text>

#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>

#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgGA/SphericalManipulator>

#include <iostream>

int main(int argc, char** argv)
{
    // use an ArgumentParser object to manage the program arguments.
    osg::ArgumentParser arguments(&argc,argv);

    
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
    
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+"
 is the standard OpenSceneGraph example which loads and visualises 3d models.");
    
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+"
 [options] filename ...");
    arguments.getApplicationUsage()->addCommandLineOption("--image 
<filename>","Load an image and render it on a quad");
    arguments.getApplicationUsage()->addCommandLineOption("--dem 
<filename>","Load an image/DEM and render it on a HeightField");
    arguments.getApplicationUsage()->addCommandLineOption("--login <url> 
<username> <password>","Provide authentication information for http file 
access.");

        {
                osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
                

                
viewer->setThreadingModel(osgViewer::CompositeViewer::CullDrawThreadPerContext);
                

                unsigned int helpType = 0;
                if ((helpType = arguments.readHelpType()))
                {
                        arguments.getApplicationUsage()->write(std::cout, 
helpType);
                        return 1;
                }

                // report any errors if they have occurred when parsing the 
program arguments.
                if (arguments.errors())
                {
                        arguments.writeErrorMessages(std::cout);
                        return 1;
                }

                if (arguments.argc()<=1)
                {
                        
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
                        return 1;
                }

                std::string url, username, password;
                while(arguments.read("--login",url, username, password))
                {
                        if 
(!osgDB::Registry::instance()->getAuthenticationMap())
                        {
                                
osgDB::Registry::instance()->setAuthenticationMap(new osgDB::AuthenticationMap);
                                
osgDB::Registry::instance()->getAuthenticationMap()->addAuthenticationDetails(
                                        url,
                                        new 
osgDB::AuthenticationDetails(username, password)
                                );
                        }
                }

                // set up the camera manipulators.
                {
                        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> 
keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;

                        keyswitchManipulator->addMatrixManipulator( '1', 
"Trackball", new osgGA::TrackballManipulator() );
                        keyswitchManipulator->addMatrixManipulator( '2', 
"Flight", new osgGA::FlightManipulator() );
                        keyswitchManipulator->addMatrixManipulator( '3', 
"Drive", new osgGA::DriveManipulator() );
                        keyswitchManipulator->addMatrixManipulator( '4', 
"Terrain", new osgGA::TerrainManipulator() );
                        keyswitchManipulator->addMatrixManipulator( '5', 
"Spherical", new osgGA::SphericalManipulator() );

                        std::string pathfile;
                        char keyForAnimationPath = '6';
                        while (arguments.read("-p",pathfile))
                        {
                                osgGA::AnimationPathManipulator* apm = new 
osgGA::AnimationPathManipulator(pathfile);
                                if (apm || !apm->valid()) 
                                {
                                        unsigned int num = 
keyswitchManipulator->getNumMatrixManipulators();
                                        
keyswitchManipulator->addMatrixManipulator( keyForAnimationPath, "Path", apm );
                                        
keyswitchManipulator->selectMatrixManipulator(num);
                                        ++keyForAnimationPath;
                                }
                        }

                        viewer->setCameraManipulator( 
keyswitchManipulator.get() );
                }

                // add the state manipulator
                viewer->addEventHandler( new 
osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()) );

                // add the thread model handler
                viewer->addEventHandler(new osgViewer::ThreadingHandler);

                // add the window size toggle handler
                viewer->addEventHandler(new osgViewer::WindowSizeHandler);

                // add the stats handler
                viewer->addEventHandler(new osgViewer::StatsHandler);

                // add the help handler
                viewer->addEventHandler(new 
osgViewer::HelpHandler(arguments.getApplicationUsage()));

                // add the record camera path handler
                viewer->addEventHandler(new osgViewer::RecordCameraPathHandler);

                // add the LOD Scale handler
                viewer->addEventHandler(new osgViewer::LODScaleHandler);

                // add the screen capture handler
                viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);

                // load the data
                osg::ref_ptr<osg::Node> loadedModel = 
osgDB::readNodeFiles(arguments);
                if (!loadedModel) 
                {
                        std::cout << arguments.getApplicationName() <<": No 
data loaded" << std::endl;
                        return 1;
                }

                // any option left unread are converted into errors to write 
out later.
                arguments.reportRemainingOptionsAsUnrecognized();

                // report any errors if they have occurred when parsing the 
program arguments.
                if (arguments.errors())
                {
                        arguments.writeErrorMessages(std::cout);
                        return 1;
                }


                // optimize the scene graph, remove redundant nodes and state 
etc.
                osgUtil::Optimizer optimizer;
                optimizer.optimize(loadedModel.get());

                viewer->setSceneData( loadedModel.get() );

                viewer->realize();

                while (!viewer->done())
                {
                        viewer->frame();
                }
                viewer->setSceneData( 0 );
                viewer->setCameraManipulator(0);
                viewer->setCamera(0);
                viewer = 0;
        }

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

Reply via email to