]> git.mxchange.org Git - flightgear.git/blob - utils/fgviewer/Drawable.cxx
fgviewer: Import hla based viewer application.
[flightgear.git] / utils / fgviewer / Drawable.cxx
1 // Viewer.hxx -- alternative flightgear viewer application
2 //
3 // Copyright (C) 2009 - 2012  Mathias Froehlich
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License as
7 // published by the Free Software Foundation; either version 2 of the
8 // License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful, but
11 // WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 // General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18
19 #ifdef HAVE_CONFIG_H
20 #include <config.h>
21 #endif
22
23 #include "Drawable.hxx"
24
25 #include "Viewer.hxx"
26
27 namespace fgviewer  {
28
29 class Drawable::_ResizedCallback : public osg::GraphicsContext::ResizedCallback {
30 public:
31     _ResizedCallback(Drawable* drawable) :
32         _drawable(drawable)
33     { }
34     virtual ~_ResizedCallback()
35     { }
36     virtual void resizedImplementation(osg::GraphicsContext*, int x, int y, int width, int height)
37     {
38         SGSharedPtr<Drawable> drawable = _drawable.lock();
39         if (!drawable.valid())
40             return;
41         drawable->resize(x, y, width, height);
42     }
43     SGWeakPtr<Drawable> _drawable;
44 };
45
46 Drawable::Drawable(const std::string& name) :
47     _name(name),
48     _position(0, 0),
49     _size(600, 800),
50     _offscreen(false),
51     _fullscreen(false)
52 {
53 }
54
55 Drawable::~Drawable()
56 {
57 }
58
59 void
60 Drawable::attachSlaveCamera(SlaveCamera* slaveCamera)
61 {
62     if (!slaveCamera)
63         return;
64     _slaveCameraList.push_back(slaveCamera);
65 }
66
67 bool
68 Drawable::resize(int x, int y, int width, int height)
69 {
70     unsigned numCameras = _slaveCameraList.size();
71     if (1 < numCameras)
72         return false;
73     _graphicsContext->resizedImplementation(x, y, width, height);
74     if (numCameras < 1)
75         return true;
76     _slaveCameraList.front()->setViewport(SGVec4i(0, 0, width, height));
77     return true;
78 }
79     
80 bool
81 Drawable::realize(Viewer& viewer)
82 {
83     if (_graphicsContext.valid())
84         return false;
85     _graphicsContext = _realizeImplementation(viewer);
86     if (!_graphicsContext.valid())
87         return false;
88     _graphicsContext->setResizedCallback(new _ResizedCallback(this));
89     return true;
90 }
91     
92 osg::GraphicsContext*
93 Drawable::_realizeImplementation(Viewer& viewer)
94 {
95     osg::ref_ptr<osg::GraphicsContext::Traits> traits = _getTraits(viewer);
96     return viewer.createGraphicsContext(traits.get());
97 }
98     
99 osg::ref_ptr<osg::GraphicsContext::Traits>
100 Drawable::_getTraits(Viewer& viewer)
101 {
102     osg::GraphicsContext::ScreenIdentifier screenIdentifier;
103     screenIdentifier.setScreenIdentifier(_screenIdentifier);
104     
105     osg::ref_ptr<osg::GraphicsContext::Traits> traits;
106     traits = viewer.getTraits(screenIdentifier);
107     
108     // The window name as displayed by the window manager
109     traits->windowName = getName();
110     
111     traits->x = _position[0];
112     traits->y = _position[1];
113     if (!_fullscreen) {
114         traits->width = _size[0];
115         traits->height = _size[1];
116     }
117     
118     traits->windowDecoration = !_fullscreen;
119     if (_slaveCameraList.size() <= 1)
120         traits->supportsResize = true;
121     else
122         traits->supportsResize = false;
123     traits->pbuffer = _offscreen;
124     
125     return traits;
126 }
127
128 } // namespace fgviewer