aboutsummaryrefslogtreecommitdiff
path: root/src/environment.cpp
Commit message (Collapse)AuthorAge
* + firefliesNils Dagsson Moskopp2011-07-20
|
* * fix automerge regressionNils Dagsson Moskopp2011-07-15
|
* Merge branch 'upstream/master'Nils Dagsson Moskopp2011-07-14
|\ | | | | | | | | | | Conflicts: data/oerkki1.png src/client.cpp
| * made screen go slightly blue when underwaterPerttu Ahola2011-07-01
| |
| * Fixed objects being sometimes not able to be stored statically in a block ↵Perttu Ahola2011-07-01
| | | | | | | | when block has been unloaded
| * map unloading is now a whole lot betterPerttu Ahola2011-06-27
| |
| * fixed block unloading from memory (a better fix coming next)Perttu Ahola2011-06-26
| |
| * reorganized a lot of stuff and modified mapgen and objects slightly while ↵Perttu Ahola2011-06-26
| | | | | | | | doing it
| * even more code refactoringPerttu Ahola2011-06-26
| |
* | Merge branch 'master' of https://github.com/erlehmann/minetest-delta.git ↵Sebastian Rühl2011-06-26
|\ \ | |/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | into upstream_merge Conflicts: .gitignore CMakeLists.txt data/heart.png src/CMakeLists.txt src/game.cpp src/guiMainMenu.cpp src/inventory.cpp src/map.cpp src/mapblock.cpp src/mapnode.cpp src/mapnode.h src/materials.cpp src/server.cpp Signed-off-by: Sebastian Rühl <bahamada_basti@yahoo.de>
* | mapgen stuffPerttu Ahola2011-06-25
| |
* | New map generator added (and SQLite, messed up the commits at that time...) ↵Perttu Ahola2011-06-25
| | | | | | | | (import from temporary git repo)
* | Moved some mapnode content stuff from mapnode.{h,cpp} and digging property ↵Perttu Ahola2011-06-17
| | | | | | | | stuff from material.cpp to content_mapnode.{h,cpp}
* | tried to reduce unnecessary map saving disk i/o a bitPerttu Ahola2011-06-05
| |
* | Reduced server CPU usage on NodeMetadata step()s. Also furnace now cooks ↵Perttu Ahola2011-05-31
| | | | | | | | while no players are near it.
* | tuned grass growth ratePerttu Ahola2011-05-29
| | | | | | | | | | --HG-- extra : rebase_source : 8ad4d13fc7ab1088ebd18cf968d912949aab8eae
* | player passwords and privileges in world/auth.txtPerttu Ahola2011-05-29
|/ | | | | --HG-- extra : rebase_source : 7260636295d9068fbeeddf4143c89f2b8a91446c
* Some work-in-progress stuff and many comment updatesPerttu Ahola2011-05-22
|
* Preliminary "active block" stuff + set up test code to grow grass.Perttu Ahola2011-05-22
|
* Fixed a small memory leak in ServerEnvironment and cleaned the code a bitPerttu Ahola2011-05-21
|
* random comment updatesPerttu Ahola2011-04-30
|
* Code refactoring; split half of main.cpp to game.cpp.Perttu Ahola2011-04-23
|
* Some work-in-progress in hp and mobs and a frightening amount of random fixes.Perttu Ahola2011-04-21
|
* fixed the object update interval thingyPerttu Ahola2011-04-10
|
* changed server to do object management at longer intervals (0.5s)Perttu Ahola2011-04-10
|
* Made environment to not consider disconnected players when dealing with ↵Perttu Ahola2011-04-10
| | | | ActiveObjects
* Map generation is now properly threaded and doesn't block block placement ↵Perttu Ahola2011-04-10
| | | | and other stuff.
* a commit before starting to reorganize the map loading/generation logicPerttu Ahola2011-04-10
|
* new-style rats are now generated in the mapPerttu Ahola2011-04-10
|
* fixed a bitPerttu Ahola2011-04-10
|
* implemented rats in new system to verify that it worksPerttu Ahola2011-04-10
|
* new object systemPerttu Ahola2011-04-10
|
* Some progress on transitioning from MapBlockObject to ActiveObject.Perttu Ahola2011-04-08
|
* Modified block mesh generation to have clearer input and output. Instead of ↵Perttu Ahola2011-04-03
| | | | being a messy object oriented cludge, it now is a messy cludge with separate parameters.
* Removed lua stuffPerttu Ahola2011-04-03
|
* fixed a possible infinite loop in ClientEnvironment (dtime counter getting ↵Perttu Ahola2011-02-24
| | | | so small that it doesn't increment the value)
* updated scripting api a bitPerttu Ahola2011-02-23
| | | | | | --HG-- rename : data/luaobjects/test/client.lua => data/scripts/objects/test/client.lua rename : data/luaobjects/test/server.lua => data/scripts/objects/test/server.lua
* mainly work on object scripting apiPerttu Ahola2011-02-23
|
* preliminary lua scripting framework for objectsPerttu Ahola2011-02-21
|
* Temporary commit; lots of test code and stuffPerttu Ahola2011-02-21
|
* added sneaking/crouching and changelogPerttu Ahola2011-02-14
|
* work-in-progress texture atlas optimizationPerttu Ahola2011-02-10
|
* bug-fixin'Perttu Ahola2011-02-08
|
* mapgen tweakingPerttu Ahola2011-02-06
|
* This map generator is starting to look pretty good now... also, disabled ↵Perttu Ahola2011-02-01
| | | | loading player position from disk because map is regenerated always.
* Commented out some debug output about saving players on server.Perttu Ahola2011-01-29
|
* Now texture handling is fast. Also now players are saved on disk.Perttu Ahola2011-01-28
|
* OMG! Main Menu!Perttu Ahola2011-01-23
|
* fixed erroneus handling of many players with no peer existing at same timePerttu Ahola2011-01-18
|
* old water removed, some fixes here and therePerttu Ahola2011-01-17
|
_cache[i].end(); ++iter) { iter->second->drop(); iter->second = NULL; } m_font_cache[i].clear(); } } /******************************************************************************/ irr::gui::IGUIFont* FontEngine::getFont(unsigned int font_size, FontMode mode) { if (mode == FM_Unspecified) { mode = m_currentMode; } else if ((mode == FM_Mono) && (m_currentMode == FM_Simple)) { mode = FM_SimpleMono; } if (font_size == FONT_SIZE_UNSPECIFIED) { font_size = m_default_size[mode]; } if ((font_size == m_lastSize) && (mode == m_lastMode)) { return m_lastFont; } if (m_font_cache[mode].find(font_size) == m_font_cache[mode].end()) { initFont(font_size, mode); } if (m_font_cache[mode].find(font_size) == m_font_cache[mode].end()) { return NULL; } m_lastSize = font_size; m_lastMode = mode; m_lastFont = m_font_cache[mode][font_size]; return m_font_cache[mode][font_size]; } /******************************************************************************/ unsigned int FontEngine::getTextHeight(unsigned int font_size, FontMode mode) { irr::gui::IGUIFont* font = getFont(font_size, mode); // use current skin font as fallback if (font == NULL) { font = m_env->getSkin()->getFont(); } FATAL_ERROR_IF(font == NULL, "Could not get skin font"); return font->getDimension(L"Some unimportant example String").Height; } /******************************************************************************/ unsigned int FontEngine::getTextWidth(const std::wstring& text, unsigned int font_size, FontMode mode) { irr::gui::IGUIFont* font = getFont(font_size, mode); // use current skin font as fallback if (font == NULL) { font = m_env->getSkin()->getFont(); } FATAL_ERROR_IF(font == NULL, "Could not get font"); return font->getDimension(text.c_str()).Width; } /** get line height for a specific font (including empty room between lines) */ unsigned int FontEngine::getLineHeight(unsigned int font_size, FontMode mode) { irr::gui::IGUIFont* font = getFont(font_size, mode); // use current skin font as fallback if (font == NULL) { font = m_env->getSkin()->getFont(); } FATAL_ERROR_IF(font == NULL, "Could not get font"); return font->getDimension(L"Some unimportant example String").Height + font->getKerningHeight(); } /******************************************************************************/ unsigned int FontEngine::getDefaultFontSize() { return m_default_size[m_currentMode]; } /******************************************************************************/ void FontEngine::readSettings() { #if USE_FREETYPE if (g_settings->getBool("freetype")) { m_default_size[FM_Standard] = m_settings->getU16("font_size"); m_default_size[FM_Fallback] = m_settings->getU16("fallback_font_size"); m_default_size[FM_Mono] = m_settings->getU16("mono_font_size"); if (is_yes(gettext("needs_fallback_font"))) { m_currentMode = FM_Fallback; } else { m_currentMode = FM_Standard; } } #endif m_default_size[FM_Simple] = m_settings->getU16("font_size"); m_default_size[FM_SimpleMono] = m_settings->getU16("mono_font_size"); cleanCache(); updateFontCache(); updateSkin(); } /******************************************************************************/ void FontEngine::updateSkin() { gui::IGUIFont *font = getFont(); if (font) m_env->getSkin()->setFont(font); else errorstream << "FontEngine: Default font file: " << "\n\t\"" << m_settings->get("font_path") << "\"" << "\n\trequired for current screen configuration was not found" << " or was invalid file format." << "\n\tUsing irrlicht default font." << std::endl; // If we did fail to create a font our own make irrlicht find a default one font = m_env->getSkin()->getFont(); FATAL_ERROR_IF(font == NULL, "Could not create/get font"); u32 text_height = font->getDimension(L"Hello, world!").Height; infostream << "text_height=" << text_height << std::endl; } /******************************************************************************/ void FontEngine::updateFontCache() { /* the only font to be initialized is default one, * all others are re-initialized on demand */ initFont(m_default_size[m_currentMode], m_currentMode); /* reset font quick access */ m_lastMode = FM_Unspecified; m_lastSize = 0; m_lastFont = NULL; } /******************************************************************************/ void FontEngine::initFont(unsigned int basesize, FontMode mode) { std::string font_config_prefix; if (mode == FM_Unspecified) { mode = m_currentMode; } switch (mode) { case FM_Standard: font_config_prefix = ""; break; case FM_Fallback: font_config_prefix = "fallback_"; break; case FM_Mono: font_config_prefix = "mono_"; if (m_currentMode == FM_Simple) mode = FM_SimpleMono; break; case FM_Simple: /* Fallthrough */ case FM_SimpleMono: /* Fallthrough */ default: font_config_prefix = ""; } if (m_font_cache[mode].find(basesize) != m_font_cache[mode].end()) return; if ((mode == FM_Simple) || (mode == FM_SimpleMono)) { initSimpleFont(basesize, mode); return; } #if USE_FREETYPE else { if (! is_yes(m_settings->get("freetype"))) { return; } unsigned int size = floor( porting::getDisplayDensity() * m_settings->getFloat("gui_scaling") * basesize); u32 font_shadow = 0; u32 font_shadow_alpha = 0; try { font_shadow = g_settings->getU16(font_config_prefix + "font_shadow"); } catch (SettingNotFoundException&) {} try { font_shadow_alpha = g_settings->getU16(font_config_prefix + "font_shadow_alpha"); } catch (SettingNotFoundException&) {} std::string font_path = g_settings->get(font_config_prefix + "font_path"); irr::gui::IGUIFont* font = gui::CGUITTFont::createTTFont(m_env, font_path.c_str(), size, true, true, font_shadow, font_shadow_alpha); if (font != NULL) { m_font_cache[mode][basesize] = font; } else { errorstream << "FontEngine: failed to load freetype font: " << font_path << std::endl; } } #endif } /** initialize a font without freetype */ void FontEngine::initSimpleFont(unsigned int basesize, FontMode mode) { assert(mode == FM_Simple || mode == FM_SimpleMono); // pre-condition std::string font_path = ""; if (mode == FM_Simple) { font_path = m_settings->get("font_path"); } else { font_path = m_settings->get("mono_font_path"); } std::string basename = font_path; std::string ending = font_path.substr(font_path.length() -4); if (ending == ".ttf") { errorstream << "FontEngine: Not trying to open \"" << font_path << "\" which seems to be a truetype font." << std::endl; return; } if ((ending == ".xml") || (ending == ".png")) { basename = font_path.substr(0,font_path.length()-4); } if (basesize == FONT_SIZE_UNSPECIFIED) basesize = DEFAULT_FONT_SIZE; unsigned int size = floor( porting::getDisplayDensity() * m_settings->getFloat("gui_scaling") * basesize); irr::gui::IGUIFont* font = NULL; for(unsigned int offset = 0; offset < MAX_FONT_SIZE_OFFSET; offset++) { // try opening positive offset std::stringstream fontsize_plus_png; fontsize_plus_png << basename << "_" << (size + offset) << ".png"; if (fs::PathExists(fontsize_plus_png.str())) { font = m_env->getFont(fontsize_plus_png.str().c_str()); if (font) { verbosestream << "FontEngine: found font: " << fontsize_plus_png.str() << std::endl; break; } } std::stringstream fontsize_plus_xml; fontsize_plus_xml << basename << "_" << (size + offset) << ".xml"; if (fs::PathExists(fontsize_plus_xml.str())) { font = m_env->getFont(fontsize_plus_xml.str().c_str()); if (font) { verbosestream << "FontEngine: found font: " << fontsize_plus_xml.str() << std::endl; break; } } // try negative offset std::stringstream fontsize_minus_png; fontsize_minus_png << basename << "_" << (size - offset) << ".png"; if (fs::PathExists(fontsize_minus_png.str())) { font = m_env->getFont(fontsize_minus_png.str().c_str()); if (font) { verbosestream << "FontEngine: found font: " << fontsize_minus_png.str() << std::endl; break; } } std::stringstream fontsize_minus_xml; fontsize_minus_xml << basename << "_" << (size - offset) << ".xml"; if (fs::PathExists(fontsize_minus_xml.str())) { font = m_env->getFont(fontsize_minus_xml.str().c_str()); if (font) { verbosestream << "FontEngine: found font: " << fontsize_minus_xml.str() << std::endl; break; } } } // try name direct if (font == NULL) { if (fs::PathExists(font_path)) { font = m_env->getFont(font_path.c_str()); if (font) verbosestream << "FontEngine: found font: " << font_path << std::endl; } } if (font != NULL) { font->grab(); m_font_cache[mode][basesize] = font; } }