aboutsummaryrefslogtreecommitdiff
path: root/textures/base
Commit message (Collapse)AuthorAge
* Add no_texture.png as fallback for unspecified texturesWuzzy2021-10-20
|
* Mainmenu: Improve "Join Game" tab (#11078)sfan52021-03-20
|
* Use "Aux1" key name consistently everywhereWuzzy2021-02-24
|
* "Browse online content" formspec improvement (#10756)Zughy2021-01-02
|
* MainMenu: Add clear button and icon for search input (#10363)Andrey2020-12-19
|
* Improve default inventory+wield images of node drawtypes (#9299)Wuzzy2020-07-23
|
* Add buttons to ContentDB in game bar and configure world (#9944)rubenwardy2020-06-04
|
* Update ContentDB dialog (#9949)rubenwardy2020-05-29
|
* Add support for statbar “off state” icons (#9462)Wuzzy2020-05-11
| | | | | | | This adds support for optional “off state” icons for statbars. “off state icons” can be used to denote the lack of something, like missing hearts or bubbles. Add "off state" textures to the builtin statbars. Co-authored-by: SmallJoker <mk939@ymail.com>
* Tweak default textures (#9237)Wuzzy2020-01-04
|
* Add 4 missing fallback/default textures (#8845)Wuzzy2019-10-23
| | | Processed using 'optipng -o7 -strip all '
* Add player sprite textures back into the engine as a fallback (#8823)Paramat2019-08-20
| | | | | | | 'player.png' and 'player_back.png' are hardcoded into the engine as the default appearence of the player object, so the textures should be present in the engine. This results in a functional fallback sprite player for when a game has no player appearence related code.
* Mirror 'sunrisebg' texture to fix chopped right edge (#7935)Paramat2018-12-04
|
* Re-master and improve touchscreen gui icons (#7931)stujones112018-12-03
| | | | Increase the resolution of the smaller icons to look better on modern HD screens. All master SVGs included in the the Android build directory.
* Android: Improve UI scaling on smaller high-density displays (#7834)stujones112018-11-18
| | | | * Android: Improve UI scaling on smaller high-density displays
* Android buttons: Inset 'rare controls', inset and resize 'gear icon' (#7792)Paramat2018-10-19
| | | | | Previously these were both inconsistently close to the screen edge. 'gear icon' has been enlarged to match the width of 'zoom' and 'aux' buttons.
* Android: Add 'aux' button (#7477)Muhammad Rifqi Priyo Susanto2018-07-10
| | | | | Add 'aux' button. Use joystick to trigger 'aux' button when forward and out of main circle, by enabling 'virtual_joystick_triggers_aux' setting.
* Android: Resize jump and sneak buttons' touch target (#7498)Muhammad Rifqi Priyo Susanto2018-06-30
|
* Add screenshots to online content browserrubenwardy2018-05-20
|
* Android: Modify touch screen GUI's buttons (#7240)Muhammad Rifqi Priyo Susanto2018-04-18
| | | | | | | * Android: Add zoom, minimap, and toggle chat button Zoom button is put above jump button. Minimap and toggle chat button are put in settings bar. * Jump button is rotated down button * Move three buttons on the right screen higher
* Android: Replace movement buttons with joystick (#7126)Muhammad Rifqi Priyo Susanto2018-04-10
| | | | | | | | | | | | | | | | | * Android: Replace movement buttons with joystick Replace movement control buttons (arrows at bottom left screen) with virtual joystick. Joystick has 8 directions (same as keyboard). Basically, just map it to keyboard input. Joystick applies only on left 1/3 of screen. Joystick's position can be fixed by enabling fixed_virtual_joystick setting. Three new images: (1) placeholder joystick, (2) joystick container (background), and (3) joystick cursor. Remove unused images: movement control buttons (*_arrow.png). New data type: touch_gui_joystick_move_id Joystick's fixed position is spaced one button size from bottom and from left of screen. Remove unused variable: m_joystick_downlocation
* Add a refresh button to the serverlist (#6957)Tre2018-02-19
| | | | | | | | * add refresh button * Make search and refresh buttons smaller * Change to image button
* Minimap: Leaner minimap arrow makes it easier to see the directionJens Rottmann2017-08-09
| | | | | | | | The arrow symbolizing the player in the square minimap looks almost like a triangle, making it a bit hard to see which direction it is currently pointing in when in a hurry. Redraw it leaner, pointier. Colors unchanged.
* GUI: Convert loading screen's progress bar to image (#5362)kilbith2017-03-10
|
* Add textures for air and ignore items (#5196)Wuzzy2017-02-10
|
* Serverlist: Add ping indicators (#5164)kilbith2017-02-03
|
* Halo: Highlight selected faceRealBadAngel2016-11-12
| | | | | This is a slightly modified and cleaned up version of #3774 by RealBadAngel. By sofar: Remove color change (just make it lighter) and some minor cleanups.
* Textures: New 'smoke puff' texture from TNT modparamat2016-10-04
|
* Main menu, lua_api.txt: Fix mod/texture pack screenshot size issuesWuzzy2016-07-27
| | | | | | Recommend mod screenshot size in lua_api.txt Adjust displayed screenshot size of texture packs Document texture pack files in lua_api.txt
* Textures: Replace menu background fallback dirt_bg.png with empty sky textureparamat2016-04-21
|
* Mainmenu: Unify favorite servers with main serverlistkilbith2016-04-20
|
* Minimap: revert change from RGBA to IndexedAuke Kok2016-04-11
| | | | | | @kilbith spotted correctly that I had accidentally removed the "soft" edging on the minimap overlay by converting it from RGBA to Indexed, which killed the transparent pixels on the edging.
* Minimap: "North" indicator arrow for circle minimapAuke Kok2016-04-08
| | | | | | | | | | Related: #3730 This adds a simple, and small "North" indicator to the circular minimap. The indicator is in a classical triangle-like arrow with a little bit of shading to accentuate the shape and give it a little bit depth. The indicator is stuck exactly at the edge as far outwards as possible, and is not too intrusive but still easy enough to spot.
* Update menu header imageJean-Patrick Guerrero2016-03-25
|
* Resize object_marker_red.png to 16x16ShadowNinja2016-02-28
| | | | Having a non-power-of-two image broke the Android app.
* Minimap: show player markersRealBadAngel2016-02-19
|
* Cleanup selection mesh code, add shaders for halo and selection boxesRealBadAngel2016-02-08
|
* Android: Implement Autohiding button bars to cleanup screenSapier2015-12-18
|
* Compress textures and fontsMaksim Gamarnik2015-10-15
| | | | | Used PNGOUT, OptiPNG and DeflOpt. Removes ~350 KB without any loss in quality.
* Fix relief mapping issuesRealBadAngel2015-07-16
|
* Add minimap featureRealBadAngel2015-06-27
|
* Use frame instead of words 'no screenshot available'rubenwardy2015-06-24
|
* Add extra buttons to Android GUI. All icons are licensed by freepik.com ↵Kodexky2014-12-30
| | | | under CC BY 3.0
* Regenerate server_flags_creative.png from XCFKahrl2014-12-21
|
* Fix background of creative icon (was black, now transparent)Kahrl2014-12-14
|
* Display serverlist flags as iconsKahrl2014-12-13
|
* Fix MSVC compiling warnings and remove an unused textureSmallJoker2014-12-12
|
* Change default halo.png for better visibility.RealBadAngel2014-09-19
|
* Node highlighting.RealBadAngel2014-09-17
|
* Add support for Android 2.3+sapier2014-06-29
| | | | | | | | | | | | | There have been plenty of ppl involved in creating this version. I don't wanna mention names as I'm sure I'd forget someone so I just tell where help has been done: - The partial android versions done by various ppl - Testing on different android devices - reviewing code (especially the in core changes) - testing controls - reviewing texts A big thank you to everyone helping this to be completed!
mpleSoundSpec serialization */ static void serializeSimpleSoundSpec(const SimpleSoundSpec &ss, std::ostream &os) { os<<serializeString(ss.name); writeF1000(os, ss.gain); } static void deSerializeSimpleSoundSpec(SimpleSoundSpec &ss, std::istream &is) { ss.name = deSerializeString(is); ss.gain = readF1000(is); } /* ContentFeatures */ ContentFeatures::ContentFeatures() { reset(); } ContentFeatures::~ContentFeatures() { } void ContentFeatures::reset() { /* Cached stuff */ #ifndef SERVER solidness = 2; visual_solidness = 0; backface_culling = true; #endif has_on_construct = false; has_on_destruct = false; has_after_destruct = false; /* Actual data NOTE: Most of this is always overridden by the default values given in builtin.lua */ name = ""; groups.clear(); // Unknown nodes can be dug groups["dig_immediate"] = 2; drawtype = NDT_NORMAL; visual_scale = 1.0; for(u32 i=0; i<6; i++) tname_tiles[i] = ""; for(u16 j=0; j<CF_SPECIAL_COUNT; j++) mspec_special[j] = MaterialSpec(); alpha = 255; post_effect_color = video::SColor(0, 0, 0, 0); param_type = CPT_NONE; param_type_2 = CPT2_NONE; is_ground_content = false; light_propagates = false; sunlight_propagates = false; walkable = true; pointable = true; diggable = true; climbable = false; buildable_to = false; liquid_type = LIQUID_NONE; liquid_alternative_flowing = ""; liquid_alternative_source = ""; liquid_viscosity = 0; light_source = 0; damage_per_second = 0; selection_box = NodeBox(); legacy_facedir_simple = false; legacy_wallmounted = false; sound_footstep = SimpleSoundSpec(); sound_dig = SimpleSoundSpec("__group"); sound_dug = SimpleSoundSpec(); } void ContentFeatures::serialize(std::ostream &os) { writeU8(os, 3); // version os<<serializeString(name); writeU16(os, groups.size()); for(ItemGroupList::const_iterator i = groups.begin(); i != groups.end(); i++){ os<<serializeString(i->first); writeS16(os, i->second); } writeU8(os, drawtype); writeF1000(os, visual_scale); writeU8(os, 6); for(u32 i=0; i<6; i++) os<<serializeString(tname_tiles[i]); writeU8(os, CF_SPECIAL_COUNT); for(u32 i=0; i<CF_SPECIAL_COUNT; i++){ mspec_special[i].serialize(os); } writeU8(os, alpha); writeU8(os, post_effect_color.getAlpha()); writeU8(os, post_effect_color.getRed()); writeU8(os, post_effect_color.getGreen()); writeU8(os, post_effect_color.getBlue()); writeU8(os, param_type); writeU8(os, param_type_2); writeU8(os, is_ground_content); writeU8(os, light_propagates); writeU8(os, sunlight_propagates); writeU8(os, walkable); writeU8(os, pointable); writeU8(os, diggable); writeU8(os, climbable); writeU8(os, buildable_to); os<<serializeString(""); // legacy: used to be metadata_name writeU8(os, liquid_type); os<<serializeString(liquid_alternative_flowing); os<<serializeString(liquid_alternative_source); writeU8(os, liquid_viscosity); writeU8(os, light_source); writeU32(os, damage_per_second); selection_box.serialize(os); writeU8(os, legacy_facedir_simple); writeU8(os, legacy_wallmounted); serializeSimpleSoundSpec(sound_footstep, os); serializeSimpleSoundSpec(sound_dig, os); serializeSimpleSoundSpec(sound_dug, os); } void ContentFeatures::deSerialize(std::istream &is) { int version = readU8(is); if(version != 3) throw SerializationError("unsupported ContentFeatures version"); name = deSerializeString(is); groups.clear(); u32 groups_size = readU16(is); for(u32 i=0; i<groups_size; i++){ std::string name = deSerializeString(is); int value = readS16(is); groups[name] = value; } drawtype = (enum NodeDrawType)readU8(is); visual_scale = readF1000(is); if(readU8(is) != 6) throw SerializationError("unsupported tile count"); for(u32 i=0; i<6; i++) tname_tiles[i] = deSerializeString(is); if(readU8(is) != CF_SPECIAL_COUNT) throw SerializationError("unsupported CF_SPECIAL_COUNT"); for(u32 i=0; i<CF_SPECIAL_COUNT; i++){ mspec_special[i].deSerialize(is); } alpha = readU8(is); post_effect_color.setAlpha(readU8(is)); post_effect_color.setRed(readU8(is)); post_effect_color.setGreen(readU8(is)); post_effect_color.setBlue(readU8(is)); param_type = (enum ContentParamType)readU8(is); param_type_2 = (enum ContentParamType2)readU8(is); is_ground_content = readU8(is); light_propagates = readU8(is); sunlight_propagates = readU8(is); walkable = readU8(is); pointable = readU8(is); diggable = readU8(is); climbable = readU8(is); buildable_to = readU8(is); deSerializeString(is); // legacy: used to be metadata_name liquid_type = (enum LiquidType)readU8(is); liquid_alternative_flowing = deSerializeString(is); liquid_alternative_source = deSerializeString(is); liquid_viscosity = readU8(is); light_source = readU8(is); damage_per_second = readU32(is); selection_box.deSerialize(is); legacy_facedir_simple = readU8(is); legacy_wallmounted = readU8(is); // If you add anything here, insert it primarily inside the try-catch // block to not need to increase the version. try{ deSerializeSimpleSoundSpec(sound_footstep, is); deSerializeSimpleSoundSpec(sound_dig, is); deSerializeSimpleSoundSpec(sound_dug, is); }catch(SerializationError &e) {}; } /* CNodeDefManager */ class CNodeDefManager: public IWritableNodeDefManager { public: void clear() { m_name_id_mapping.clear(); m_name_id_mapping_with_aliases.clear(); for(u16 i=0; i<=MAX_CONTENT; i++) { ContentFeatures &f = m_content_features[i]; f.reset(); // Reset to defaults } // Set CONTENT_AIR { ContentFeatures f; f.name = "air"; f.drawtype = NDT_AIRLIKE; f.param_type = CPT_LIGHT; f.light_propagates = true; f.sunlight_propagates = true; f.walkable = false; f.pointable = false; f.diggable = false; f.buildable_to = true; // Insert directly into containers content_t c = CONTENT_AIR; m_content_features[c] = f; addNameIdMapping(c, f.name); } // Set CONTENT_IGNORE { ContentFeatures f; f.name = "ignore"; f.drawtype = NDT_AIRLIKE; f.param_type = CPT_NONE; f.light_propagates = false; f.sunlight_propagates = false; f.walkable = false; f.pointable = false; f.diggable = false; // A way to remove accidental CONTENT_IGNOREs f.buildable_to = true; // Insert directly into containers content_t c = CONTENT_IGNORE; m_content_features[c] = f; addNameIdMapping(c, f.name); } } // CONTENT_IGNORE = not found content_t getFreeId(bool require_full_param2) { // If allowed, first search in the large 4-bit-param2 pool if(!require_full_param2){ for(u16 i=0x800; i<=0xfff; i++){ const ContentFeatures &f = m_content_features[i]; if(f.name == "") return i; } } // Then search from the small 8-bit-param2 pool for(u16 i=0; i<=125; i++){ const ContentFeatures &f = m_content_features[i]; if(f.name == "") return i; } return CONTENT_IGNORE; } CNodeDefManager() { clear(); } virtual ~CNodeDefManager() { } virtual IWritableNodeDefManager* clone() { CNodeDefManager *mgr = new CNodeDefManager(); for(u16 i=0; i<=MAX_CONTENT; i++) { mgr->set(i, get(i)); } return mgr; } virtual const ContentFeatures& get(content_t c) const { assert(c <= MAX_CONTENT); return m_content_features[c]; } virtual const ContentFeatures& get(const MapNode &n) const { return get(n.getContent()); } virtual bool getId(const std::string &name, content_t &result) const { std::map<std::string, content_t>::const_iterator i = m_name_id_mapping_with_aliases.find(name); if(i == m_name_id_mapping_with_aliases.end()) return false; result = i->second; return true; } virtual content_t getId(const std::string &name) const { content_t id = CONTENT_IGNORE; getId(name, id); return id; } virtual void getIds(const std::string &name, std::set<content_t> &result) const { if(name.substr(0,6) != "group:"){ content_t id = CONTENT_IGNORE; if(getId(name, id)) result.insert(id); return; } std::string group = name.substr(6); for(u16 id=0; id<=MAX_CONTENT; id++) { const ContentFeatures &f = m_content_features[id]; if(f.name == "") // Quickly discard undefined nodes continue; if(itemgroup_get(f.groups, group) != 0) result.insert(id); } } virtual const ContentFeatures& get(const std::string &name) const { content_t id = CONTENT_IGNORE; getId(name, id); return get(id); } // IWritableNodeDefManager virtual void set(content_t c, const ContentFeatures &def) { verbosestream<<"registerNode: registering content id \""<<c <<"\": name=\""<<def.name<<"\""<<std::endl; assert(c <= MAX_CONTENT); // Don't allow redefining CONTENT_IGNORE (but allow air) if(def.name == "ignore" || c == CONTENT_IGNORE){ infostream<<"registerNode: WARNING: Ignoring " <<"CONTENT_IGNORE redefinition"<<std::endl; return; } // Check that the special contents are not redefined as different id // because it would mess up everything if((def.name == "ignore" && c != CONTENT_IGNORE) || (def.name == "air" && c != CONTENT_AIR)){ errorstream<<"registerNode: IGNORING ERROR: " <<"trying to register built-in type \"" <<def.name<<"\" as different id"<<std::endl; return; } m_content_features[c] = def; if(def.name != "") addNameIdMapping(c, def.name); } virtual content_t set(const std::string &name, const ContentFeatures &def) { assert(name == def.name); u16 id = CONTENT_IGNORE; bool found = m_name_id_mapping.getId(name, id); // ignore aliases if(!found){ // Determine if full param2 is required bool require_full_param2 = ( def.param_type_2 == CPT2_FULL || def.param_type_2 == CPT2_FLOWINGLIQUID || def.legacy_wallmounted ); // Get some id id = getFreeId(require_full_param2); if(id == CONTENT_IGNORE) return CONTENT_IGNORE; if(name != "") addNameIdMapping(id, name); } set(id, def); return id; } virtual content_t allocateDummy(const std::string &name) { assert(name != ""); ContentFeatures f; f.name = name; return set(name, f); } virtual void updateAliases(IItemDefManager *idef) { std::set<std::string> all = idef->getAll(); m_name_id_mapping_with_aliases.clear(); for(std::set<std::string>::iterator i = all.begin(); i != all.end(); i++) { std::string name = *i; std::string convert_to = idef->getAlias(name); content_t id; if(m_name_id_mapping.getId(convert_to, id)) { m_name_id_mapping_with_aliases.insert( std::make_pair(name, id)); } } } virtual void updateTextures(ITextureSource *tsrc) { #ifndef SERVER infostream<<"CNodeDefManager::updateTextures(): Updating " <<"textures in node definitions"<<std::endl; bool new_style_water = g_settings->getBool("new_style_water"); bool new_style_leaves = g_settings->getBool("new_style_leaves"); bool opaque_water = g_settings->getBool("opaque_water"); for(u16 i=0; i<=MAX_CONTENT; i++) { ContentFeatures *f = &m_content_features[i]; std::string tname_tiles[6]; for(u32 j=0; j<6; j++) { tname_tiles[j] = f->tname_tiles[j]; if(tname_tiles[j] == "") tname_tiles[j] = "unknown_block.png"; } switch(f->drawtype){ default: case NDT_NORMAL: f->solidness = 2; break; case NDT_AIRLIKE: f->solidness = 0; break; case NDT_LIQUID: assert(f->liquid_type == LIQUID_SOURCE); if(opaque_water) f->alpha = 255; if(new_style_water){ f->solidness = 0; } else { f->solidness = 1; if(f->alpha == 255) f->solidness = 2; f->backface_culling = false; } break; case NDT_FLOWINGLIQUID: assert(f->liquid_type == LIQUID_FLOWING); f->solidness = 0; if(opaque_water) f->alpha = 255; break; case NDT_GLASSLIKE: f->solidness = 0; f->visual_solidness = 1; break; case NDT_ALLFACES: f->solidness = 0; f->visual_solidness = 1; break; case NDT_ALLFACES_OPTIONAL: if(new_style_leaves){ f->drawtype = NDT_ALLFACES; f->solidness = 0; f->visual_solidness = 1; } else { f->drawtype = NDT_NORMAL; f->solidness = 2; for(u32 i=0; i<6; i++){ tname_tiles[i] += std::string("^[noalpha"); } } break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: case NDT_PLANTLIKE: case NDT_FENCELIKE: case NDT_RAILLIKE: f->solidness = 0; break; } // Tile textures for(u16 j=0; j<6; j++){ f->tiles[j].texture = tsrc->getTexture(tname_tiles[j]); f->tiles[j].alpha = f->alpha; if(f->alpha == 255) f->tiles[j].material_type = MATERIAL_ALPHA_SIMPLE; else f->tiles[j].material_type = MATERIAL_ALPHA_VERTEX; f->tiles[j].material_flags = 0; if(f->backface_culling) f->tiles[j].material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; } // Special tiles for(u16 j=0; j<CF_SPECIAL_COUNT; j++){ f->special_tiles[j].texture = tsrc->getTexture(f->mspec_special[j].tname); f->special_tiles[j].alpha = f->alpha; if(f->alpha == 255) f->special_tiles[j].material_type = MATERIAL_ALPHA_SIMPLE; else f->special_tiles[j].material_type = MATERIAL_ALPHA_VERTEX; f->special_tiles[j].material_flags = 0; if(f->mspec_special[j].backface_culling) f->special_tiles[j].material_flags |= MATERIAL_FLAG_BACKFACE_CULLING; } } #endif } void serialize(std::ostream &os) { writeU8(os, 1); // version u16 count = 0; std::ostringstream os2(std::ios::binary); for(u16 i=0; i<=MAX_CONTENT; i++) { if(i == CONTENT_IGNORE || i == CONTENT_AIR) continue; ContentFeatures *f = &m_content_features[i]; if(f->name == "") continue; writeU16(os2, i); // Wrap it in a string to allow different lengths without // strict version incompatibilities std::ostringstream wrapper_os(std::ios::binary); f->serialize(wrapper_os); os2<<serializeString(wrapper_os.str()); count++; } writeU16(os, count); os<<serializeLongString(os2.str()); } void deSerialize(std::istream &is) { clear(); int version = readU8(is); if(version != 1) throw SerializationError("unsupported NodeDefinitionManager version"); u16 count = readU16(is); std::istringstream is2(deSerializeLongString(is), std::ios::binary); for(u16 n=0; n<count; n++){ u16 i = readU16(is2); if(i > MAX_CONTENT){ errorstream<<"ContentFeatures::deSerialize(): " <<"Too large content id: "<<i<<std::endl; continue; } /*// Do not deserialize special types if(i == CONTENT_IGNORE || i == CONTENT_AIR) continue;*/ ContentFeatures *f = &m_content_features[i]; // Read it from the string wrapper std::string wrapper = deSerializeString(is2); std::istringstream wrapper_is(wrapper, std::ios::binary); f->deSerialize(wrapper_is); verbosestream<<"deserialized "<<f->name<<std::endl; if(f->name != "") addNameIdMapping(i, f->name); } } private: void addNameIdMapping(content_t i, std::string name) { m_name_id_mapping.set(i, name); m_name_id_mapping_with_aliases.insert(std::make_pair(name, i)); } private: // Features indexed by id ContentFeatures m_content_features[MAX_CONTENT+1]; // A mapping for fast converting back and forth between names and ids NameIdMapping m_name_id_mapping; // Like m_name_id_mapping, but only from names to ids, and includes // item aliases too. Updated by updateAliases() // Note: Not serialized. std::map<std::string, content_t> m_name_id_mapping_with_aliases; }; IWritableNodeDefManager* createNodeDefManager() { return new CNodeDefManager(); }