root/OpenSceneGraph/trunk/examples/osglauncher/osglauncher.cpp @ 3668

Revision 3668, 12.7 kB (checked in by robert, 9 years ago)

Changed debugging info to use osg::notify

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <cstdio>
2#include <cstdlib>
3#include <iostream>
4#include <list>
5#include <string>
6#include <fstream>
7#include <sstream>
8
9#include <osg/Geode>
10#include <osg/ShapeDrawable>
11#include <osg/Material>
12#include <osg/Texture2D>
13#include <osg/Geometry>
14#include <osg/MatrixTransform>
15#include <osg/PositionAttitudeTransform>
16#include <osg/BlendFunc>
17#include <osg/ClearNode>
18#include <osg/Depth>
19#include <osg/Projection>
20
21#include <osgUtil/Tesselator>
22#include <osgUtil/TransformCallback>
23#include <osgUtil/CullVisitor>
24#include <osgUtil/Optimizer>
25
26#include <osgText/Text>
27
28#include <osgGA/TrackballManipulator>
29
30#include <osgProducer/Viewer>
31
32#include <osgDB/ReadFile>
33#include <osgDB/FileUtils>
34
35int runApp(std::string xapp);
36
37// class to handle events with a pick
38class PickHandler : public osgGA::GUIEventHandler {
39public:
40
41    PickHandler(osgProducer::Viewer* viewer,osgText::Text* updateText):
42        _viewer(viewer),
43        _updateText(updateText) {}
44       
45    ~PickHandler() {}
46   
47    bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us);
48
49    std::string pick(float x, float y);
50   
51    void highlight(const std::string& name)
52    {
53        if (_updateText.get()) _updateText->setText(name);
54    }
55   
56protected:
57
58    osgProducer::Viewer* _viewer;
59    osg::ref_ptr<osgText::Text>  _updateText;
60};
61
62bool PickHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&)
63{
64    switch(ea.getEventType())
65    {
66    case(osgGA::GUIEventAdapter::FRAME):
67    case(osgGA::GUIEventAdapter::MOVE):
68    {
69        //osg::notify(osg::NOTICE)<<"MOVE "<<ea.getX()<<ea.getY()<<std::endl;
70        std::string picked_name = pick(ea.getX(),ea.getY());
71        highlight(picked_name);
72        return false;
73    }
74    case(osgGA::GUIEventAdapter::PUSH):
75    {
76        //osg::notify(osg::NOTICE)<<"PUSH "<<ea.getX()<<ea.getY()<<std::endl;
77        std::string picked_name = pick(ea.getX(),ea.getY());
78        if (!picked_name.empty())
79        {
80            runApp(picked_name);
81            return true;
82        }
83        else
84        {
85            return false;
86        }
87    }
88    default:
89        return false;
90    }
91}
92
93
94std::string PickHandler::pick(float x, float y)
95{
96    osgUtil::IntersectVisitor::HitList hlist;
97    if (_viewer->computeIntersections(x, y, hlist))
98    {
99        for(osgUtil::IntersectVisitor::HitList::iterator hitr=hlist.begin();
100            hitr!=hlist.end();
101            ++hitr)
102        {
103            if (hitr->_geode.valid() && !hitr->_geode->getName().empty()) return hitr->_geode->getName();
104        }
105    }
106    return "";
107}
108
109osg::Node* createHUD(osgText::Text* updateText)
110{    // create the hud. derived from osgHud.cpp
111    // adds a set of quads, each in a separate Geode - which can be picked individually
112    // eg to be used as a menuing/help system!
113    // Can pick texts too!
114    osg::MatrixTransform* modelview_abs = new osg::MatrixTransform;
115    modelview_abs->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
116    modelview_abs->setMatrix(osg::Matrix::identity());
117   
118    osg::Projection* projection = new osg::Projection;
119    projection->setMatrix(osg::Matrix::ortho2D(0,1280,0,1024));
120    projection->addChild(modelview_abs);
121   
122   
123    std::string timesFont("fonts/times.ttf");
124   
125    // turn lighting off for the text and disable depth test to ensure its always ontop.
126    osg::Vec3 position(50.0f,510.0f,0.0f);
127    osg::Vec3 delta(0.0f,-60.0f,0.0f);
128
129    { // this displays what has been selected
130        osg::Geode* geode = new osg::Geode();
131        osg::StateSet* stateset = geode->getOrCreateStateSet();
132        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
133        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
134        geode->setName("The text label");
135        geode->addDrawable( updateText );
136        modelview_abs->addChild(geode);
137       
138        updateText->setCharacterSize(20.0f);
139        updateText->setFont(timesFont);
140        updateText->setColor(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
141        updateText->setText("");
142        updateText->setPosition(position);
143       
144        position += delta;
145    }   
146   
147    return projection;
148
149} // end create HUDf
150
151
152
153
154static osg::Vec3 defaultPos( 0.0f, 0.0f, 0.0f );
155static osg::Vec3 centerScope(0.0f, 0.0f, 0.0f);
156
157class Xample
158{
159    std::string texture;
160    std::string app;
161  public:
162      Xample(std::string image, std::string prog)
163    {
164        texture    = image;
165        app     = prog;
166        osg::notify(osg::INFO) << "New Xample!" << std::endl;
167    };
168    ~Xample() { };
169   
170    std::string getTexture()
171    {
172        return texture;
173    }
174    std::string getApp()
175    {
176        return app;
177    }
178}; // end class Xample
179
180
181typedef std::list<Xample>::iterator OP;
182static std::list<Xample> Xamplelist;
183
184
185void printList()
186{
187    osg::notify(osg::INFO) << "start printList()" << std::endl;
188    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i)
189    {
190        Xample& x = *i;
191        osg::notify(osg::INFO) << "current x.texture = " << x.getTexture() << std::endl;
192        osg::notify(osg::INFO) << "current x.app = " << x.getApp() << std::endl;
193    }
194    osg::notify(osg::INFO) << "end printList()" << std::endl;
195} // end printList()
196
197
198int runApp(std::string xapp)
199{
200    osg::notify(osg::INFO) << "start runApp()" << std::endl;
201    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i)
202    {
203        Xample& x = *i;
204        if(!xapp.compare(x.getApp()))
205        {
206            osg::notify(osg::INFO) << "app found!" << std::endl;
207           
208            const char* cxapp = xapp.c_str();
209           
210            osg::notify(osg::INFO) << "char* = " << cxapp <<std::endl;
211           
212            system(cxapp);
213            return 1;
214        }
215    }
216    osg::notify(osg::INFO) << "app not found!" << std::endl;
217    return 0;
218} // end printList()
219
220
221void readConfFile(char* confFile)                                                                // read confFile            1
222{
223    osg::notify(osg::INFO) << "Start reading confFile" << std::endl;
224   
225    std::string fileName = osgDB::findDataFile(confFile);
226    if (fileName.empty())
227    {
228        osg::notify(osg::INFO) << "Config file not found"<<confFile << std::endl;
229        return;
230    }
231   
232
233    std::ifstream in(fileName.c_str());
234    if (!in)
235    {
236        osg::notify(osg::INFO) << "File " << fileName << " can not be opened!" << std::endl;
237        exit(1);
238    }
239    std::string imageBuffer;
240    std::string appBuffer;
241   
242    while (!in.eof())
243    {
244        getline(in, imageBuffer);
245        getline(in, appBuffer);
246        if(imageBuffer == "" || appBuffer == "");
247        else
248        {
249            osg::notify(osg::INFO) << "imageBuffer: " << imageBuffer << std::endl;
250            osg::notify(osg::INFO) << "appBuffer: " << appBuffer << std::endl;
251//            jeweils checken ob image vorhanden ist.
252           
253            Xample tmp(imageBuffer, appBuffer);                                                    // create Xample objects    2
254           
255            Xamplelist.push_back(tmp);                                                            // store objects in list    2
256           
257        }
258    }
259   
260    in.close();
261   
262    osg::notify(osg::INFO) << "End reading confFile" << std::endl;
263   
264    printList();
265} // end readConfFile
266
267
268void SetObjectTextureState(osg::Geode *geodeCurrent, std::string texture)
269{
270    // retrieve or create a StateSet
271    osg::StateSet* stateTexture = geodeCurrent->getOrCreateStateSet();
272
273    // load texture.jpg as an image
274    osg::Image* imgTexture = osgDB::readImageFile( texture );
275   
276    // if the image is successfully loaded
277    if (imgTexture)
278    {
279        // create a new two-dimensional texture object
280        osg::Texture2D* texCube = new osg::Texture2D;
281
282        // set the texture to the loaded image
283        texCube->setImage(imgTexture);
284
285        // set the texture to the state
286        stateTexture->setTextureAttributeAndModes(0,texCube,osg::StateAttribute::ON);
287
288        // set the state of the current geode
289        geodeCurrent->setStateSet(stateTexture);
290    }
291} // end SetObjectTextureState
292
293
294osg::Geode* createTexturedCube(float fRadius,osg::Vec3 vPosition, std::string texture, std::string geodeName)
295{
296    // create a cube shape
297    osg::Box *bCube = new osg::Box(vPosition,fRadius);
298    // osg::Box *bCube = new osg::Box(vPosition,fRadius);
299
300    // create a container that makes the cube drawable
301    osg::ShapeDrawable *sdCube = new osg::ShapeDrawable(bCube);
302
303    // create a geode object to as a container for our drawable cube object
304    osg::Geode* geodeCube = new osg::Geode();
305    geodeCube->setName( geodeName );
306
307    // set the object texture state
308    SetObjectTextureState(geodeCube, texture);
309
310    // add our drawable cube to the geode container
311    geodeCube->addDrawable(sdCube);
312
313    return(geodeCube);
314} // end CreateCube
315
316
317osg::PositionAttitudeTransform* getPATransformation(osg::Node* object, osg::Vec3 position, osg::Vec3 scale, osg::Vec3 pivot)
318{
319    osg::PositionAttitudeTransform* tmpTrans = new osg::PositionAttitudeTransform();
320    tmpTrans->addChild( object );
321   
322    tmpTrans->setPosition( position );
323    tmpTrans->setScale( scale );
324    tmpTrans->setPivotPoint( pivot );
325   
326    return tmpTrans;
327}
328
329void printBoundings(osg::Node* current, std::string name)
330{
331    const osg::BoundingSphere& currentBound = current->getBound();
332    osg::notify(osg::INFO) << name << std::endl;
333    osg::notify(osg::INFO) << "center = " << currentBound.center() << std::endl;
334    osg::notify(osg::INFO) << "radius = " << currentBound.radius() << std::endl;
335   
336//    return currentBound.radius();
337}
338
339
340osg::Group* setupGraph()                                                                        // create Geodes/Nodes from Xamplelist    3
341{
342    osg::Group* xGroup = new osg::Group();
343
344   
345//    positioning and sizes
346    float defaultRadius = 0.8f;
347
348    int itemsInLine    = 4;                                    // name says everything
349    float offset    = 0.05f;
350    float bs        = (defaultRadius / 4) + offset;
351    float xstart    = (3*bs) * (-1);
352    float zstart    = xstart * (-1);
353    float xnext        = xstart;
354    float znext        = zstart;
355    float xjump        = (2*bs);
356    float zjump        = xjump;
357    osg::Vec3 vScale( 0.5f, 0.5f, 0.5f );
358    osg::Vec3 vPivot( 0.0f, 0.0f, 0.0f );   
359
360//  run through Xampleliste
361    int z = 1;
362    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i, ++z)
363    {
364        Xample& x = *i;
365       
366        osg::Node* tmpCube = createTexturedCube(defaultRadius, defaultPos, x.getTexture(), x.getApp());
367        printBoundings(tmpCube, x.getApp());
368        osg::Vec3 vPosition( xnext, 0.0f, znext );
369        osg::PositionAttitudeTransform*    transX = getPATransformation(tmpCube, vPosition, vScale, vPivot);
370        xGroup->addChild( transX );
371       
372        // line feed
373        if(z < itemsInLine)
374            xnext += xjump;
375        else
376        {
377            xnext = xstart;
378            znext -= zjump;
379            z = 0;
380        }
381    } // end run through list   
382   
383    return xGroup;
384} // end setupGraph
385
386
387int main( int argc, char **argv )
388{
389    if (argc<=1)
390    {
391        readConfFile("osg.conf");                                                                          // read ConfigFile        1
392    }
393    else
394    {
395        readConfFile(argv[1]);                                                                          // read ConfigFile        1
396    }
397   
398    // construct the viewer.
399    osgProducer::Viewer viewer;
400
401    // set up the value with sensible default event handlers.
402    viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
403   
404    osg::ref_ptr<osgText::Text> updateText = new osgText::Text;
405
406    // add the handler for doing the picking
407    viewer.getEventHandlerList().push_front(new PickHandler(&viewer,updateText.get()));
408
409    osg::Group* root = new osg::Group();
410
411    root->addChild( setupGraph() );
412
413    // add the HUD subgraph.   
414    root->addChild(createHUD(updateText.get()));
415   
416    // add model to viewer.
417    viewer.setSceneData( root );
418
419    // create the windows and run the threads.
420    viewer.realize();
421   
422    osg::Matrix lookAt;
423    lookAt.makeLookAt(osg::Vec3(0.0f, -4.0f, 0.0f), centerScope, osg::Vec3(0.0f, 0.0f, 1.0f));
424
425    //viewer.setView(lookAt);
426       
427    while( !viewer.done() )
428    {
429        // wait for all cull and draw threads to complete.
430        viewer.sync();
431
432        // update the scene by traversing it with the the update visitor which will
433        // call all node update callbacks and animations.
434        viewer.update();
435
436        // to be able to turn scene, place next call before viewer.update()
437        viewer.setView(lookAt);
438
439   
440        // fire off the cull and draw traversals of the scene.
441        viewer.frame();
442       
443    }
444   
445    // wait for all cull and draw threads to complete before exit.
446    viewer.sync();
447
448    return 0;
449} // end main
Note: See TracBrowser for help on using the browser.