aboutsummaryrefslogtreecommitdiff
path: root/client
Commit message (Collapse)AuthorAge
* Fix fog weirdness (#5146)numberZero2017-01-31
|
* Add hardware node coloring. Includes:Dániel Juhász2017-01-23
| | | | | | - Increase ContentFeatures serialization version - Color property and palettes for nodes - paramtype2 = "color", "colored facedir" or "colored wallmounted"
* Shaders: Remove unnecessary 'if' statementsLars Hofhansl2016-12-24
| | | | | | Pull if GENERATE_NORMALMAPS == 1 into the template to avoid evaluating it for each fragment. Remove if (fogDistance != 0.0).
* Fog: Make fraction of visible distance at which fog starts configurableLars Hofhansl2016-12-07
| | | | | | Optimise the fetching of global settings 'camera_smoothing', 'cinematic' and 'cinematic_camera_smoothing'. Cache 'cam_smoothing'.
* Fix unexplained shader issue (glsl compiler bug??) (#4757)Rogier-52016-11-17
|
* Remove unused shader matrices. (#4723)lhofhansl2016-11-04
|
* Shaders: Remove special handling for liquids. (#4670)lhofhansl2016-10-26
|
* Shaders: Apply tone mapping before fog calculation.Lars Hofhansl2016-10-25
|
* Shaders: Harmonize Irrlicht and shader fog calculationsLars Hofhansl2016-10-24
|
* Use range-based fog instead of z-plane based.Lars Hofhansl2016-10-13
|
* Nodes shader: Decrease amplitude of waving leaves and plantsparamat2016-03-30
| | | | | | Fix initialisation of variable 'disp' Fix a few minor code style issues Add independent X motion combining 2 prime frequencies
* Replace CRLF with LF in shader filesest312016-03-25
|
* Shaders: fix fog not affecting opaque liquidsRealBadAngel2016-02-23
|
* Filmic HDR tone mappingRealBadAngel2016-02-09
|
* Cleanup selection mesh code, add shaders for halo and selection boxesRealBadAngel2016-02-08
|
* Speed up and make more accurate relief mappingRealBadAngel2015-12-10
| | | | using linear + binary search.
* Shaders: use triple-frequency waving for leaves and plantsparamat2015-09-07
|
* Remove use of engine sent texture tiling flags - theyre no longer neededRealBadAngel2015-08-20
|
* Add wielded (and CAOs) shaderRealBadAngel2015-07-21
|
* Fix relief mapping issuesRealBadAngel2015-07-16
|
* Shaders fixes and cleanup relief mapping code.RealBadAngel2015-07-02
|
* Bugfix: variable type mismatchRealBadAngel2015-06-28
|
* Add minimap featureRealBadAngel2015-06-27
|
* Remove textures vertical offset. Fix for area enabling parallax.RealBadAngel2015-06-21
|
* Automated whitespace error fix for last commitest312015-06-14
|
* Improved parallax mapping. Generate heightmaps on the fly.RealBadAngel2015-06-14
|
* Optimize bumpmapping mathematicsLoic Blot2015-01-16
| | | | | | OpenGL_vertex: * bufferize a duplicate calcul * Factorize vertexes
* Revert "Optimize bumpmapping mathematics"Craig Robbins2015-01-16
| | | | This reverts commit 148fffb0f23fa437c67639ff3cc69177fb71d76a.
* Optimize bumpmapping mathematicsLoic Blot2015-01-15
| | | | | | OpenGL_vertex: * bufferize a duplicate calcul * Factorize vertexes
* Restore finalColorBlend implementation in shaders.RealBadAngel2014-12-07
|
* Let lighting be done only CPU side. Remove finalColorBlend implementation ↵RealBadAngel2014-08-16
| | | | from shaders.
* Make faces shading correct for all possible modes.RealBadAngel2014-08-14
| | | | | Skip shading for lightsources and top of the nodes. Fixes liquid sources and flowing surfaces having different brightness.
* Faces shading fixesRealBadAngel2014-07-07
|
* Improved faces shading with and without shaders.RealBadAngel2014-06-17
|
* Unite nodes shaders.RealBadAngel2014-06-15
| | | | | | | Pass drawtype and material type to shaders. Move shaders generation to startup only. Allow assign shaders per tile. Initial code to support water surface shader.
* Fix invalid liquid lighting.RealBadAngel2014-04-16
|
* Normal maps generation on the fly.RealBadAngel2014-03-21
| | | | | Parallax mapping with slope information. Overriding normal maps.
* Optimize shaders code. Add settings at compile time.RealBadAngel2013-12-09
|
* Fix shaders on some GPUsNovatux2013-12-08
|
* Shaders rework.RealBadAngel2013-12-03
|
* Fix texture bumpmapping on some GPUsZeg92013-08-04
|
* Add texture bumpmapping feature.RealBadAngel2013-07-04
|
* Actually fix shader3 alpha this timekwolekr2013-04-27
|
* Transform alpha channel as well in shaderkwolekr2013-04-25
|
* Add option to use texture alpha channelkwolekr2013-04-23
|
* Fix new_style_waterPilzAdam2013-03-17
|
* Add a list of servers to the "Multiplayer" tabJeija2013-01-21
| | | | | | | If USE_CURL is set, it also downloads a list from a remote server. The url of this list is configurable in minetest.conf using the setting "serverlist_url" The local list of favorite servers is saved in client/serverlist/filename filename is also configureable using the setting "serverlist_file"
* Tweak shader randomly a bitPerttu Ahola2012-12-02
|
* Handle day-night transition in shader and make light sources brighter when ↵Perttu Ahola2012-12-02
| | | | shaders are used
* Remove accidental vim swap filePerttu Ahola2012-12-02
|
>->getScriptIface()->handleMainMenuEvent(wide_to_narrow(text)); } /******************************************************************************/ /** MenuTextureSource */ /******************************************************************************/ MenuTextureSource::MenuTextureSource(video::IVideoDriver *driver) { m_driver = driver; } /******************************************************************************/ MenuTextureSource::~MenuTextureSource() { for (std::set<std::string>::iterator it = m_to_delete.begin(); it != m_to_delete.end(); ++it) { const char *tname = (*it).c_str(); video::ITexture *texture = m_driver->getTexture(tname); m_driver->removeTexture(texture); } } /******************************************************************************/ video::ITexture* MenuTextureSource::getTexture(const std::string &name, u32 *id) { if(id) *id = 0; if(name.empty()) return NULL; m_to_delete.insert(name); #ifdef __ANDROID__ video::IImage *image = m_driver->createImageFromFile(name.c_str()); if (image) { image = Align2Npot2(image, m_driver); video::ITexture* retval = m_driver->addTexture(name.c_str(), image); image->drop(); return retval; } #endif return m_driver->getTexture(name.c_str()); } /******************************************************************************/ /** MenuMusicFetcher */ /******************************************************************************/ void MenuMusicFetcher::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"); } /******************************************************************************/ /** GUIEngine */ /******************************************************************************/ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev, gui::IGUIElement* parent, IMenuManager *menumgr, scene::ISceneManager* smgr, MainMenuData* data, bool& kill) : m_device(dev), m_parent(parent), m_menumanager(menumgr), m_smgr(smgr), m_data(data), m_texture_source(NULL), m_sound_manager(NULL), m_formspecgui(0), m_buttonhandler(0), m_menu(0), m_kill(kill), m_startgame(false), m_script(0), m_scriptdir(""), m_irr_toplefttext(0), m_clouds_enabled(true), m_cloud() { //initialize texture pointers for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) { m_textures[i].texture = NULL; } // is deleted by guiformspec! m_buttonhandler = new TextDestGuiEngine(this); //create texture source m_texture_source = new MenuTextureSource(m_device->getVideoDriver()); //create soundmanager MenuMusicFetcher soundfetcher; #if USE_SOUND m_sound_manager = createOpenALSoundManager(&soundfetcher); #endif if(!m_sound_manager) m_sound_manager = &dummySoundManager; //create topleft header std::wstring t = narrow_to_wide(std::string(PROJECT_NAME_C " ") + g_version_hash); core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(t), g_fontengine->getTextHeight()); rect += v2s32(4, 0); m_irr_toplefttext = m_device->getGUIEnvironment()->addStaticText(t.c_str(), rect,false,true,0,-1); //create formspecsource m_formspecgui = new FormspecFormSource(""); /* Create menu */ m_menu = new GUIFormSpecMenu(m_device, m_parent, -1, m_menumanager, NULL /* &client */, NULL /* gamedef */, m_texture_source, m_formspecgui, m_buttonhandler, NULL, false); m_menu->allowClose(false); m_menu->lockSize(true,v2u32(800,600)); // Initialize scripting infostream << "GUIEngine: Initializing Lua" << std::endl; m_script = new MainMenuScripting(this); try { if (m_data->errormessage != "") { m_script->setMainMenuErrorMessage(m_data->errormessage); m_data->errormessage = ""; } if (!loadMainMenuScript()) { errorstream << "No future without mainmenu" << std::endl; abort(); } run(); } catch(LuaError &e) { errorstream << "MAINMENU ERROR: " << e.what() << std::endl; m_data->errormessage = e.what(); } m_menu->quitMenu(); m_menu->drop(); m_menu = NULL; } /******************************************************************************/ bool GUIEngine::loadMainMenuScript() { // Try custom menu script (main_menu_path) m_scriptdir = g_settings->get("main_menu_path"); if (m_scriptdir.empty()) { m_scriptdir = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "mainmenu"; } std::string script = porting::path_share + DIR_DELIM "builtin" + DIR_DELIM "init.lua"; if (m_script->loadScript(script)) { // Menu script loaded return true; } else { infostream << "GUIEngine: execution of menu script in: \"" << m_scriptdir << "\" failed!" << std::endl; } return false; } /******************************************************************************/ void GUIEngine::run() { // Always create clouds because they may or may not be // needed based on the game selected video::IVideoDriver* driver = m_device->getVideoDriver(); cloudInit(); unsigned int text_height = g_fontengine->getTextHeight(); while(m_device->run() && (!m_startgame) && (!m_kill)) { //check if we need to update the "upper left corner"-text if (text_height != g_fontengine->getTextHeight()) { updateTopLeftTextSize(); text_height = g_fontengine->getTextHeight(); } driver->beginScene(true, true, video::SColor(255,140,186,250)); if (m_clouds_enabled) { cloudPreProcess(); drawOverlay(driver); } else drawBackground(driver); drawHeader(driver); drawFooter(driver); m_device->getGUIEnvironment()->drawAll(); driver->endScene(); if (m_clouds_enabled) cloudPostProcess(); else sleep_ms(25); m_script->step(); #ifdef __ANDROID__ m_menu->getAndroidUIInput(); #endif } } /******************************************************************************/ GUIEngine::~GUIEngine() { video::IVideoDriver* driver = m_device->getVideoDriver(); FATAL_ERROR_IF(driver == 0, "Could not get video driver"); if(m_sound_manager != &dummySoundManager){ delete m_sound_manager; m_sound_manager = NULL; } infostream<<"GUIEngine: Deinitializing scripting"<<std::endl; delete m_script; m_irr_toplefttext->setText(L""); //clean up texture pointers for (unsigned int i = 0; i < TEX_LAYER_MAX; i++) { if (m_textures[i].texture != NULL) driver->removeTexture(m_textures[i].texture); } delete m_texture_source; if (m_cloud.clouds) m_cloud.clouds->drop(); } /******************************************************************************/ void GUIEngine::cloudInit() { m_cloud.clouds = new Clouds(m_smgr->getRootSceneNode(), m_smgr, -1, rand(), 100); m_cloud.clouds->update(v2f(0, 0), video::SColor(255,200,200,255)); m_cloud.camera = m_smgr->addCameraSceneNode(0, v3f(0,0,0), v3f(0, 60, 100)); m_cloud.camera->setFarValue(10000); m_cloud.lasttime = m_device->getTimer()->getTime(); } /******************************************************************************/ void GUIEngine::cloudPreProcess() { u32 time = m_device->getTimer()->getTime(); if(time > m_cloud.lasttime) m_cloud.dtime = (time - m_cloud.lasttime) / 1000.0; else m_cloud.dtime = 0; m_cloud.lasttime = time; m_cloud.clouds->step(m_cloud.dtime*3); m_cloud.clouds->render(); m_smgr->drawAll(); } /******************************************************************************/ void GUIEngine::cloudPostProcess() { float fps_max = g_settings->getFloat("fps_max"); // Time of frame without fps limit u32 busytime_u32; // not using getRealTime is necessary for wine u32 time = m_device->getTimer()->getTime(); if(time > m_cloud.lasttime) busytime_u32 = time - m_cloud.lasttime; else busytime_u32 = 0; // FPS limiter u32 frametime_min = 1000./fps_max; if(busytime_u32 < frametime_min) { u32 sleeptime = frametime_min - busytime_u32; m_device->sleep(sleeptime); } } /******************************************************************************/ void GUIEngine::drawBackground(video::IVideoDriver* driver) { v2u32 screensize = driver->getScreenSize(); video::ITexture* texture = m_textures[TEX_LAYER_BACKGROUND].texture; /* If no texture, draw background of solid color */ if(!texture){ video::SColor color(255,80,58,37); core::rect<s32> rect(0, 0, screensize.X, screensize.Y); driver->draw2DRectangle(color, rect, NULL); return; } v2u32 sourcesize = texture->getOriginalSize(); if (m_textures[TEX_LAYER_BACKGROUND].tile) { v2u32 tilesize( MYMAX(sourcesize.X,m_textures[TEX_LAYER_BACKGROUND].minsize), MYMAX(sourcesize.Y,m_textures[TEX_LAYER_BACKGROUND].minsize)); for (unsigned int x = 0; x < screensize.X; x += tilesize.X ) { for (unsigned int y = 0; y < screensize.Y; y += tilesize.Y ) { draw2DImageFilterScaled(driver, texture, core::rect<s32>(x, y, x+tilesize.X, y+tilesize.Y), core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, true); } } return; } /* Draw background texture */ draw2DImageFilterScaled(driver, texture, core::rect<s32>(0, 0, screensize.X, screensize.Y), core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, true); } /******************************************************************************/ void GUIEngine::drawOverlay(video::IVideoDriver* driver) { v2u32 screensize = driver->getScreenSize(); video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture; /* If no texture, draw background of solid color */ if(!texture) return; /* Draw background texture */ v2u32 sourcesize = texture->getOriginalSize(); draw2DImageFilterScaled(driver, texture, core::rect<s32>(0, 0, screensize.X, screensize.Y), core::rect<s32>(0, 0, sourcesize.X, sourcesize.Y), NULL, NULL, true); } /******************************************************************************/ void GUIEngine::drawHeader(video::IVideoDriver* driver) { core::dimension2d<u32> screensize = driver->getScreenSize(); video::ITexture* texture = m_textures[TEX_LAYER_HEADER].texture; /* If no texture, draw nothing */ if(!texture) return; f32 mult = (((f32)screensize.Width / 2.0)) / ((f32)texture->getOriginalSize().Width); v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult, ((f32)texture->getOriginalSize().Height) * mult); // Don't draw the header is there isn't enough room s32 free_space = (((s32)screensize.Height)-320)/2; if (free_space > splashsize.Y) { core::rect<s32> splashrect(0, 0, splashsize.X, splashsize.Y); splashrect += v2s32((screensize.Width/2)-(splashsize.X/2), ((free_space/2)-splashsize.Y/2)+10); video::SColor bgcolor(255,50,50,50); draw2DImageFilterScaled(driver, texture, splashrect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(texture->getOriginalSize())), NULL, NULL, true); } } /******************************************************************************/ void GUIEngine::drawFooter(video::IVideoDriver* driver) { core::dimension2d<u32> screensize = driver->getScreenSize(); video::ITexture* texture = m_textures[TEX_LAYER_FOOTER].texture; /* If no texture, draw nothing */ if(!texture) return; f32 mult = (((f32)screensize.Width)) / ((f32)texture->getOriginalSize().Width); v2s32 footersize(((f32)texture->getOriginalSize().Width) * mult, ((f32)texture->getOriginalSize().Height) * mult); // Don't draw the footer if there isn't enough room s32 free_space = (((s32)screensize.Height)-320)/2; if (free_space > footersize.Y) { core::rect<s32> rect(0,0,footersize.X,footersize.Y); rect += v2s32(screensize.Width/2,screensize.Height-footersize.Y); rect -= v2s32(footersize.X/2, 0); draw2DImageFilterScaled(driver, texture, rect, core::rect<s32>(core::position2d<s32>(0,0), core::dimension2di(texture->getOriginalSize())), NULL, NULL, true); } } /******************************************************************************/ bool GUIEngine::setTexture(texture_layer layer, std::string texturepath, bool tile_image, unsigned int minsize) { video::IVideoDriver* driver = m_device->getVideoDriver(); FATAL_ERROR_IF(driver == 0, "Could not get video driver"); if (m_textures[layer].texture != NULL) { driver->removeTexture(m_textures[layer].texture); m_textures[layer].texture = NULL; } if ((texturepath == "") || !fs::PathExists(texturepath)) { return false; } m_textures[layer].texture = driver->getTexture(texturepath.c_str()); m_textures[layer].tile = tile_image; m_textures[layer].minsize = minsize; if (m_textures[layer].texture == NULL) { return false; } return true; } /******************************************************************************/ bool GUIEngine::downloadFile(std::string url, std::string target) { #if USE_CURL std::ofstream target_file(target.c_str(), std::ios::out | std::ios::binary); if (!target_file.good()) { return false; } HTTPFetchRequest fetch_request; HTTPFetchResult fetch_result; fetch_request.url = url; fetch_request.caller = HTTPFETCH_SYNC; fetch_request.timeout = g_settings->getS32("curl_file_download_timeout"); httpfetch_sync(fetch_request, fetch_result); if (!fetch_result.succeeded) { return false; } target_file << fetch_result.data; return true; #else return false; #endif } /******************************************************************************/ void GUIEngine::setTopleftText(std::string append) { std::wstring toset = narrow_to_wide(std::string(PROJECT_NAME_C " ") + g_version_hash); if (append != "") { toset += L" / "; toset += narrow_to_wide(append); } m_irr_toplefttext->setText(toset.c_str()); updateTopLeftTextSize(); } /******************************************************************************/ void GUIEngine::updateTopLeftTextSize() { std::wstring text = m_irr_toplefttext->getText(); core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(text), g_fontengine->getTextHeight()); rect += v2s32(4, 0); m_irr_toplefttext->remove(); m_irr_toplefttext = m_device->getGUIEnvironment()->addStaticText(text.c_str(), rect,false,true,0,-1); } /******************************************************************************/ s32 GUIEngine::playSound(SimpleSoundSpec spec, bool looped) { s32 handle = m_sound_manager->playSound(spec, looped); return handle; } /******************************************************************************/ void GUIEngine::stopSound(s32 handle) { m_sound_manager->stopSound(handle); } /******************************************************************************/ unsigned int GUIEngine::queueAsync(std::string serialized_func, std::string serialized_params) { return m_script->queueAsync(serialized_func, serialized_params); }