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

Revision 5927, 12.2 kB (checked in by robert, 8 years ago)

Ported following examples to osgViewer:

osggeodemo
osggeometry
osghud
osgimpostor
osgkeyboard
osglauncher
osglight
osglightpoint
osglogicop
osglogo
osgmovie
osgmultiplecameras
osgmultitexture
osgoccluder
osgparametric
osgparticle

  • 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#include <osg/io_utils>
21
22#include <osgUtil/Tesselator>
23#include <osgUtil/CullVisitor>
24#include <osgUtil/Optimizer>
25
26#include <osgText/Text>
27
28#include <osgGA/TrackballManipulator>
29
30#include <osgViewer/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(osgViewer::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    osgViewer::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#if 0
97    osgUtil::IntersectVisitor::HitList hlist;
98    if (_viewer->computeIntersections(x, y, hlist))
99    {
100        for(osgUtil::IntersectVisitor::HitList::iterator hitr=hlist.begin();
101            hitr!=hlist.end();
102            ++hitr)
103        {
104            if (hitr->_geode.valid() && !hitr->_geode->getName().empty()) return hitr->_geode->getName();
105        }
106    }
107#else
108    osg::notify(osg::NOTICE)<<"Picking not implemented yet "<<x<<", "<<y<<std::endl;
109#endif   
110    return "";
111}
112
113osg::Node* createHUD(osgText::Text* updateText)
114{    // create the hud. derived from osgHud.cpp
115    // adds a set of quads, each in a separate Geode - which can be picked individually
116    // eg to be used as a menuing/help system!
117    // Can pick texts too!
118    osg::MatrixTransform* modelview_abs = new osg::MatrixTransform;
119    modelview_abs->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
120    modelview_abs->setMatrix(osg::Matrix::identity());
121   
122    osg::Projection* projection = new osg::Projection;
123    projection->setMatrix(osg::Matrix::ortho2D(0,1280,0,1024));
124    projection->addChild(modelview_abs);
125   
126   
127    std::string timesFont("fonts/times.ttf");
128   
129    // turn lighting off for the text and disable depth test to ensure its always ontop.
130    osg::Vec3 position(50.0f,510.0f,0.0f);
131    osg::Vec3 delta(0.0f,-60.0f,0.0f);
132
133    { // this displays what has been selected
134        osg::Geode* geode = new osg::Geode();
135        osg::StateSet* stateset = geode->getOrCreateStateSet();
136        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
137        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
138        geode->setName("The text label");
139        geode->addDrawable( updateText );
140        modelview_abs->addChild(geode);
141       
142        updateText->setCharacterSize(20.0f);
143        updateText->setFont(timesFont);
144        updateText->setColor(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
145        updateText->setText("");
146        updateText->setPosition(position);
147       
148        position += delta;
149    }   
150   
151    return projection;
152
153} // end create HUDf
154
155
156
157
158static osg::Vec3 defaultPos( 0.0f, 0.0f, 0.0f );
159static osg::Vec3 centerScope(0.0f, 0.0f, 0.0f);
160
161class Xample
162{
163    std::string texture;
164    std::string app;
165  public:
166      Xample(std::string image, std::string prog)
167    {
168        texture    = image;
169        app     = prog;
170        osg::notify(osg::INFO) << "New Xample!" << std::endl;
171    };
172    ~Xample() { };
173   
174    std::string getTexture()
175    {
176        return texture;
177    }
178    std::string getApp()
179    {
180        return app;
181    }
182}; // end class Xample
183
184
185typedef std::list<Xample>::iterator OP;
186static std::list<Xample> Xamplelist;
187
188
189void printList()
190{
191    osg::notify(osg::INFO) << "start printList()" << std::endl;
192    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i)
193    {
194        Xample& x = *i;
195        osg::notify(osg::INFO) << "current x.texture = " << x.getTexture() << std::endl;
196        osg::notify(osg::INFO) << "current x.app = " << x.getApp() << std::endl;
197    }
198    osg::notify(osg::INFO) << "end printList()" << std::endl;
199} // end printList()
200
201
202int runApp(std::string xapp)
203{
204    osg::notify(osg::INFO) << "start runApp()" << std::endl;
205    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i)
206    {
207        Xample& x = *i;
208        if(!xapp.compare(x.getApp()))
209        {
210            osg::notify(osg::INFO) << "app found!" << std::endl;
211           
212            const char* cxapp = xapp.c_str();
213           
214            osg::notify(osg::INFO) << "char* = " << cxapp <<std::endl;
215           
216            system(cxapp);
217            return 1;
218        }
219    }
220    osg::notify(osg::INFO) << "app not found!" << std::endl;
221    return 0;
222} // end printList()
223
224
225void readConfFile(char* confFile)                                                                // read confFile            1
226{
227    osg::notify(osg::INFO) << "Start reading confFile" << std::endl;
228   
229    std::string fileName = osgDB::findDataFile(confFile);
230    if (fileName.empty())
231    {
232        osg::notify(osg::INFO) << "Config file not found"<<confFile << std::endl;
233        return;
234    }
235   
236
237    std::ifstream in(fileName.c_str());
238    if (!in)
239    {
240        osg::notify(osg::INFO) << "File " << fileName << " can not be opened!" << std::endl;
241        exit(1);
242    }
243    std::string imageBuffer;
244    std::string appBuffer;
245   
246    while (!in.eof())
247    {
248        std::getline(in, imageBuffer);
249        std::getline(in, appBuffer);
250        if(imageBuffer == "" || appBuffer == "");
251        else
252        {
253            osg::notify(osg::INFO) << "imageBuffer: " << imageBuffer << std::endl;
254            osg::notify(osg::INFO) << "appBuffer: " << appBuffer << std::endl;
255//            jeweils checken ob image vorhanden ist.
256           
257            Xample tmp(imageBuffer, appBuffer);                                                    // create Xample objects    2
258           
259            Xamplelist.push_back(tmp);                                                            // store objects in list    2
260           
261        }
262    }
263   
264    in.close();
265   
266    osg::notify(osg::INFO) << "End reading confFile" << std::endl;
267   
268    printList();
269} // end readConfFile
270
271
272void SetObjectTextureState(osg::Geode *geodeCurrent, std::string texture)
273{
274    // retrieve or create a StateSet
275    osg::StateSet* stateTexture = geodeCurrent->getOrCreateStateSet();
276
277    // load texture.jpg as an image
278    osg::Image* imgTexture = osgDB::readImageFile( texture );
279   
280    // if the image is successfully loaded
281    if (imgTexture)
282    {
283        // create a new two-dimensional texture object
284        osg::Texture2D* texCube = new osg::Texture2D;
285
286        // set the texture to the loaded image
287        texCube->setImage(imgTexture);
288
289        // set the texture to the state
290        stateTexture->setTextureAttributeAndModes(0,texCube,osg::StateAttribute::ON);
291
292        // set the state of the current geode
293        geodeCurrent->setStateSet(stateTexture);
294    }
295} // end SetObjectTextureState
296
297
298osg::Geode* createTexturedCube(float fRadius,osg::Vec3 vPosition, std::string texture, std::string geodeName)
299{
300    // create a cube shape
301    osg::Box *bCube = new osg::Box(vPosition,fRadius);
302    // osg::Box *bCube = new osg::Box(vPosition,fRadius);
303
304    // create a container that makes the cube drawable
305    osg::ShapeDrawable *sdCube = new osg::ShapeDrawable(bCube);
306
307    // create a geode object to as a container for our drawable cube object
308    osg::Geode* geodeCube = new osg::Geode();
309    geodeCube->setName( geodeName );
310
311    // set the object texture state
312    SetObjectTextureState(geodeCube, texture);
313
314    // add our drawable cube to the geode container
315    geodeCube->addDrawable(sdCube);
316
317    return(geodeCube);
318} // end CreateCube
319
320
321osg::PositionAttitudeTransform* getPATransformation(osg::Node* object, osg::Vec3 position, osg::Vec3 scale, osg::Vec3 pivot)
322{
323    osg::PositionAttitudeTransform* tmpTrans = new osg::PositionAttitudeTransform();
324    tmpTrans->addChild( object );
325   
326    tmpTrans->setPosition( position );
327    tmpTrans->setScale( scale );
328    tmpTrans->setPivotPoint( pivot );
329   
330    return tmpTrans;
331}
332
333void printBoundings(osg::Node* current, std::string name)
334{
335    const osg::BoundingSphere& currentBound = current->getBound();
336    osg::notify(osg::INFO) << name << std::endl;
337    osg::notify(osg::INFO) << "center = " << currentBound.center() << std::endl;
338    osg::notify(osg::INFO) << "radius = " << currentBound.radius() << std::endl;
339   
340//    return currentBound.radius();
341}
342
343
344osg::Group* setupGraph()                                                                        // create Geodes/Nodes from Xamplelist    3
345{
346    osg::Group* xGroup = new osg::Group();
347
348   
349//    positioning and sizes
350    float defaultRadius = 0.8f;
351
352    int itemsInLine    = 4;                                    // name says everything
353    float offset    = 0.05f;
354    float bs        = (defaultRadius / 4) + offset;
355    float xstart    = (3*bs) * (-1);
356    float zstart    = xstart * (-1);
357    float xnext        = xstart;
358    float znext        = zstart;
359    float xjump        = (2*bs);
360    float zjump        = xjump;
361    osg::Vec3 vScale( 0.5f, 0.5f, 0.5f );
362    osg::Vec3 vPivot( 0.0f, 0.0f, 0.0f );   
363
364//  run through Xampleliste
365    int z = 1;
366    for (OP i = Xamplelist.begin() ; i != Xamplelist.end() ; ++i, ++z)
367    {
368        Xample& x = *i;
369       
370        osg::Node* tmpCube = createTexturedCube(defaultRadius, defaultPos, x.getTexture(), x.getApp());
371        printBoundings(tmpCube, x.getApp());
372        osg::Vec3 vPosition( xnext, 0.0f, znext );
373        osg::PositionAttitudeTransform*    transX = getPATransformation(tmpCube, vPosition, vScale, vPivot);
374        xGroup->addChild( transX );
375       
376        // line feed
377        if(z < itemsInLine)
378            xnext += xjump;
379        else
380        {
381            xnext = xstart;
382            znext -= zjump;
383            z = 0;
384        }
385    } // end run through list   
386   
387    return xGroup;
388} // end setupGraph
389
390
391int main( int argc, char **argv )
392{
393    if (argc<=1)
394    {
395        readConfFile("osg.conf");                                                                          // read ConfigFile        1
396    }
397    else
398    {
399        readConfFile(argv[1]);                                                                          // read ConfigFile        1
400    }
401   
402    // construct the viewer.
403    osgViewer::Viewer viewer;
404
405    osg::ref_ptr<osgText::Text> updateText = new osgText::Text;
406
407    // add the handler for doing the picking
408    viewer.addEventHandler(new PickHandler(&viewer,updateText.get()));
409
410    osg::Group* root = new osg::Group();
411
412    root->addChild( setupGraph() );
413
414    // add the HUD subgraph.   
415    root->addChild(createHUD(updateText.get()));
416   
417    // add model to viewer.
418    viewer.setSceneData( root );
419
420    // create the windows and run the threads.
421    viewer.realize();
422   
423    osg::Matrix lookAt;
424    lookAt.makeLookAt(osg::Vec3(0.0f, -4.0f, 0.0f), centerScope, osg::Vec3(0.0f, 0.0f, 1.0f));
425
426    viewer.getCamera()->setViewMatrix(lookAt);
427       
428    viewer.realize();
429
430    while( !viewer.done() )
431    {
432        // fire off the cull and draw traversals of the scene.
433        viewer.frame();       
434    }
435
436    return 0;
437} // end main
Note: See TracBrowser for help on using the browser.