]> git.lizzy.rs Git - minetest.git/blob - src/guiEngine.h
Fix spacing
[minetest.git] / src / guiEngine.h
1 /*
2 Minetest
3 Copyright (C) 2013 sapier
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef GUI_ENGINE_H_
21 #define GUI_ENGINE_H_
22
23 /******************************************************************************/
24 /* Includes                                                                   */
25 /******************************************************************************/
26 #include "irrlichttypes.h"
27 #include "modalMenu.h"
28 #include "guiFormSpecMenu.h"
29 #include "sound.h"
30 #include "client/tile.h"
31 #include "util/enriched_string.h"
32
33 /******************************************************************************/
34 /* Typedefs and macros                                                        */
35 /******************************************************************************/
36 /** texture layer ids */
37 typedef enum {
38         TEX_LAYER_BACKGROUND = 0,
39         TEX_LAYER_OVERLAY,
40         TEX_LAYER_HEADER,
41         TEX_LAYER_FOOTER,
42         TEX_LAYER_MAX
43 } texture_layer;
44
45 typedef struct {
46         video::ITexture* texture;
47         bool             tile;
48         unsigned int     minsize;
49 } image_definition;
50
51 /******************************************************************************/
52 /* forward declarations                                                       */
53 /******************************************************************************/
54 class GUIEngine;
55 class MainMenuScripting;
56 class Clouds;
57 struct MainMenuData;
58
59 /******************************************************************************/
60 /* declarations                                                               */
61 /******************************************************************************/
62
63 /** GUIEngine specific implementation of TextDest used within guiFormSpecMenu */
64 class TextDestGuiEngine : public TextDest
65 {
66 public:
67         /**
68          * default constructor
69          * @param engine the engine data is transmitted for further processing
70          */
71         TextDestGuiEngine(GUIEngine* engine);
72
73         /**
74          * receive fields transmitted by guiFormSpecMenu
75          * @param fields map containing formspec field elements currently active
76          */
77         void gotText(const StringMap &fields);
78
79         /**
80          * receive text/events transmitted by guiFormSpecMenu
81          * @param text textual representation of event
82          */
83         void gotText(std::wstring text);
84
85 private:
86         /** target to transmit data to */
87         GUIEngine* m_engine;
88 };
89
90 /** GUIEngine specific implementation of ISimpleTextureSource */
91 class MenuTextureSource : public ISimpleTextureSource
92 {
93 public:
94         /**
95          * default constructor
96          * @param driver the video driver to load textures from
97          */
98         MenuTextureSource(video::IVideoDriver *driver);
99
100         /**
101          * destructor, removes all loaded textures
102          */
103         virtual ~MenuTextureSource();
104
105         /**
106          * get a texture, loading it if required
107          * @param name path to the texture
108          * @param id receives the texture ID, always 0 in this implementation
109          */
110         video::ITexture* getTexture(const std::string &name, u32 *id = NULL);
111
112 private:
113         /** driver to get textures from */
114         video::IVideoDriver *m_driver;
115         /** set of texture names to delete */
116         std::set<std::string> m_to_delete;
117 };
118
119 /** GUIEngine specific implementation of OnDemandSoundFetcher */
120 class MenuMusicFetcher: public OnDemandSoundFetcher
121 {
122 public:
123         /**
124          * get sound file paths according to sound name
125          * @param name sound name
126          * @param dst_paths receives possible paths to sound files
127          * @param dst_datas receives binary sound data (not used here)
128          */
129         void fetchSounds(const std::string &name,
130                         std::set<std::string> &dst_paths,
131                         std::set<std::string> &dst_datas);
132
133 private:
134         /** set of fetched sound names */
135         std::set<std::string> m_fetched;
136 };
137
138 /** implementation of main menu based uppon formspecs */
139 class GUIEngine {
140         /** grant ModApiMainMenu access to private members */
141         friend class ModApiMainMenu;
142         friend class ModApiSound;
143
144 public:
145         /**
146          * default constructor
147          * @param dev device to draw at
148          * @param parent parent gui element
149          * @param menumgr manager to add menus to
150          * @param smgr scene manager to add scene elements to
151          * @param data struct to transfer data to main game handling
152          */
153         GUIEngine(irr::IrrlichtDevice* dev,
154                         JoystickController *joystick,
155                         gui::IGUIElement* parent,
156                         IMenuManager *menumgr,
157                         scene::ISceneManager* smgr,
158                         MainMenuData* data,
159                         bool& kill);
160
161         /** default destructor */
162         virtual ~GUIEngine();
163
164         /**
165          * return MainMenuScripting interface
166          */
167         MainMenuScripting* getScriptIface()
168         {
169                 return m_script;
170         }
171
172         /**
173          * return dir of current menuscript
174          */
175         std::string getScriptDir()
176         {
177                 return m_scriptdir;
178         }
179
180         /** pass async callback to scriptengine **/
181         unsigned int queueAsync(std::string serialized_fct,std::string serialized_params);
182
183 private:
184
185         /** find and run the main menu script */
186         bool loadMainMenuScript();
187
188         /** run main menu loop */
189         void run();
190
191         /** handler to limit frame rate within main menu */
192         void limitFrameRate();
193
194         /** update size of topleftext element */
195         void updateTopLeftTextSize();
196
197         /** device to draw at */
198         irr::IrrlichtDevice*     m_device;
199         /** parent gui element */
200         gui::IGUIElement*        m_parent;
201         /** manager to add menus to */
202         IMenuManager*            m_menumanager;
203         /** scene manager to add scene elements to */
204         scene::ISceneManager*    m_smgr;
205         /** pointer to data beeing transfered back to main game handling */
206         MainMenuData*            m_data;
207         /** pointer to texture source */
208         ISimpleTextureSource*    m_texture_source;
209         /** pointer to soundmanager*/
210         ISoundManager*           m_sound_manager;
211
212         /** representation of form source to be used in mainmenu formspec */
213         FormspecFormSource*      m_formspecgui;
214         /** formspec input receiver */
215         TextDestGuiEngine*       m_buttonhandler;
216         /** the formspec menu */
217         GUIFormSpecMenu*         m_menu;
218
219         /** reference to kill variable managed by SIGINT handler */
220         bool&                    m_kill;
221
222         /** variable used to abort menu and return back to main game handling */
223         bool                     m_startgame;
224
225         /** scripting interface */
226         MainMenuScripting*       m_script;
227
228         /** script basefolder */
229         std::string              m_scriptdir;
230
231         /**
232          * draw background layer
233          * @param driver to use for drawing
234          */
235         void drawBackground(video::IVideoDriver* driver);
236         /**
237          * draw overlay layer
238          * @param driver to use for drawing
239          */
240         void drawOverlay(video::IVideoDriver* driver);
241         /**
242          * draw header layer
243          * @param driver to use for drawing
244          */
245         void drawHeader(video::IVideoDriver* driver);
246         /**
247          * draw footer layer
248          * @param driver to use for drawing
249          */
250         void drawFooter(video::IVideoDriver* driver);
251
252         /**
253          * load a texture for a specified layer
254          * @param layer draw layer to specify texture
255          * @param texturepath full path of texture to load
256          */
257         bool setTexture(texture_layer layer, std::string texturepath,
258                         bool tile_image, unsigned int minsize);
259
260         /**
261          * download a file using curl
262          * @param url url to download
263          * @param target file to store to
264          */
265         static bool downloadFile(std::string url,std::string target);
266
267         /** array containing pointers to current specified texture layers */
268         image_definition m_textures[TEX_LAYER_MAX];
269
270         /** draw version string in topleft corner */
271         void drawVersion();
272
273         /**
274          * specify text to appear as top left string
275          * @param text to set
276          */
277         void setTopleftText(const std::string &text);
278
279         /** pointer to gui element shown at topleft corner */
280         irr::gui::IGUIStaticText*       m_irr_toplefttext;
281         /** and text that is in it */
282         EnrichedString m_toplefttext;
283
284         /** initialize cloud subsystem */
285         void cloudInit();
286         /** do preprocessing for cloud subsystem */
287         void cloudPreProcess();
288         /** do postprocessing for cloud subsystem */
289         void cloudPostProcess();
290
291         /** internam data required for drawing clouds */
292         struct clouddata {
293                 /** delta time since last cloud processing */
294                 f32     dtime;
295                 /** absolute time of last cloud processing */
296                 u32     lasttime;
297                 /** pointer to cloud class */
298                 Clouds* clouds;
299                 /** camera required for drawing clouds */
300                 scene::ICameraSceneNode* camera;
301         };
302
303         /** is drawing of clouds enabled atm */
304         bool        m_clouds_enabled;
305         /** data used to draw clouds */
306         clouddata   m_cloud;
307
308         /** start playing a sound and return handle */
309         s32 playSound(SimpleSoundSpec spec, bool looped);
310         /** stop playing a sound started with playSound() */
311         void stopSound(s32 handle);
312
313
314 };
315
316
317
318 #endif /* GUI_ENGINE_H_ */