Line data Source code
1 :
2 : /* Copyright (c) 2011-2017, Stefan Eilemann <eile@eyescale.ch>
3 : * Daniel Nachbaur <danielnachbaur@gmail.com>
4 : *
5 : * This library is free software; you can redistribute it and/or modify it under
6 : * the terms of the GNU Lesser General Public License version 2.1 as published
7 : * by the Free Software Foundation.
8 : *
9 : * This library is distributed in the hope that it will be useful, but WITHOUT
10 : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 : * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 : * details.
13 : *
14 : * You should have received a copy of the GNU Lesser General Public License
15 : * along with this library; if not, write to the Free Software Foundation, Inc.,
16 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 : */
18 :
19 : #include "masterConfig.h"
20 :
21 : #include "objectMap.h"
22 : #include "view.h"
23 :
24 : #include <eq/eventICommand.h>
25 : #include <eq/fabric/configVisitor.h>
26 : #include <eq/fabric/pointerEvent.h>
27 : #include <eq/fabric/sizeEvent.h>
28 : #include <eq/fabric/statistic.h>
29 : #include <seq/application.h>
30 :
31 : namespace seq
32 : {
33 : namespace detail
34 : {
35 1 : MasterConfig::MasterConfig(eq::ServerPtr parent)
36 : : Config(parent)
37 1 : , _redraw(false)
38 : {
39 1 : }
40 :
41 2 : MasterConfig::~MasterConfig()
42 : {
43 2 : }
44 :
45 1 : bool MasterConfig::init()
46 : {
47 1 : LBASSERT(!_objects);
48 1 : _objects = new ObjectMap(*this, *getApplication());
49 :
50 1 : co::Object* initData = getInitData();
51 1 : if (initData)
52 0 : LBCHECK(_objects->register_(initData, OBJECTTYPE_INITDATA));
53 1 : _objects->setInitData(initData);
54 :
55 1 : LBCHECK(registerObject(_objects));
56 :
57 1 : if (!eq::Config::init(_objects->getID()))
58 : {
59 0 : LBWARN << "Error during initialization" << std::endl;
60 0 : exit();
61 0 : return false;
62 : }
63 :
64 1 : _redraw = true;
65 1 : return true;
66 : }
67 :
68 1 : bool MasterConfig::exit()
69 : {
70 1 : const bool retVal = eq::Config::exit();
71 :
72 1 : if (_objects)
73 1 : deregisterObject(_objects);
74 1 : _objects->clear();
75 1 : delete _objects;
76 1 : _objects = 0;
77 :
78 1 : return retVal;
79 : }
80 :
81 1 : bool MasterConfig::run(co::Object* frameData)
82 : {
83 1 : LBASSERT(_objects);
84 1 : if (frameData)
85 0 : LBCHECK(_objects->register_(frameData, OBJECTTYPE_FRAMEDATA));
86 1 : _objects->setFrameData(frameData);
87 :
88 1 : seq::Application* const app = getApplication();
89 3 : while (isRunning())
90 : {
91 1 : startFrame();
92 1 : finishFrame();
93 :
94 5 : while (!needRedraw()) // wait for an event requiring redraw
95 : {
96 2 : if (app->hasCommands()) // execute non-critical pending commands
97 : {
98 1 : app->processCommand();
99 1 : handleEvents(); // non-blocking
100 : }
101 : else // no pending commands, block on user event
102 : {
103 2 : const eq::EventICommand& event = getNextEvent();
104 1 : if (!Config::handleEvent(event))
105 1 : LBVERB << "Unhandled " << event << std::endl;
106 : }
107 : }
108 1 : handleEvents(); // process all pending events
109 : }
110 1 : finishAllFrames();
111 1 : return true;
112 : }
113 :
114 1 : uint32_t MasterConfig::startFrame()
115 : {
116 1 : _redraw = false;
117 1 : return eq::Config::startFrame(_objects->commit());
118 : }
119 :
120 : namespace
121 : {
122 : class ViewUpdateVisitor : public eq::ConfigVisitor
123 : {
124 : public:
125 1 : explicit ViewUpdateVisitor(bool& redraw)
126 1 : : _redraw(redraw)
127 : {
128 1 : }
129 1 : virtual ~ViewUpdateVisitor() {}
130 7 : virtual eq::VisitorResult visit(eq::View* v)
131 : {
132 7 : View* view = static_cast<View*>(v);
133 7 : if (view->updateData())
134 : {
135 1 : LBVERB << "Redraw: new view data" << std::endl;
136 1 : _redraw = true;
137 : }
138 7 : return eq::TRAVERSE_CONTINUE;
139 : }
140 :
141 : private:
142 : bool& _redraw;
143 : };
144 : }
145 :
146 : template <class E>
147 0 : bool MasterConfig::_handleEvent(eq::EventType type, E& event)
148 : {
149 0 : if (Config::handleEvent(type, event))
150 0 : _redraw = true;
151 :
152 0 : if (_currentViewID == 0)
153 0 : return _redraw;
154 :
155 0 : View* view = static_cast<View*>(find<eq::View>(_currentViewID));
156 0 : if (view && view->handleEvent(type, event))
157 0 : _redraw = true;
158 :
159 0 : return _redraw;
160 : }
161 :
162 : template <class E>
163 0 : bool MasterConfig::_handleEvent(E& event)
164 : {
165 0 : if (Config::handleEvent(event))
166 0 : _redraw = true;
167 :
168 0 : if (_currentViewID == 0)
169 0 : return _redraw;
170 :
171 0 : View* view = static_cast<View*>(find<eq::View>(_currentViewID));
172 0 : if (view && view->handleEvent(event))
173 0 : _redraw = true;
174 :
175 0 : return _redraw;
176 : }
177 :
178 15 : bool MasterConfig::handleEvent(EventICommand command)
179 : {
180 15 : switch (command.getEventType())
181 : {
182 : case EVENT_REDRAW:
183 0 : _redraw = true;
184 0 : LBVERB << "Redraw request" << std::endl;
185 0 : return true;
186 :
187 : default:
188 15 : return Config::handleEvent(command);
189 : }
190 : }
191 :
192 0 : bool MasterConfig::handleEvent(const eq::EventType type, const SizeEvent& event)
193 : {
194 0 : _redraw = true;
195 0 : return _handleEvent(type, event);
196 : }
197 :
198 0 : bool MasterConfig::handleEvent(const eq::EventType type,
199 : const PointerEvent& event)
200 : {
201 0 : switch (type)
202 : {
203 : case EVENT_CHANNEL_POINTER_BUTTON_PRESS:
204 0 : _currentViewID = event.context.view.identifier;
205 0 : break;
206 :
207 : default:
208 0 : break;
209 : }
210 :
211 0 : return _handleEvent(type, event);
212 : }
213 :
214 0 : bool MasterConfig::handleEvent(const eq::EventType type, const KeyEvent& event)
215 : {
216 0 : return _handleEvent(type, event);
217 : }
218 :
219 0 : bool MasterConfig::handleEvent(const AxisEvent& event)
220 : {
221 0 : return _handleEvent(event);
222 : }
223 :
224 0 : bool MasterConfig::handleEvent(const ButtonEvent& event)
225 : {
226 0 : return _handleEvent(event);
227 : }
228 :
229 1 : bool MasterConfig::handleEvent(const eq::EventType type, const Event& event)
230 : {
231 1 : if (Config::handleEvent(type, event))
232 0 : _redraw = true;
233 :
234 1 : switch (type)
235 : {
236 : case EVENT_WINDOW_EXPOSE:
237 : case EVENT_WINDOW_CLOSE:
238 1 : _redraw = true;
239 1 : return true;
240 :
241 : default:
242 0 : return _redraw;
243 : }
244 : }
245 :
246 15 : void MasterConfig::addStatistic(const Statistic& stat)
247 : {
248 15 : Config::addStatistic(stat);
249 15 : if (stat.type == eq::Statistic::CONFIG_FINISH_FRAME)
250 : {
251 2 : ViewUpdateVisitor viewUpdate(_redraw);
252 1 : accept(viewUpdate);
253 : }
254 15 : }
255 : }
256 30 : }
|