From d2ca0314060bfcf758441d418b6ace4d28257c92 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Sun, 14 Oct 2012 07:43:48 -0400 Subject: [PATCH] Added settings for Anisotropic Filtering, Mip-Map, Bi- and Tri-Linear filtering. Can be changed by either flipping some new checkboxes in the "Settings" menu or by editing the config file (the checkboxes are saved along with everything else as usual). --- src/clientmap.cpp | 5 ++++ src/guiMainMenu.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++ src/guiMainMenu.h | 4 +++ src/main.cpp | 14 ++++++++--- 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/clientmap.cpp b/src/clientmap.cpp index 64d5656d4..f80551b29 100644 --- a/src/clientmap.cpp +++ b/src/clientmap.cpp @@ -544,6 +544,11 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) for(u32 i=0; igetMeshBuffer(i); + + buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, g_settings->getBool("trilinear_filter")); + buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, g_settings->getBool("bilinear_filter")); + buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, g_settings->getBool("anisotropic_filter")); + const video::SMaterial& material = buf->getMaterial(); video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType); diff --git a/src/guiMainMenu.cpp b/src/guiMainMenu.cpp index 5e0a3c38f..0bdb44e5d 100644 --- a/src/guiMainMenu.cpp +++ b/src/guiMainMenu.cpp @@ -98,6 +98,10 @@ enum GUI_ID_SMOOTH_LIGHTING_CB, GUI_ID_3D_CLOUDS_CB, GUI_ID_OPAQUE_WATER_CB, + GUI_ID_MIPMAP_CB, + GUI_ID_ANISOTROPIC_CB, + GUI_ID_BILINEAR_CB, + GUI_ID_TRILINEAR_CB, GUI_ID_DAMAGE_CB, GUI_ID_CREATIVE_CB, GUI_ID_JOIN_GAME_BUTTON, @@ -580,6 +584,38 @@ void GUIMainMenu::regenerateGui(v2u32 screensize) Environment->addCheckBox(m_data->opaque_water, rect, this, GUI_ID_OPAQUE_WATER_CB, wgettext("Opaque water")); } + + + // Anisotropic/mipmap/bi-/trilinear settings + + { + core::rect rect(0, 0, option_w+20, 30); + rect += m_topleft_client + v2s32(option_x+175, option_y); + Environment->addCheckBox(m_data->mip_map, rect, this, + GUI_ID_MIPMAP_CB, wgettext("Mip-Mapping")); + } + + { + core::rect rect(0, 0, option_w+20, 30); + rect += m_topleft_client + v2s32(option_x+175, option_y+20); + Environment->addCheckBox(m_data->anisotropic_filter, rect, this, + GUI_ID_ANISOTROPIC_CB, wgettext("Anisotropic Filtering")); + } + + { + core::rect rect(0, 0, option_w+20, 30); + rect += m_topleft_client + v2s32(option_x+175, option_y+20*2); + Environment->addCheckBox(m_data->bilinear_filter, rect, this, + GUI_ID_BILINEAR_CB, wgettext("Bi-Linear Filtering")); + } + + { + core::rect rect(0, 0, option_w+20, 30); + rect += m_topleft_client + v2s32(option_x+175, option_y+20*3); + Environment->addCheckBox(m_data->trilinear_filter, rect, this, + GUI_ID_TRILINEAR_CB, wgettext("Tri-Linear Filtering")); + } + // Key change button { core::rect rect(0, 0, 120, 30); @@ -760,6 +796,30 @@ void GUIMainMenu::readInput(MainMenuData *dst) dst->opaque_water = ((gui::IGUICheckBox*)e)->isChecked(); } + { + gui::IGUIElement *e = getElementFromId(GUI_ID_MIPMAP_CB); + if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) + dst->mip_map = ((gui::IGUICheckBox*)e)->isChecked(); + } + + { + gui::IGUIElement *e = getElementFromId(GUI_ID_ANISOTROPIC_CB); + if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) + dst->anisotropic_filter = ((gui::IGUICheckBox*)e)->isChecked(); + } + + { + gui::IGUIElement *e = getElementFromId(GUI_ID_BILINEAR_CB); + if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) + dst->bilinear_filter = ((gui::IGUICheckBox*)e)->isChecked(); + } + + { + gui::IGUIElement *e = getElementFromId(GUI_ID_TRILINEAR_CB); + if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) + dst->trilinear_filter = ((gui::IGUICheckBox*)e)->isChecked(); + } + { gui::IGUIElement *e = getElementFromId(GUI_ID_WORLD_LISTBOX); if(e != NULL && e->getType() == gui::EGUIET_LIST_BOX) diff --git a/src/guiMainMenu.h b/src/guiMainMenu.h index 715deb47d..abfc6bdb4 100644 --- a/src/guiMainMenu.h +++ b/src/guiMainMenu.h @@ -41,6 +41,10 @@ struct MainMenuData bool smooth_lighting; bool clouds_3d; bool opaque_water; + bool mip_map; + bool anisotropic_filter; + bool bilinear_filter; + bool trilinear_filter; // Server options bool creative_mode; bool enable_damage; diff --git a/src/main.cpp b/src/main.cpp index 6075e9d10..dcc47cd6b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1292,9 +1292,6 @@ int main(int argc, char *argv[]) video::IVideoDriver* driver = device->getVideoDriver(); - // Disable mipmaps (because some of them look ugly) - driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); - /* This changes the minimum allowed number of vertices in a VBO. Default is 500. @@ -1439,6 +1436,11 @@ int main(int argc, char *argv[]) menudata.smooth_lighting = g_settings->getBool("smooth_lighting"); menudata.clouds_3d = g_settings->getBool("enable_3d_clouds"); menudata.opaque_water = g_settings->getBool("opaque_water"); + menudata.mip_map = g_settings->getBool("mip_map"); + menudata.anisotropic_filter = g_settings->getBool("anisotropic_filter"); + menudata.bilinear_filter = g_settings->getBool("bilinear_filter"); + menudata.trilinear_filter = g_settings->getBool("trilinear_filter"); + driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, menudata.mip_map); menudata.creative_mode = g_settings->getBool("creative_mode"); menudata.enable_damage = g_settings->getBool("enable_damage"); // Default to selecting nothing @@ -1552,6 +1554,12 @@ int main(int argc, char *argv[]) g_settings->set("smooth_lighting", itos(menudata.smooth_lighting)); g_settings->set("enable_3d_clouds", itos(menudata.clouds_3d)); g_settings->set("opaque_water", itos(menudata.opaque_water)); + + g_settings->set("mip_map", itos(menudata.mip_map)); + g_settings->set("anisotropic_filter", itos(menudata.anisotropic_filter)); + g_settings->set("bilinear_filter", itos(menudata.bilinear_filter)); + g_settings->set("trilinear_filter", itos(menudata.trilinear_filter)); + g_settings->set("creative_mode", itos(menudata.creative_mode)); g_settings->set("enable_damage", itos(menudata.enable_damage)); g_settings->set("name", playername);