Mgfractal: Add 3D and 4D fractals
[oweals/minetest.git] / src / guiEngine.h
index 2f96b0b1c4669f51ed2e4f6cd5a363909ced1095..d527f722243dc735832a682bf1f3e0f71fc31950 100644 (file)
@@ -25,18 +25,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 /******************************************************************************/
 #include "irrlichttypes.h"
 #include "modalMenu.h"
-#include "clouds.h"
-#include "guiLuaApi.h"
 #include "guiFormSpecMenu.h"
 #include "sound.h"
+#include "client/tile.h"
 
 /******************************************************************************/
 /* Typedefs and macros                                                        */
 /******************************************************************************/
-#define MAX_MENUBAR_BTN_COUNT  10
-#define MAX_MENUBAR_BTN_ID             256
-#define MIN_MENUBAR_BTN_ID             (MAX_MENUBAR_BTN_ID - MAX_MENUBAR_BTN_COUNT)
-
 /** texture layer ids */
 typedef enum {
        TEX_LAYER_BACKGROUND = 0,
@@ -46,12 +41,19 @@ typedef enum {
        TEX_LAYER_MAX
 } texture_layer;
 
+typedef struct {
+       video::ITexture* texture;
+       bool             tile;
+       unsigned int     minsize;
+} image_definition;
+
 /******************************************************************************/
 /* forward declarations                                                       */
 /******************************************************************************/
 class GUIEngine;
+class MainMenuScripting;
+class Clouds;
 struct MainMenuData;
-struct SimpleSoundSpec;
 
 /******************************************************************************/
 /* declarations                                                               */
@@ -66,55 +68,78 @@ public:
         * @param engine the engine data is transmitted for further processing
         */
        TextDestGuiEngine(GUIEngine* engine);
+
        /**
         * receive fields transmitted by guiFormSpecMenu
         * @param fields map containing formspec field elements currently active
         */
-       void gotText(std::map<std::string, std::string> fields);
+       void gotText(const StringMap &fields);
 
        /**
         * receive text/events transmitted by guiFormSpecMenu
         * @param text textual representation of event
         */
        void gotText(std::wstring text);
+
 private:
        /** target to transmit data to */
        GUIEngine* m_engine;
 };
 
-class MenuMusicFetcher: public OnDemandSoundFetcher
+/** GUIEngine specific implementation of ISimpleTextureSource */
+class MenuTextureSource : public ISimpleTextureSource
 {
-       std::set<std::string> m_fetched;
 public:
+       /**
+        * default constructor
+        * @param driver the video driver to load textures from
+        */
+       MenuTextureSource(video::IVideoDriver *driver);
 
+       /**
+        * destructor, removes all loaded textures
+        */
+       virtual ~MenuTextureSource();
+
+       /**
+        * get a texture, loading it if required
+        * @param name path to the texture
+        * @param id receives the texture ID, always 0 in this implementation
+        */
+       video::ITexture* getTexture(const std::string &name, u32 *id = NULL);
+
+private:
+       /** driver to get textures from */
+       video::IVideoDriver *m_driver;
+       /** set of texture names to delete */
+       std::set<std::string> m_to_delete;
+};
+
+/** GUIEngine specific implementation of OnDemandSoundFetcher */
+class MenuMusicFetcher: public OnDemandSoundFetcher
+{
+public:
+       /**
+        * get sound file paths according to sound name
+        * @param name sound name
+        * @param dst_paths receives possible paths to sound files
+        * @param dst_datas receives binary sound data (not used here)
+        */
        void fetchSounds(const std::string &name,
                        std::set<std::string> &dst_paths,
-                       std::set<std::string> &dst_datas)
-       {
-               if(m_fetched.count(name))
-                       return;
-               m_fetched.insert(name);
-               std::string base;
-               base = porting::path_share + DIR_DELIM + "sounds";
-               dst_paths.insert(base + DIR_DELIM + name + ".ogg");
-               int i;
-               for(i=0; i<10; i++)
-                       dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg");
-               base = porting::path_user + DIR_DELIM + "sounds";
-               dst_paths.insert(base + DIR_DELIM + name + ".ogg");
-               for(i=0; i<10; i++)
-                       dst_paths.insert(base + DIR_DELIM + name + "."+itos(i)+".ogg");
-               }
+                       std::set<std::string> &dst_datas);
+
+private:
+       /** set of fetched sound names */
+       std::set<std::string> m_fetched;
 };
 
 /** implementation of main menu based uppon formspecs */
 class GUIEngine {
-public:
-       /** TextDestGuiEngine needs to transfer data to engine */
-       friend class TextDestGuiEngine;
-       /** guiLuaApi is used to initialize contained stack */
-       friend class guiLuaApi;
+       /** grant ModApiMainMenu access to private members */
+       friend class ModApiMainMenu;
 
+public:
        /**
         * default constructor
         * @param dev device to draw at
@@ -124,91 +149,81 @@ public:
         * @param data struct to transfer data to main game handling
         */
        GUIEngine(      irr::IrrlichtDevice* dev,
-                               gui::IGUIElement* parent,
-                               IMenuManager *menumgr,
-                               scene::ISceneManager* smgr,
-                               MainMenuData* data);
+                       gui::IGUIElement* parent,
+                       IMenuManager *menumgr,
+                       scene::ISceneManager* smgr,
+                       MainMenuData* data,
+                       bool& kill);
 
        /** default destructor */
        virtual ~GUIEngine();
 
