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

Revision 5928, 12.2 kB (checked in by robert, 7 years ago)

From Paul Martz and Robert Osfield, renamed include/osgUtil/Tesselator and associated classes/references to Tessellator etc.

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