source: osgVisual/trunk/src/core/visual_core.cpp @ 233

Last change on this file since 233 was 233, checked in by Torben Dannhauer, 13 years ago
File size: 14.2 KB
RevLine 
[221]1/* -*-c++-*- osgVisual - Copyright (C) 2009-2011 Torben Dannhauer
[31]2 *
3 * This library is based on OpenSceneGraph, open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * osgVisual requires for some proprietary modules a license from the correspondig manufacturer.
9 * You have to aquire licenses for all used proprietary modules.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * OpenSceneGraph Public License for more details.
15*/
16
[86]17
[31]18#include <visual_core.h>
19
20using namespace osgVisual;
21
22visual_core::visual_core(osg::ArgumentParser& arguments_) : arguments(arguments_)
23{
24        OSG_NOTIFY( osg::ALWAYS ) << "visual_core instantiated." << std::endl;
[86]25}
[31]26
[86]27visual_core::~visual_core(void)
28{
29        OSG_NOTIFY( osg::ALWAYS ) << "visual_core destroyed." << std::endl;
30}
31
32void visual_core::initialize()
33{
34        OSG_NOTIFY( osg::ALWAYS ) << "Initialize visual_core..." << std::endl;
35
[144]36        // Check for config file to provide it to all modules during initialization.
37        if( arguments.read("-c", configFilename) || arguments.read("--config", configFilename) )
38        {
39                if( !osgDB::fileExists(configFilename) )
40                        configFilename = "";
41                else
42                        OSG_ALWAYS << "Using configuration file: " << configFilename << std::endl;
43        }
44
[86]45        // Configure osg to use KdTrees
46        osgDB::Registry::instance()->setBuildKdTreesHint(osgDB::ReaderWriter::Options::BUILD_KDTREES);
47
[31]48        // Setup pathes
49        osgDB::Registry::instance()->getDataFilePathList().push_back( "D:\\DA\\osgVisual\\models" );
50       
51        // Setup viewer
52        viewer = new osgViewer::Viewer(arguments);
53
54        // Setup coordinate system node
[87]55        rootNode = new osg::CoordinateSystemNode;       // todo memleakf
[31]56        rootNode->setEllipsoidModel(new osg::EllipsoidModel());
57
58        // Test memory leak (todo)
[116]59        double* test = new double[1000];
[31]60
[55]61        //osg::DisplaySettings::instance()->setNumOfDatabaseThreadsHint( 8 );
[31]62
63        // Show model
64        viewer->setSceneData( rootNode );
65
[71]66        osg::Group* distortedSceneGraph = NULL;
[31]67#ifdef USE_DISTORTION
68        // Initialize distortion
[144]69        distortion = new visual_distortion( viewer, arguments, configFilename );
[151]70        distortedSceneGraph = distortion->initialize( rootNode, viewer->getCamera()->getClearColor() );
[31]71#endif
72
73#ifdef USE_SKY_SILVERLINING
74        // Initialize sky
[182]75        bool disabled = false;  // to ask if the skyp is disabled or enabled
76        sky = new visual_skySilverLining( viewer, configFilename, disabled );
77        if(disabled)
78                sky = NULL;
79        if(sky.valid())
80                sky->init(distortedSceneGraph, rootNode);       // Without distortion: distortedSceneGraph=NULL
[31]81#endif
82
83        // Initialize DataIO interface
[185]84        visual_dataIO::getInstance()->init(viewer, configFilename);
[31]85
[144]86        // Add manipulators for user interaction - after dataIO to be able to skip it in slaves rendering machines.
[231]87        manipulators = new core_manipulator();
88        manipulators->init( viewer, arguments, configFilename, rootNode);
[73]89
[31]90        // create the windows and run the threads.
91        viewer->realize();
92
[189]93        loadTerrain(arguments);
94
[127]95        // All modules are initialized - now check arguments for any unused parameter.
96        checkCommandlineArgumentsForFinalErrors();
97
[31]98        // Run visual main loop
99        mainLoop();
100}
101
102void visual_core::mainLoop()
103{
[134]104        int framestoScenerySetup = 5;
[31]105        // run main loop
106        while( !viewer->done() )
107    {
[134]108                // setup scenery
109                if(framestoScenerySetup-- == 0)
110                        setupScenery();
111
[31]112                // next frame please....
113        viewer->advance();
114
115                /*double hat, hot, lat, lon, height;
116                util::getWGS84ofCamera( viewer->getCamera(), rootNode, lat, lon, height);
117                if (util::queryHeightOfTerrain( hot, rootNode, lat, lon) && util::queryHeightAboveTerrainInWGS84( hat, rootNode, lat, lon, height ) )
118                        OSG_NOTIFY( osg::ALWAYS ) << "HOT is: " << hot << ", HAT is: " << hat << std::endl;*/
119       
[70]120                // perform all queued events
121                viewer->eventTraversal();
122
[31]123                // update the scene by traversing it with the the update visitor which will
124        // call all node update callbacks and animations.
125        viewer->updateTraversal();
126               
127        // Render the Frame.
128        viewer->renderingTraversals();
129
130    }   // END WHILE
131}
132
133void visual_core::shutdown()
134{
135        OSG_NOTIFY( osg::ALWAYS ) << "Shutdown visual_core..." << std::endl;
136
[87]137        // Shutdown Dbug HUD
138        if(hud.valid())
139                hud->shutdown();
[31]140        // Unset scene data
141        viewer->setSceneData( NULL );
142
143#ifdef USE_SKY_SILVERLINING
144        // Shutdown sky
145        if( sky.valid() )
146                sky->shutdown();
147#endif
148
149#ifdef USE_DISTORTION
150        // Shutdown distortion
151        if( distortion.valid() )
152                distortion->shutdown();
153#endif
154
[87]155        // Shutdown data
156        rootNode = NULL;
157
[31]158        // Shutdown dataIO
159        visual_dataIO::getInstance()->shutdown();
160
[231]161        // Shutdown manipulators
162        if(manipulators.valid())
163                manipulators->shutdown();
[86]164
165        // Destroy osgViewer
166        viewer = NULL;
[31]167}
168
169bool visual_core::loadTerrain(osg::ArgumentParser& arguments_)
170{
[192]171        osg::ref_ptr<osg::Node> model = osgDB::readNodeFiles(util::getTerrainFromXMLConfig(configFilename));
[31]172        if( model.valid() )
173        {
174        rootNode->addChild( model.get() );
175                return true;
176        }
177        else
178        {
[58]179        OSG_NOTIFY( osg::FATAL ) << "Load terrain: No data loaded" << std::endl;
[31]180        return false;
181    }   
182
183        return false;
184}
185
[188]186void visual_core::parseScenery(xmlNode* a_node)
[125]187{
[128]188        OSG_ALWAYS << "parseScenery()" << std::endl;
[125]189
[188]190        a_node = a_node->children;
191
192        for (xmlNode *cur_node = a_node; cur_node; cur_node = cur_node->next)
193        {
194                std::string node_name=reinterpret_cast<const char*>(cur_node->name);
195
[194]196                // terrain is parsend seperately
197                // animationpath is parsend seperately
[188]198
199                if(cur_node->type == XML_ELEMENT_NODE && node_name == "models")
200                {
[202]201                        for (xmlNode *modelNode = cur_node->children; modelNode; modelNode = modelNode->next)
202                        {
[203]203                                std::string name=reinterpret_cast<const char*>(modelNode->name);
[227]204                                if(modelNode->type == XML_ELEMENT_NODE && name == "model")
[203]205                                {
206                                        visual_object::createNodeFromXMLConfig(rootNode, modelNode);
207                                }
[227]208                                if(modelNode->type == XML_ELEMENT_NODE && name == "trackmodel")
[225]209                                {
[226]210                                        // Extract track-ID and track the model
[227]211                                        xmlAttr  *attr = modelNode->properties;
[226]212                                        while ( attr ) 
213                                        { 
214                                                std::string attr_name=reinterpret_cast<const char*>(attr->name);
215                                                std::string attr_value=reinterpret_cast<const char*>(attr->children->content);
[231]216                                                if( attr_name == "id" ) manipulators->trackNode( util::strToInt(attr_value) );
[228]217
218
[226]219                                                attr = attr->next; 
220                                        }
221                                       
[225]222                                }
[202]223                        }
[188]224                }
225
[211]226#ifdef USE_SKY_SILVERLINING
[188]227                if(cur_node->type == XML_ELEMENT_NODE && node_name == "datetime")
228                {
[189]229                        int hour, minute;
230                        int day=0,month=0,year=0;
231
232                        xmlAttr  *attr = cur_node->properties;
233                        while ( attr ) 
234                        { 
235                                std::string attr_name=reinterpret_cast<const char*>(attr->name);
236                                std::string attr_value=reinterpret_cast<const char*>(attr->children->content);
[219]237                                if( attr_name == "day" ) day = util::strToInt(attr_value);
238                                if( attr_name == "month" ) month = util::strToInt(attr_value);
239                                if( attr_name == "year" ) year = util::strToInt(attr_value);
240                                if( attr_name == "hour" ) hour = util::strToInt(attr_value);
241                                if( attr_name == "minute" ) minute = util::strToInt(attr_value);
242
[189]243                                attr = attr->next; 
244                        }
245                        if(sky.valid())
246                        {
247                                if(day!=0 && month!=0 && year!=0)
248                                        sky->setDate(year, month, day);
249                                sky->setTime(hour,minute,00);
250                        }
[188]251                }
252
253                if(cur_node->type == XML_ELEMENT_NODE && node_name == "visibility")
254                {
[195]255                        float range = 50000, turbidity=2.2;
256                        xmlAttr  *attr = cur_node->properties;
257                        while ( attr ) 
258                        { 
259                                std::string attr_name=reinterpret_cast<const char*>(attr->name);
260                                std::string attr_value=reinterpret_cast<const char*>(attr->children->content);
[219]261                                if( attr_name == "range" ) range = util::strToDouble(attr_value);
262                                if( attr_name == "turbidity" ) turbidity = util::strToDouble(attr_value);
263
[195]264                                attr = attr->next; 
265                        }
[211]266
[195]267                        if(sky.valid())
268                        {
269                                sky->setVisibility( range );
270                                sky->setTurbidity( turbidity );
271                        }
[188]272                }
273
[200]274                if(cur_node->type == XML_ELEMENT_NODE && node_name == "clouds")
[188]275                {
[198]276                        if(sky.valid())
277                                sky->configureCloudlayerbyXML( cur_node );
[188]278                }
279
280                if(cur_node->type == XML_ELEMENT_NODE && node_name == "windlayer")
281                {
[195]282                        float bottom = 0.0, top=5000.0, speed=25.0, direction=0.0;
283                        xmlAttr  *attr = cur_node->properties;
284                        while ( attr ) 
285                        { 
286                                std::string attr_name=reinterpret_cast<const char*>(attr->name);
287                                std::string attr_value=reinterpret_cast<const char*>(attr->children->content);
[219]288                                if( attr_name == "bottom" ) bottom = util::strToDouble(attr_value);
289                                if( attr_name == "top" ) top = util::strToDouble(attr_value);
290                                if( attr_name == "speed" ) speed = util::strToDouble(attr_value);
291                                if( attr_name == "direction" ) direction = util::strToDouble(attr_value);
292
[195]293                                attr = attr->next; 
294                        }
295                        if(sky.valid())
296                        {
297                                sky->addWindVolume( bottom, top, speed, direction );
298                        }
[188]299                }
[212]300
301                // Track Node
302
[211]303#endif
[188]304        }// FOR all nodes END
305
[129]306}
307
[67]308bool visual_core::checkCommandlineArgumentsForFinalErrors()
[31]309{
310        // Setup Application Usage
311        arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
312        arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the new FSD visualization tool, written by Torben Dannhauer");
[212]313    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [OSG options] -c XML-Configurationfile");
[31]314        arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
[212]315        arguments.getApplicationUsage()->addCommandLineOption("-c or --config","XML configuration filename");
[31]316
[212]317
[31]318    // if user request help write it out to cout.
319    if (arguments.read("-h") || arguments.read("--help"))
320    {
321        arguments.getApplicationUsage()->write(std::cout);
322                //cause the viewer to exit and shut down clean.
323        viewer->setDone(true);
324    }
325
326    // report any errors if they have occurred when parsing the program arguments.
327    if (arguments.errors())
328    {
329        arguments.writeErrorMessages(std::cout);
330                //cause the viewer to exit and shut down clean.
331        viewer->setDone(true);
332    }
333
334         // any option left unread are converted into errors to write out later.
335    arguments.reportRemainingOptionsAsUnrecognized();
336
337    // report any errors if they have occurred when parsing the program arguments.
338    if (arguments.errors())
339    {
340        arguments.writeErrorMessages(std::cout);
341        return false;
342    }
343        return true;
344}
345
346void visual_core::setupScenery()
347{
[194]348        // Parse Scenery from Configuration file
349        xmlDoc* tmpDoc;
350        xmlNode* sceneryNode = util::getSceneryXMLConfig(configFilename, tmpDoc);
351        parseScenery(sceneryNode);
352        if(sceneryNode)
353        {
354                xmlFreeDoc(tmpDoc); xmlCleanupParser();
355        }
[122]356
[194]357
[31]358        //testObj = new visual_object( rootNode, "testStab", objectMountedCameraManip );
359        //testObj->setNewPosition( osg::DegreesToRadians(47.7123), osg::DegreesToRadians(12.84088), 600 );
360        ///* using a huge cylinder to test position & orientation */
361        //testObj->setGeometry( util::getDemoCylinder(5000.0, 20.0 ) );
362        //testObj->addUpdater( new object_updater(testObj) );
363
[115]364        //osg::ref_ptr<visual_object> testObj2 = new visual_object( rootNode, "neuschwanstein" );       // todo memleak
365        ////testObj2->setNewPosition( osg::DegreesToRadians(47.8123), osg::DegreesToRadians(12.94088), 600 );
366        //testObj2->setNewPosition( osg::DegreesToRadians(47.557523564234), osg::DegreesToRadians(10.749646398595), 950 );
367        //testObj2->loadGeometry( "../models/neuschwanstein.osgb" );
[216]368        ////testObj2->addUpdater( new object_updater(testObj2) );
[31]369
[212]370        //osg::ref_ptr<visual_object> testObj3 = new visual_object( rootNode, "SAENGER1" );     // todo memleak
371        //testObj3->setNewPosition( osg::DegreesToRadians(47.8123), osg::DegreesToRadians(12.94088), 600 );
372        //testObj3->loadGeometry( "../models/saenger1.flt" );
[216]373        //testObj3->addUpdater( new object_updater(testObj3) );
[212]374        //
[31]375
[224]376        osg::ref_ptr<visual_object> testObj4 = new visual_object( rootNode, "SAENGER2" );       // todo memleak
[31]377        testObj4->setNewPosition( osg::DegreesToRadians(47.8123), osg::DegreesToRadians(12.94088), 650 );
378        testObj4->loadGeometry( "../models/saenger2.flt" );
[216]379        testObj4->addUpdater( new object_updater(testObj4) );
[215]380        testObj4->addLabel("testLabel", "Object4 :)",osg::Vec4(1.0f,0.25f,1.0f,1.0f));
[31]381
[212]382        //osg::ref_ptr<visual_object> testObj5 = new visual_object( rootNode, "SAENGER" );      // todo memleak
383        //testObj5->setNewPosition( osg::DegreesToRadians(47.8123), osg::DegreesToRadians(12.94088), 550 );
384        //testObj5->loadGeometry( "../models/saengerCombine.flt" );
385        ////testObj5->setScale( 2 );
[216]386        //testObj5->addUpdater( new object_updater(testObj5) );
[31]387
[227]388        //trackNode( testObj4 );
[31]389
390        // Load EDDF
391        //std::string filename = "D:\\DA\\EDDF_test\\eddf.ive";
392        //if( !osgDB::fileExists(filename) )
393        //{
394        //      OSG_NOTIFY(osg::ALWAYS) << "Warning: EDDF Model not loaded. File '" << filename << "' does not exist. Skipping.";
395        //}
396        //// read model
397        //osg::ref_ptr<osg::Node> tmpModel = osgDB::readNodeFile( filename );
398        //if (tmpModel.valid())
399        //      rootNode->addChild( tmpModel );
400       
401 
402        visual_draw2D::getInstance()->init( rootNode, viewer );
403        //osg::ref_ptr<visual_hud> hud = new visual_hud();
[87]404        hud = new visual_debug_hud();
[31]405        hud->init( viewer, rootNode );
406       
[122]407       
[31]408
409        //osg::ref_ptr<visual_draw3D> test = new visual_draw3D();
410        //test->init( rootNode, viewer );
411
[69]412        //// Creating Testclasses
413        //osg::ref_ptr<osgVisual::dataIO_transportContainer> test = new osgVisual::dataIO_transportContainer();
414        //osg::ref_ptr<osgVisual::dataIO_executer> testEx = new osgVisual::dataIO_executer();
415        //osg::ref_ptr<osgVisual::dataIO_slot> testSlot = new osgVisual::dataIO_slot();
416        //test->setFrameID( 22 );
417        //test->setName("ugamoep");
418        //testEx->setexecuterID( osgVisual::dataIO_executer::IS_COLLISION );
419        //testSlot->setVariableName(std::string("HalloName"));
420        //testSlot->setdataDirection( osgVisual::dataIO_slot::TO_OBJ );
421        //testSlot->setvarType( osgVisual::dataIO_slot::DOUBLE );
422        //testSlot->setValue( 0.12345 );
423        //test->addExecuter( testEx );
424        //test->addSlot( testSlot );
[31]425
[69]426        visual_dataIO::getInstance()->setSlotData("TestSlot1", osgVisual::dataIO_slot::TO_OBJ, 0.12345);
[155]427
[31]428}
Note: See TracBrowser for help on using the repository browser.