-       s32 playSound(SimpleSoundSpec spec, bool looped);
-       void stopSound(s32 handle);
-
-protected:
-       /**
-        * process field data recieved from formspec
-        * @param fields data in field format
-        */
-       void handleButtons(std::map<std::string, std::string> fields);
        /**
-        * process events received from formspec
-        * @param text events in textual form
+        * return MainMenuScripting interface
         */
-       void handleEvent(std::string text);
+       MainMenuScripting* getScriptIface()
+       {
+               return m_script;
+       }
 
        /**
         * return dir of current menuscript
         */
-       std::string getScriptDir() {
+       std::string getScriptDir()
+       {
                return m_scriptdir;
        }
 
+       /** pass async callback to scriptengine **/
+       unsigned int queueAsync(std::string serialized_fct,std::string serialized_params);
+
 private:
 
-       /* run main menu loop */
+       /** find and run the main menu script */
+       bool loadMainMenuScript();
+
+       /** run main menu loop */
        void run();
 
        /** handler to limit frame rate within main menu */
        void limitFrameRate();
 
+       /** update size of topleftext element */
+       void updateTopLeftTextSize();
+
        /** device to draw at */
-       irr::IrrlichtDevice*    m_device;
+       irr::IrrlichtDevice*     m_device;
        /** parent gui element */
-       gui::IGUIElement*               m_parent;
+       gui::IGUIElement*        m_parent;
        /** manager to add menus to */
-       IMenuManager*                   m_menumanager;
+       IMenuManager*            m_menumanager;
        /** scene manager to add scene elements to */
-       scene::ISceneManager*   m_smgr;
+       scene::ISceneManager*    m_smgr;
        /** pointer to data beeing transfered back to main game handling */
-       MainMenuData*                   m_data;
+       MainMenuData*            m_data;
+       /** pointer to texture source */
+       ISimpleTextureSource*    m_texture_source;
        /** pointer to soundmanager*/
-       ISoundManager*                  m_sound_manager;
+       ISoundManager*           m_sound_manager;
 
        /** representation of form source to be used in mainmenu formspec */
-       FormspecFormSource*             m_formspecgui;
+       FormspecFormSource*      m_formspecgui;
        /** formspec input receiver */
-       TextDestGuiEngine*              m_buttonhandler;
+       TextDestGuiEngine*       m_buttonhandler;
        /** the formspec menu */
-       GUIFormSpecMenu*                m_menu;
+       GUIFormSpecMenu*         m_menu;
 
-       /** variable used to abort menu and return back to main game handling */
-       bool                                    m_startgame;
+       /** reference to kill variable managed by SIGINT handler */
+       bool&                    m_kill;
 
-       /**
-        * initialize lua stack
-        * @param L stack to initialize
-        */
-       void initalize_api(lua_State * L);
-
-       /**
-        * run a lua script
-        * @param script full path to script to run
-        */
-       bool runScript(std::string script);
-
-       /**
-        * script error handler to process errors within lua
-        */
-       void scriptError(const char *fmt, ...);
+       /** variable used to abort menu and return back to main game handling */
+       bool                     m_startgame;
 
-       /** lua stack */
-       lua_State*                              m_engineluastack;
-       /** lua internal stack number of error handler*/
-       int                                             m_luaerrorhandler;
+       /** scripting interface */
+       MainMenuScripting*       m_script;
 
        /** script basefolder */
-       std::string                             m_scriptdir;
+       std::string              m_scriptdir;
 
        /**
         * draw background layer
@@ -236,17 +251,18 @@ private:
         * @param layer draw layer to specify texture
         * @param texturepath full path of texture to load
         */
-       bool setTexture(texture_layer layer,std::string texturepath);
+       bool setTexture(texture_layer layer, std::string texturepath,
+                       bool tile_image, unsigned int minsize);
 
        /**
         * download a file using curl
         * @param url url to download
         * @param target file to store to
         */
-       bool downloadFile(std::string url,std::string target);
+       static bool downloadFile(std::string url,std::string target);
 
        /** array containing pointers to current specified texture layers */
-       video::ITexture*                m_textures[TEX_LAYER_MAX];
+       image_definition m_textures[TEX_LAYER_MAX];
 
        /** draw version string in topleft corner */
        void drawVersion();
@@ -270,19 +286,25 @@ private:
        /** internam data required for drawing clouds */
        struct clouddata {
                /** delta time since last cloud processing */
-               f32             dtime;
+               f32     dtime;
                /** absolute time of last cloud processing */
-               u32             lasttime;
+               u32     lasttime;
                /** pointer to cloud class */
-               Clouds* clouds;
+               Clouds* clouds;
                /** camera required for drawing clouds */
                scene::ICameraSceneNode* camera;
        };
 
        /** is drawing of clouds enabled atm */
-       bool                                    m_clouds_enabled;
+       bool        m_clouds_enabled;
        /** data used to draw clouds */
-       clouddata                               m_cloud;
+       clouddata   m_cloud;
+
+       /** start playing a sound and return handle */
+       s32 playSound(SimpleSoundSpec spec, bool looped);
+       /** stop playing a sound started with playSound() */
+       void stopSound(s32 handle);
+
 
 };