Add video driver selection to settings menu (based uppon idea from webdesigner97) 1495/head
authorsapier <Sapier at GMX dot net>
Wed, 16 Jul 2014 12:04:50 +0000 (14:04 +0200)
committersapier <Sapier at GMX dot net>
Fri, 22 Aug 2014 23:55:54 +0000 (01:55 +0200)
builtin/mainmenu/tab_settings.lua
doc/menu_lua_api.txt
src/main.cpp
src/script/lua_api/l_mainmenu.cpp
src/script/lua_api/l_mainmenu.h

index 2311978e0d4a7ce6db5f42387ccb36bf48ed9dc0..4bb3eb36c253d0e7e3f916d70577cb83b33b06d9 100644 (file)
@@ -110,6 +110,24 @@ local function scrollbar_to_gui_scale(value)
 end
 
 local function formspec(tabview, name, tabdata)
+       local video_drivers = core.get_video_drivers()
+       
+       local video_driver_string = ""
+       local current_video_driver_idx = 0
+       local current_video_driver = core.setting_get("video_driver")
+       for i=1, #video_drivers, 1 do
+       
+               if i ~= 1 then
+                       video_driver_string = video_driver_string .. ","
+               end
+               video_driver_string = video_driver_string .. video_drivers[i]
+               
+               if current_video_driver:lower() == video_drivers[i]:lower() then
+                       current_video_driver_idx = i
+               end
+       end
+       
+       
        local tab_string =
                "vertlabel[0,-0.25;" .. fgettext("SETTINGS") .. "]" ..
                "box[0.75,0;3.25,4;#999999]" ..
@@ -125,6 +143,10 @@ local function formspec(tabview, name, tabdata)
                                .. dump(core.setting_getbool("preload_item_visuals"))   .. "]"..
                "checkbox[1,2.5;cb_particles;".. fgettext("Enable Particles") .. ";"
                                .. dump(core.setting_getbool("enable_particles"))       .. "]"..
+               "dropdown[1,3.25;3;dd_video_driver;"
+                       .. video_driver_string .. ";" .. current_video_driver_idx .. "]" ..
+               "tooltip[dd_video_driver;" ..
+                       fgettext("Restart minetest for driver change to take effect") .. "]" ..
                "box[4.25,0;3.25,2.5;#999999]" ..
                "checkbox[4.5,0;cb_mipmapping;".. fgettext("Mip-Mapping") .. ";"
                                .. dump(core.setting_getbool("mip_map")) .. "]"..
@@ -284,16 +306,20 @@ local function handle_settings_buttons(this, fields, tabname, tabdata)
                return true
        end
        if fields["btn_reset_singleplayer"] then
-               print("sp reset")
                showconfirm_reset(this)
                return true
        end
+
        --Note dropdowns have to be handled LAST!
        local ddhandled = false
        if fields["dd_touchthreshold"] then
                core.setting_set("touchscreen_threshold",fields["dd_touchthreshold"])
                ddhandled = true
        end
+       if fields["dd_video_driver"] then
+               core.setting_set("video_driver",fields["dd_video_driver"])
+               ddhandled = true
+       end
        
        return ddhandled
 end
index 13ef45de0373fe03ba510c8bd256fc44adaddfa7..20549d892b32afcac7eef31c76ccd0ba6852bcbf 100644 (file)
@@ -88,6 +88,9 @@ core.sound_play(spec, looped) -> handle
 ^ spec = SimpleSoundSpec (see lua-api.txt)
 ^ looped = bool
 core.sound_stop(handle)
+core.get_video_drivers()
+^ get list of video drivers supported by engine (not all modes are guaranteed to work)
+^ returns list of available video drivers e.g. { "OpenGL", "Software" }
 
 Formspec:
 core.update_formspec(formspec)
index 1b91edd2168121f55bf2b6874bc578df27137c05..9d336825ec3a25b69b59b3d11b9a7be92cf43bf3 100644 (file)
@@ -1365,41 +1365,43 @@ int main(int argc, char *argv[])
        u16 fsaa = g_settings->getU16("fsaa");
 
        // Determine driver
