root/OpenSceneGraph/trunk/examples/osgsequence/osgsequence.cpp @ 1844

Revision 1844, 6.2 kB (checked in by robert, 12 years ago)

Added desciptions to all the demos.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// -*-c++-*-
2
3#include <osg/Group>
4#include <osg/Sequence>
5#include <osg/MatrixTransform>
6
7#include <osgDB/ReadFile>
8
9#include <osgProducer/Viewer>
10
11
12//
13// A simple demo demonstrating usage of osg::Sequence.
14//
15
16// simple event handler to start/stop sequences
17class MyEventHandler : public osgGA::GUIEventHandler {
18public:
19    /// Constructor.
20    MyEventHandler(std::vector<osg::Sequence*>* seq)
21    {
22        _seq = seq;
23    }
24
25    /// Handle events.
26    virtual bool handle(const osgGA::GUIEventAdapter& ea,
27                        osgGA::GUIActionAdapter&)
28    {
29        bool handled = false;
30
31        if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN)
32        {
33            const char keys[] = "!@#$%^&*()";
34            for (unsigned int i = 0; i < (sizeof(keys) / sizeof(keys[0])); i++) {
35                if (i < _seq->size() && ea.getKey() == keys[i])
36                {
37                    // toggle sequence
38                    osg::Sequence* seq = (*_seq)[i];
39                    osg::Sequence::SequenceMode mode = seq->getMode();
40                    switch (mode) {
41                    case osg::Sequence::START:
42                        seq->setMode(osg::Sequence::PAUSE);
43                        break;
44                    case osg::Sequence::STOP:
45                        seq->setMode(osg::Sequence::START);
46                        break;
47                    case osg::Sequence::PAUSE:
48                        seq->setMode(osg::Sequence::RESUME);
49                        break;
50                    default:
51                        break;
52                    }
53                    std::cerr << "Toggled sequence " << i << std::endl;
54                    handled = true;
55                }
56            }
57        }
58
59        return handled;
60    }
61
62    /// accept visits.
63    virtual void accept(osgGA::GUIEventHandlerVisitor&) {}
64
65private:
66    std::vector<osg::Sequence*>* _seq;
67};
68
69osg::Sequence* generateSeq(osg::Sequence::LoopMode mode,
70                           float speed, int nreps,
71                           std::vector<osg::Node*>& model)
72{
73    osg::Sequence* seqNode = new osg::Sequence;
74
75    // add children, show each child for 1.0 seconds
76    for (unsigned int i = 0; i < model.size(); i++) {
77        seqNode->addChild(model[i]);
78        seqNode->setTime(i, 1.0f);
79    }
80
81    // interval
82    seqNode->setInterval(mode, 0, -1);
83
84    // speed-up factor and number of repeats for entire sequence
85    seqNode->setDuration(speed, nreps);
86
87    // stopped
88    seqNode->setMode(osg::Sequence::STOP);
89
90    return seqNode;
91}
92
93int main( int argc, char **argv )
94{
95    // use an ArgumentParser object to manage the program arguments.
96    osg::ArgumentParser arguments(&argc,argv);
97
98    // set up the usage document, in case we need to print out how to use this program.
99    arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates use of osg::Sequence.");
100    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
101    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
102   
103    // construct the viewer.
104    osgProducer::Viewer viewer(arguments);
105
106    // set up the value with sensible default event handlers.
107    viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS);
108
109    // get details on keyboard and mouse bindings used by the viewer.
110    viewer.getUsage(*arguments.getApplicationUsage());
111
112    // if user request help write it out to cout.
113    if (arguments.read("-h") || arguments.read("--help"))
114    {
115        arguments.getApplicationUsage()->write(std::cout);
116        return 1;
117    }
118
119    // any option left unread are converted into errors to write out later.
120    arguments.reportRemainingOptionsAsUnrecognized();
121
122    // report any errors if they have occured when parsing the program aguments.
123    if (arguments.errors())
124    {
125        arguments.writeErrorMessages(std::cout);
126        return 1;
127    }
128   
129    if (arguments.argc()<=1)
130    {
131        arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
132        return 1;
133    }
134   
135    // assumes any remaining parameters are models
136    std::vector<osg::Node*> model;
137    for (int i = 1; i < arguments.argc(); i++)
138    {
139        std::cerr << "Loading " << arguments[i] << std::endl;
140        osg::Node* node = osgDB::readNodeFile(arguments[i]);
141        if (node)
142            model.push_back(node);
143    }
144    if (model.empty()) {
145        return -1;
146    }
147
148    // root
149    osg::Group* rootNode = new osg::Group;
150
151    // create sequences
152    std::vector<osg::Sequence*> seq;
153
154    const osg::Sequence::LoopMode mode[] = { osg::Sequence::LOOP,
155                                             osg::Sequence::SWING,
156                                             osg::Sequence::LOOP };
157    const float speed[] = { 0.5f, 1.0f, 1.5f };
158    const int nreps[] = { -1, 5, 1 };
159
160    float x = 0.0f;
161    for (unsigned int j = 0; j < (sizeof(speed) / sizeof(speed[0])); j++) {
162        osg::Sequence* seqNode = generateSeq(mode[j], speed[j], nreps[j],
163                                             model);
164        if (!seqNode)
165            continue;
166        seq.push_back(seqNode);
167
168        // position sequence
169        osg::Matrix matrix;
170        matrix.makeTranslate(x, 0.0, 0.0);
171
172        osg::MatrixTransform* xform = new osg::MatrixTransform;
173        xform->setMatrix(matrix);
174        xform->addChild(seqNode);
175
176        rootNode->addChild(xform);
177
178        x += seqNode->getBound()._radius * 1.5f;
179    }
180
181
182    // add model to viewer.
183    viewer.setSceneData(rootNode);
184
185    // register additional event handler
186    viewer.getEventHandlerList().push_front(new MyEventHandler(&seq));
187
188    // create the windows and run the threads.
189    viewer.realize();
190
191    while( !viewer.done() )
192    {
193        // wait for all cull and draw threads to complete.
194        viewer.sync();
195
196        // update the scene by traversing it with the the update visitor which will
197        // call all node update callbacks and animations.
198        viewer.update();
199         
200        // fire off the cull and draw traversals of the scene.
201        viewer.frame();
202       
203    }
204   
205    // wait for all cull and draw threads to complete before exit.
206    viewer.sync();
207
208    return 0;
209}
Note: See TracBrowser for help on using the browser.