Ticket #8711: backends-lib.v3.5.patch
File backends-lib.v3.5.patch, 23.8 KB (added by , 17 years ago) |
---|
-
backends/events/default/default-events.cpp
35 35 36 36 DefaultEventManager::DefaultEventManager(OSystem *boss) : 37 37 _boss(boss), 38 _keyMapper(boss->getKeyMapper()), 39 _virtualKeyboard(boss->getVirtualKeyboard()), 38 40 _buttonState(0), 39 41 _modifierState(0), 40 42 _shouldQuit(false) { … … 52 54 result = _boss->pollEvent(event); 53 55 54 56 if (result) { 57 // check if we have to resolve virtual keyboard event 58 bool lbutton = event.type == Common::EVENT_LBUTTONDOWN || event.type == Common::EVENT_LBUTTONUP; 59 if (_boss->getFeatureState(OSystem::kFeatureVirtualKeyboard) && _virtualKeyboard && lbutton) { // possibly a virtual keyboard event 60 _virtualKeyboard->resolve(event); // try to resolve a virtual keyboard event 61 } 62 63 // check if we have to resolve key mapping 64 if (_keyMapper) { 65 _keyMapper->resolve(event); 66 } 67 55 68 event.synthetic = false; 56 69 switch (event.type) { 57 70 case Common::EVENT_KEYDOWN: … … 128 141 return result; 129 142 } 130 143 144 void DefaultEventManager::registerActions(const Common::ActionList actions) { 145 if (_keyMapper) { 146 _keyMapper->registerActions(actions); 147 } 148 } 149 void DefaultEventManager::unregisterActions() { 150 if (_keyMapper) { 151 _keyMapper->unregisterActions(); 152 } 153 } 154 void DefaultEventManager::mapActions() { 155 if (_keyMapper) { 156 _keyMapper->mapActions(); 157 } 158 } 159 160 131 161 #endif // !defined(DISABLE_DEFAULT_EVENTMANAGER) -
backends/events/default/default-events.h
43 43 44 44 class DefaultEventManager : public Common::EventManager { 45 45 OSystem *_boss; 46 KeyMapper *_keyMapper; 47 VirtualKeyboard *_virtualKeyboard; 46 48 47 49 Common::Point _mousePos; 48 50 int _buttonState; … … 67 69 68 70 virtual bool pollEvent(Common::Event &event); 69 71 72 virtual void registerActions(const Common::ActionList); 73 virtual void unregisterActions(); 74 virtual void mapActions(); 75 70 76 virtual Common::Point getMousePos() const { return _mousePos; } 71 77 virtual int getButtonState() const { return _buttonState; } 72 78 virtual int getModifierState() const { return _modifierState; } -
backends/platform/sdl/sdl.cpp
257 257 memset(&_mouseCurState, 0, sizeof(_mouseCurState)); 258 258 259 259 _inited = false; 260 261 _keyMapper = new KeyMapper(); 262 _virtualKeyboard = new VirtualKeyboard(); 260 263 } 261 264 262 265 OSystem_SDL::~OSystem_SDL() { … … 271 274 delete _savefile; 272 275 delete _mixer; 273 276 delete _timer; 277 278 delete _keyMapper; 279 delete _virtualKeyboard; 274 280 } 275 281 276 282 uint32 OSystem_SDL::getMillis() { -
backends/platform/sdl/events.cpp
444 444 } 445 445 return false; 446 446 } 447 KeyMapper *OSystem_SDL::getKeyMapper() { 448 return _keyMapper; 449 } 447 450 451 VirtualKeyboard *OSystem_SDL::getVirtualKeyboard() { 452 return _virtualKeyboard; 453 } 454 448 455 bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) { 449 456 #ifdef LINUPY 450 457 // On Yopy map the End button to quit -
backends/platform/sdl/sdl-common.h
131 131 // Returns true if an event was retrieved. 132 132 virtual bool pollEvent(Common::Event &event); // overloaded by CE backend 133 133 134 virtual KeyMapper *getKeyMapper(); 135 136 virtual VirtualKeyboard *getVirtualKeyboard(); 137 134 138 // Set function that generates samples 135 139 typedef void (*SoundProc)(void *param, byte *buf, int len); 136 140 virtual bool setSoundCallback(SoundProc proc, void *param); // overloaded by CE backend … … 411 415 virtual bool remapKey(SDL_Event &ev, Common::Event &event); 412 416 413 417 void handleScalerHotkeys(const SDL_KeyboardEvent &key); 418 419 private: 420 KeyMapper *_keyMapper; 421 VirtualKeyboard *_virtualKeyboard; 422 414 423 }; 415 424 416 425 #endif -
backends/platform/common/key-mapper.h
1 /* scummvm_current - Graphic Adventure Engine 2 * 3 * scummvm_current is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef COMMON_KEY_MAPPER_H 24 #define COMMON_KEY_MAPPER_H 25 26 #include "common/stdafx.h" 27 #include "common/scummsys.h" 28 #include "common/keyboard.h" 29 #include "common/events.h" 30 31 #include "common/hashmap.h" 32 33 typedef Common::HashMap<Common::KeyState, Common::UserAction, Common::KeyState_Hash> KeyActionMap; 34 35 /** 36 * Default key mapper implementation, base class for custom extensions. 37 */ 38 class KeyMapper { 39 40 public: 41 42 KeyMapper(); 43 ~KeyMapper(); 44 45 /** 46 * Registers engine and game supported actions to be mapped. 47 */ 48 virtual void registerActions(const Common::ActionList actions); 49 50 /** 51 * Clears currently registered actions and their corresponding mappings. 52 */ 53 virtual void unregisterActions(); 54 55 /** 56 * Opens a dialog window to map currently registered actions. 57 */ 58 virtual void mapActions(); 59 60 /** 61 * Tries to find a corresponding mapping for event.kbd. If successful, 62 * replaces the event.kbd with a defaultKey from mapped action. If mapped action 63 * type is not Common::EVENT_INVALID, also substitutes the event.type. 64 */ 65 void resolve(Common::Event &event); 66 67 private: 68 bool _registered; 69 Common::ActionList _supportedActions; 70 KeyActionMap _mappings; // available keys and action mappings 71 }; 72 73 #endif -
backends/platform/common/virtual-keyboard.cpp
1 /* scummvm_current - Graphic Adventure Engine 2 * 3 * scummvm_current is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #include "backends/platform/common/virtual-keyboard.h" 24 25 VirtualKeyboard::VirtualKeyboard() { 26 } 27 28 VirtualKeyboard::~VirtualKeyboard() { 29 } 30 31 void VirtualKeyboard::resolve(Common::Event &event) { 32 } -
backends/platform/common/virtual-keyboard.h
1 /* scummvm_current - Graphic Adventure Engine 2 * 3 * scummvm_current is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef COMMON_VIRTUAL_KEYBOARD_H 24 #define COMMON_VIRTUAL_KEYBOARD_H 25 26 #include "common/stdafx.h" 27 #include "common/scummsys.h" 28 #include "common/events.h" 29 30 /** 31 * Default virtual keyboard implementation, base class for custom extensions. 32 */ 33 class VirtualKeyboard { 34 35 public: 36 37 VirtualKeyboard(); 38 ~VirtualKeyboard(); 39 40 /** 41 * For all mouse click events checks whether the click is 42 * in the screen range of virtual keyboard. This being true, 43 * figures out what virtual button was clicked and substitutes 44 * the mouse data in event with fake key data. 45 */ 46 virtual void resolve(Common::Event &event); 47 }; 48 49 #endif -
backends/platform/common/key-mapper.cpp
1 /* scummvm_current - Graphic Adventure Engine 2 * 3 * scummvm_current is the legal property of its developers, whose names 4 * are too numerous to list here. Please refer to the COPYRIGHT 5 * file distributed with this source distribution. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #include "backends/platform/common/key-mapper.h" 24 25 KeyMapper::KeyMapper() : 26 _registered(false) { 27 } 28 29 KeyMapper::~KeyMapper() { 30 } 31 32 void KeyMapper::registerActions(const Common::ActionList supportedActions) { 33 this->unregisterActions(); 34 _supportedActions = supportedActions; 35 for (Common::ActionList::iterator mIt = _supportedActions.begin(); mIt != _supportedActions.end(); mIt++) { 36 // actions are mapped to default keys to substitute later the type of event 37 _mappings[mIt->defaultKey] = *mIt; 38 } 39 // open the keys dialog or look up mappings in the tables for the rest of actions 40 // ... 41 _registered = true; 42 } 43 44 void KeyMapper::unregisterActions() { 45 _supportedActions.clear(); 46 _mappings.clear(); 47 _registered = false; 48 } 49 50 void KeyMapper::mapActions() { 51 } 52 53 void KeyMapper::resolve(Common::Event &event) { 54 if (!_registered || _mappings.empty()) { 55 return; 56 } 57 58 if (_mappings.contains(event.kbd)) { 59 event.kbd = _mappings[event.kbd].defaultKey; 60 if (_mappings[event.kbd].type != Common::EVENT_INVALID) { 61 event.type = _mappings[event.kbd].type; 62 } 63 } 64 } -
backends/platform/common/module.mk
1 MODULE := backends/platform/common 2 3 MODULE_OBJS := \ 4 key-mapper.o \ 5 virtual-keyboard.o 6 7 MODULE_DIRS += \ 8 backends/platform/common/ 9 10 # We don't use the rules.mk here on purpose 11 OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) -
common/keyboard.h
259 259 keycode = KEYCODE_INVALID; 260 260 ascii = flags = 0; 261 261 } 262 263 bool operator <(const KeyState keyState) const { 264 bool result; 265 if (keycode != keyState.keycode) { 266 result = keycode < keyState.keycode; 267 } else { 268 result = flags < keyState.flags; 269 } 270 271 return result; 272 } 273 274 bool operator ==(const KeyState keyState) const { 275 return (keycode == keyState.keycode) && (flags == keyState.flags); 276 } 277 278 uint hash() const { 279 return 0; 280 } 281 262 282 }; 263 283 284 struct KeyState_Hash { 285 uint operator()(const KeyState& ks) const { return ks.hash(); } 286 }; 287 288 264 289 } // End of namespace Common 265 290 266 291 #endif -
common/system.h
31 31 #include "common/noncopyable.h" 32 32 #include "common/rect.h" 33 33 34 #include "backends/platform/common/key-mapper.h" 35 #include "backends/platform/common/virtual-keyboard.h" 36 34 37 namespace Audio { 35 38 class Mixer; 36 39 } … … 724 727 */ 725 728 virtual bool pollEvent(Common::Event &event) = 0; 726 729 730 virtual KeyMapper *getKeyMapper() { return NULL; } 731 732 virtual VirtualKeyboard *getVirtualKeyboard() { return NULL; } 733 727 734 public: 735 728 736 /** Get the number of milliseconds since the program was started. */ 729 737 virtual uint32 getMillis() = 0; 730 738 … … 743 751 */ 744 752 virtual Common::EventManager *getEventManager(); 745 753 754 746 755 //@} 747 756 748 757 … … 894 903 * refer to the SaveFileManager documentation. 895 904 */ 896 905 virtual Common::SaveFileManager *getSavefileManager() = 0; 897 898 906 //@} 899 907 }; 900 908 -
common/events.h
28 28 29 29 #include "common/keyboard.h" 30 30 #include "common/rect.h" 31 #include "common/system.h"32 31 #include "common/noncopyable.h" 33 32 33 #include "common/list.h" 34 34 35 namespace Common { 35 36 36 37 /** … … 43 44 * indicates which button was pressed. 44 45 */ 45 46 enum EventType { 47 48 EVENT_INVALID = 0, 46 49 /** A key was pressed, details in Event::kbd. */ 47 50 EVENT_KEYDOWN = 1, 48 51 /** A key was released, details in Event::kbd. */ … … 107 110 * Keyboard data; only valid for keyboard events (EVENT_KEYDOWN and 108 111 * EVENT_KEYUP). For all other event types, content is undefined. 109 112 */ 110 KeyState kbd;113 Common::KeyState kbd; 111 114 /** 112 115 * The mouse coordinates, in virtual screen coordinates. Only valid 113 116 * for mouse events. … … 115 118 * screen area as defined by the most recent call to initSize(). 116 119 */ 117 120 Common::Point mouse; 121 122 Event(Common::EventType et = Common::EVENT_INVALID, bool s = false, 123 Common::KeyState ks = Common::KeyState(), Common::Point p = Common::Point()) { 124 125 type = et; 126 synthetic = s; 127 kbd = ks; 128 mouse = p; 129 } 130 131 void reset() { 132 type = Common::EVENT_INVALID; 133 synthetic = false; 134 kbd = Common::KeyState(); 135 mouse = Common::Point(); 136 } 118 137 }; 119 138 139 enum Priority { 140 PRIORITY_HIGHEST, 141 PRIORITY_HIGH, 142 PRIORITY_NORMAL, 143 PRIORITY_LOW, 144 PRIORITY_LOWEST 145 }; 120 146 147 148 struct UserAction { 149 150 /** 151 * Default key used in the egines an games for this action. 152 */ 153 Common::KeyState defaultKey; 154 155 /** 156 * Event type like quit, save/load, etc. 157 */ 158 Common::EventType type; 159 160 /** 161 * Human readable description for a GUI keymapping config dialog 162 */ 163 String description; 164 165 /** 166 * Mapping priority. Actions with higher priority will be given preference for mapping 167 * in case of limited inputs. 168 */ 169 Common::Priority priority; 170 171 UserAction(Common::KeyState ks = Common::KeyState(Common::KEYCODE_ESCAPE), 172 Common::EventType et = Common::EVENT_KEYDOWN, String d = "Action name", 173 Common::Priority p = Common::PRIORITY_NORMAL) { 174 175 defaultKey = ks; 176 type = et; 177 description = d; 178 priority = p; 179 } 180 181 UserAction(Common::KeyState ks, String d, Common::Priority p = Common::PRIORITY_NORMAL) { 182 defaultKey = ks; 183 type = Common::EVENT_INVALID; 184 description = d; 185 priority = p; 186 } 187 188 }; 189 190 typedef Common::List<Common::UserAction> ActionList; 191 121 192 /** 122 193 * The EventManager provides user input events to the client code. 123 194 * In addition, it keeps track of the state of various input devices, … … 166 237 // TODO: Keyboard repeat support? 167 238 168 239 // TODO: Consider removing OSystem::getScreenChangeID and 169 // replacing it by a generic getScreenChangeID method here 240 // replacing it by a generic getScreenChaneID method here 241 242 // @see backends/platform/common/key-mapper.h 243 virtual void registerActions(const ActionList) = 0; 244 245 // @see backends/platform/common/key-mapper.h 246 virtual void unregisterActions() = 0; 247 248 // @see backends/platform/common/key-mapper.h 249 virtual void mapActions() = 0; 250 170 251 }; 171 252 172 253 } // End of namespace Common -
common/list.h
33 33 * Simple double linked list, modeled after the list template of the standard 34 34 * C++ library. 35 35 */ 36 template <class T>36 template <class t_T> 37 37 class List { 38 38 protected: 39 39 #if defined (_WIN32_WCE) || defined (_MSC_VER) … … 45 45 NodeBase *_next; 46 46 }; 47 47 48 template <class T2>48 template <class t_T2> 49 49 struct Node : public NodeBase { 50 T2 _data;50 t_T2 _data; 51 51 52 Node(const T2 &x) : _data(x) {}52 Node(const t_T2 &x) : _data(x) {} 53 53 }; 54 54 55 template <class T2>55 template <class t_T2> 56 56 class Iterator { 57 friend class List< T>;57 friend class List<t_T>; 58 58 NodeBase *_node; 59 59 60 60 #if !defined (__WINSCW__) … … 67 67 Iterator() : _node(0) {} 68 68 69 69 // Prefix inc 70 Iterator< T2> &operator++() {70 Iterator<t_T2> &operator++() { 71 71 if (_node) 72 72 _node = _node->_next; 73 73 return *this; 74 74 } 75 75 // Postfix inc 76 Iterator< T2> operator++(int) {76 Iterator<t_T2> operator++(int) { 77 77 Iterator tmp(_node); 78 78 ++(*this); 79 79 return tmp; 80 80 } 81 81 // Prefix dec 82 Iterator< T2> &operator--() {82 Iterator<t_T2> &operator--() { 83 83 if (_node) 84 84 _node = _node->_prev; 85 85 return *this; 86 86 } 87 87 // Postfix dec 88 Iterator< T2> operator--(int) {88 Iterator<t_T2> operator--(int) { 89 89 Iterator tmp(_node); 90 90 --(*this); 91 91 return tmp; 92 92 } 93 T2& operator*() const {93 t_T2& operator*() const { 94 94 assert(_node); 95 95 #if (__GNUC__ == 2) && (__GNUC_MINOR__ >= 95) 96 return static_cast<List< T>::Node<T2> *>(_node)->_data;96 return static_cast<List<t_T>::Node<t_T2> *>(_node)->_data; 97 97 #else 98 return static_cast<Node< T2>*>(_node)->_data;98 return static_cast<Node<t_T2>*>(_node)->_data; 99 99 #endif 100 100 } 101 T2* operator->() const {101 t_T2* operator->() const { 102 102 return &(operator*()); 103 103 } 104 104 105 bool operator==(const Iterator< T2>& x) const {105 bool operator==(const Iterator<t_T2>& x) const { 106 106 return _node == x._node; 107 107 } 108 108 109 bool operator!=(const Iterator< T2>& x) const {109 bool operator!=(const Iterator<t_T2>& x) const { 110 110 return _node != x._node; 111 111 } 112 112 }; … … 114 114 NodeBase *_anchor; 115 115 116 116 public: 117 typedef Iterator< T> iterator;118 typedef Iterator<const T> const_iterator;117 typedef Iterator<t_T> iterator; 118 typedef Iterator<const t_T> const_iterator; 119 119 120 typedef T value_type;120 typedef t_T value_type; 121 121 122 122 public: 123 123 List() { … … 125 125 _anchor->_prev = _anchor; 126 126 _anchor->_next = _anchor; 127 127 } 128 List(const List< T>& list) {128 List(const List<t_T>& list) { 129 129 _anchor = new NodeBase; 130 130 _anchor->_prev = _anchor; 131 131 _anchor->_next = _anchor; … … 138 138 delete _anchor; 139 139 } 140 140 141 void push_front(const T& element) {141 void push_front(const t_T& element) { 142 142 insert(begin(), element); 143 143 } 144 144 145 void push_back(const T& element) {145 void push_back(const t_T& element) { 146 146 insert(end(), element); 147 147 } 148 148 149 void insert(iterator pos, const T& element) {150 NodeBase *newNode = new Node< T>(element);149 void insert(iterator pos, const t_T& element) { 150 NodeBase *newNode = new Node<t_T>(element); 151 151 152 152 newNode->_next = pos._node; 153 153 newNode->_prev = pos._node->_prev; … … 166 166 167 167 NodeBase *next = pos._node->_next; 168 168 NodeBase *prev = pos._node->_prev; 169 Node< T> *node = static_cast<Node<T> *>(pos._node);169 Node<t_T> *node = static_cast<Node<t_T> *>(pos._node); 170 170 prev->_next = next; 171 171 next->_prev = prev; 172 172 delete node; … … 178 178 179 179 NodeBase *next = pos._node->_next; 180 180 NodeBase *prev = pos._node->_prev; 181 Node< T> *node = static_cast<Node<T> *>(pos._node);181 Node<t_T> *node = static_cast<Node<t_T> *>(pos._node); 182 182 prev->_next = next; 183 183 next->_prev = prev; 184 184 delete node; … … 192 192 return last; 193 193 } 194 194 195 void remove(const T &val) {195 void remove(const t_T &val) { 196 196 iterator i = begin(); 197 197 while (i != end()) 198 198 if (val == i.operator*()) … … 202 202 } 203 203 204 204 205 List< T>& operator =(const List<T>& list) {205 List<t_T>& operator =(const List<t_T>& list) { 206 206 if (this != &list) { 207 207 iterator i; 208 208 const_iterator j; 209 209 210 210 for (i = begin(), j = list.begin(); (i != end()) && (j != list.end()) ; ++i, ++j) { 211 static_cast<Node< T> *>(i._node)->_data = static_cast<Node<T> *>(j._node)->_data;211 static_cast<Node<t_T> *>(i._node)->_data = static_cast<Node<t_T> *>(j._node)->_data; 212 212 } 213 213 214 214 if (i == end()) -
engines/sky/sky.h
27 27 #define SKY_H 28 28 29 29 #include "common/stdafx.h" 30 #include "common/keyboard.h" 30 31 #include "common/events.h" 32 #include "common/system.h" 31 33 #include "engines/engine.h" 32 34 33 35 namespace Sky { -
engines/sky/sky.cpp
183 183 184 184 SkyEngine::SkyEngine(OSystem *syst) 185 185 : Engine(syst), _fastMode(0), _debugger(0) { 186 187 Common::ActionList actions; 188 189 Common::KeyState key = Common::KeyState(Common::KEYCODE_F5); 190 Common::UserAction action = Common::UserAction(key, "Menu"); 191 actions.push_back(action); 192 193 key = Common::KeyState(Common::KEYCODE_ESCAPE); 194 action = Common::UserAction(key, "Esc"); 195 actions.push_back(action); 196 197 key = Common::KeyState(Common::KEYCODE_p); 198 action = Common::UserAction(key, "Pause"); 199 actions.push_back(action); 200 201 _eventMan->registerActions(actions); 202 _eventMan->mapActions(); 186 203 } 187 204 188 205 SkyEngine::~SkyEngine() {