-
-       video::E_DRIVER_TYPE driverType;
-
-       std::string driverstring = g_settings->get("video_driver");
-
-       if (driverstring == "null")
-               driverType = video::EDT_NULL;
-       else if (driverstring == "software")
-               driverType = video::EDT_SOFTWARE;
-       else if (driverstring == "burningsvideo")
-               driverType = video::EDT_BURNINGSVIDEO;
-       else if (driverstring == "direct3d8")
-               driverType = video::EDT_DIRECT3D8;
-       else if (driverstring == "direct3d9")
-               driverType = video::EDT_DIRECT3D9;
-       else if (driverstring == "opengl")
-               driverType = video::EDT_OPENGL;
+       video::E_DRIVER_TYPE driverType = video::EDT_OPENGL;
+       static const char* driverids[] = {
+               "null",
+               "software",
+               "burningsvideo",
+               "direct3d8",
+               "direct3d9",
+               "opengl"
 #ifdef _IRR_COMPILE_WITH_OGLES1_
-       else if (driverstring == "ogles1")
-               driverType = video::EDT_OGLES1;
+               ,"ogles1"
 #endif
 #ifdef _IRR_COMPILE_WITH_OGLES2_
-       else if (driverstring == "ogles2")
-               driverType = video::EDT_OGLES2;
+               ,"ogles2"
 #endif
-       else {
-               errorstream << "WARNING: Invalid video_driver specified; defaulting "
-                       << "to opengl" << std::endl;
-               driverType = video::EDT_OPENGL;
+               ,"invalid"
+       };
+
+       std::string driverstring = g_settings->get("video_driver");
+       for (unsigned int i = 0;
+                       i < (sizeof(driverids)/sizeof(driverids[0]));
+                       i++)
+       {
+               if (strcasecmp(driverstring.c_str(), driverids[i]) == 0) {
+                       driverType = (video::E_DRIVER_TYPE) i;
+                       break;
+               }
+
+               if (strcasecmp("invalid", driverids[i]) == 0) {
+                       errorstream << "WARNING: Invalid video_driver specified; defaulting "
+                               << "to opengl" << std::endl;
+                       break;
+               }
        }
 
        /*
                List video modes if requested
        */
-
        MyEventReceiver* receiver = new MyEventReceiver();
 
        if (cmd_args.getFlag("videomodes")) {
index ae2fddf6d0d42d222467bcbc86af83913804315d..1760d279491e1e709d20b7b033eac93ec90c7017 100644 (file)
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "sound.h"
 #include "settings.h"
 #include "main.h" // for g_settings
+#include "EDriverTypes.h"
 
 #include <IFileArchive.h>
 #include <IFileSystem.h>
@@ -1001,6 +1002,36 @@ int ModApiMainMenu::l_download_file(lua_State *L)
        return 1;
 }
 
+/******************************************************************************/
+int ModApiMainMenu::l_get_video_drivers(lua_State *L)
+{
+       static const char* drivernames[] = {
+               "NULL Driver",
+               "Software",
+               "Burningsvideo",
+               "Direct3D 8",
+               "Direct3D 9",
+               "OpenGL",
+               "OGLES1",
+               "OGLES2"
+       };
+       unsigned int index = 1;
+       lua_newtable(L);
+       int top = lua_gettop(L);
+
+       for (unsigned int i = irr::video::EDT_SOFTWARE;
+                       i < MYMIN(irr::video::EDT_COUNT, (sizeof(drivernames)/sizeof(drivernames[0])));
+                       i++) {
+               if (irr::IrrlichtDevice::isDriverSupported((irr::video::E_DRIVER_TYPE) i)) {
+                       lua_pushnumber(L,index++);
+                       lua_pushstring(L,drivernames[i]);
+                       lua_settable(L, top);
+               }
+       }
+
+       return 1;
+}
+
 /******************************************************************************/
 int ModApiMainMenu::l_gettext(lua_State *L)
 {
@@ -1094,6 +1125,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
        API_FCT(sound_play);
        API_FCT(sound_stop);
        API_FCT(gettext);
+       API_FCT(get_video_drivers);
        API_FCT(get_screen_info);
        API_FCT(do_async_callback);
 }
index 7a9cafd1f4792b1e2ed8239718ac3d111c305e5b..1783a3f7faa5b27a0230940c2d7aefbe75ab551a 100644 (file)
@@ -133,6 +133,8 @@ private:
 
        static int l_download_file(lua_State *L);
 
+       static int l_get_video_drivers(lua_State *L);
+
        // async
        static int l_do_async_callback(lua_State *L);