root/OpenSceneGraph/trunk/examples/osgviewerFLTK/osgviewerFLTK.cpp @ 6864

Revision 6864, 5.4 kB (checked in by robert, 7 years ago)

Fixed includes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// C++ source file - (C) 2003 Robert Osfield, released under the OSGPL.
2// (C) 2005 Mike Weiblen http://mew.cx/ released under the OSGPL.
3// Simple example using GLUT to create an OpenGL window and OSG for rendering.
4// Derived from osgGLUTsimple.cpp and osgkeyboardmouse.cpp
5
6#include <osgViewer/Viewer>
7#include <osgViewer/CompositeViewer>
8#include <osgViewer/ViewerEventHandlers>
9#include <osgGA/TrackballManipulator>
10#include <osgDB/ReadFile>
11
12#include <FL/Fl.H>
13#include <FL/Fl_Gl_Window.H>
14
15#include <iostream>
16
17class AdapterWidget : public Fl_Gl_Window
18{
19public:
20
21    AdapterWidget(int x, int y, int w, int h, const char *label=0);
22    virtual ~AdapterWidget() {}
23
24    osgViewer::GraphicsWindow* getGraphicsWindow() { return _gw.get(); }
25    const osgViewer::GraphicsWindow* getGraphicsWindow() const { return _gw.get(); }
26
27    virtual void resize(int x, int y, int w, int h);
28
29protected:
30
31    virtual int handle(int event);
32   
33    osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> _gw;
34};
35
36AdapterWidget::AdapterWidget(int x, int y, int w, int h, const char *label):
37    Fl_Gl_Window(x, y, w, h, label)
38{
39    _gw = new osgViewer::GraphicsWindowEmbedded(x,y,w,h);
40}
41
42void AdapterWidget::resize(int x, int y, int w, int h)
43{
44    _gw->getEventQueue()->windowResize(x, y, w, h );
45    _gw->resized(x,y,w,h);
46
47    Fl_Gl_Window::resize(x,y,w,h);
48
49}
50
51int AdapterWidget::handle(int event)
52{
53    switch(event){
54        case FL_PUSH:
55            _gw->getEventQueue()->mouseButtonPress(Fl::event_x(), Fl::event_y(), Fl::event_button());
56            return 1;
57        case FL_MOVE:
58        case FL_DRAG:
59            _gw->getEventQueue()->mouseMotion(Fl::event_x(), Fl::event_y());
60            return 1;
61        case FL_RELEASE:
62            _gw->getEventQueue()->mouseButtonRelease(Fl::event_x(), Fl::event_y(), Fl::event_button());
63            return 1;
64        case FL_KEYDOWN:
65            _gw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol)Fl::event_key());
66            return 1;
67        case FL_KEYUP:
68            _gw->getEventQueue()->keyRelease((osgGA::GUIEventAdapter::KeySymbol)Fl::event_key());
69            return 1;
70        default:
71            // pass other events to the base class
72            return Fl_Gl_Window::handle(event);
73    }
74}
75
76void idle_cb()
77{
78    Fl::redraw();
79}
80
81class ViewerFLTK : public osgViewer::Viewer, public AdapterWidget
82{
83    public:
84        ViewerFLTK(int x, int y, int w, int h, const char *label=0):
85            AdapterWidget(x,y,w,h,label)
86            {
87                getCamera()->setViewport(new osg::Viewport(0,0,w,h));
88                getCamera()->setGraphicsContext(getGraphicsWindow());
89                setThreadingModel(osgViewer::Viewer::SingleThreaded);
90            }
91
92    protected:
93        virtual void draw() { frame(); }
94
95};
96
97class CompositeViewerFLTK : public osgViewer::CompositeViewer, public AdapterWidget
98{
99    public:
100
101        CompositeViewerFLTK(int x, int y, int w, int h, const char *label=0):
102            AdapterWidget(x,y,w,h,label)
103        {
104            setThreadingModel(osgViewer::CompositeViewer::SingleThreaded);
105        }
106
107    protected:
108        virtual void draw() { frame(); }
109
110};
111
112
113int main( int argc, char **argv )
114{
115   
116    if (argc<2)
117    {
118        std::cout << argv[0] <<": requires filename argument." << std::endl;
119        return 1;
120    }
121
122    osg::ArgumentParser arguments(&argc, argv);
123
124    // load the scene.
125    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFiles(arguments);
126    if (!loadedModel)
127    {
128        std::cout << argv[0] <<": No data loaded." << std::endl;
129        return 1;
130    }
131
132
133    if (arguments.read("--CompositeViewer"))
134    {
135        unsigned int width = 1024;
136        unsigned int height = 800;
137
138        CompositeViewerFLTK viewerWindow(100,100,width,height);
139        viewerWindow.resizable(&viewerWindow);
140       
141        {
142            osgViewer::View* view1 = new osgViewer::View;
143            view1->getCamera()->setGraphicsContext(viewerWindow.getGraphicsWindow());
144            view1->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width)/static_cast<double>(height/2), 1.0, 1000.0);
145            view1->getCamera()->setViewport(new osg::Viewport(0,0,width,height/2));
146            view1->setCameraManipulator(new osgGA::TrackballManipulator);
147            view1->setSceneData(loadedModel.get());
148           
149            viewerWindow.addView(view1);
150        }
151       
152        {
153            osgViewer::View* view2 = new osgViewer::View;
154            view2->getCamera()->setGraphicsContext(viewerWindow.getGraphicsWindow());
155            view2->getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width)/static_cast<double>(height/2), 1.0, 1000.0);
156            view2->getCamera()->setViewport(new osg::Viewport(0,height/2,width,height/2));
157            view2->setCameraManipulator(new osgGA::TrackballManipulator);
158            view2->setSceneData(loadedModel.get());
159           
160            viewerWindow.addView(view2);
161        }
162
163        viewerWindow.show();
164
165        Fl::set_idle(idle_cb);
166
167        return Fl::run();
168    }
169    else
170    {
171
172        ViewerFLTK viewerWindow(100,100,800,600);
173        viewerWindow.resizable(&viewerWindow);
174
175        viewerWindow.setSceneData(loadedModel.get());
176        viewerWindow.setCameraManipulator(new osgGA::TrackballManipulator);
177        viewerWindow.addEventHandler(new osgViewer::StatsHandler);
178
179        viewerWindow.show();
180
181        Fl::set_idle(idle_cb);
182
183        return Fl::run();
184    }
185}
Note: See TracBrowser for help on using the browser.