X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapnode.cpp;h=2ca4ade7a75e889f33e0b25ce7fb8e18b444c876;hb=c137946a3fc3d2cdbed35fe84cced1a52185bfa3;hp=2ba2a2dbfddac8ede3dc8276a790342ec58dd50d;hpb=6bb9de3cc63ea2e8a848ffda222a5e66cb7c5f45;p=dragonfireclient.git diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 2ba2a2dbf..2ca4ade7a 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -17,11 +17,14 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include "common_irrlicht.h" #include "mapnode.h" #include "tile.h" #include "porting.h" #include #include "mineral.h" +// For g_settings +#include "main.h" ContentFeatures::~ContentFeatures() { @@ -29,6 +32,53 @@ ContentFeatures::~ContentFeatures() delete translate_to; } +void ContentFeatures::setTexture(u16 i, std::string name, u8 alpha) +{ + if(g_texturesource) + { + tiles[i].texture = g_texturesource->getTexture(name); + } + + if(alpha != 255) + { + tiles[i].alpha = alpha; + tiles[i].material_type = MATERIAL_ALPHA_VERTEX; + } + + if(inventory_texture == NULL) + setInventoryTexture(name); +} + +void ContentFeatures::setInventoryTexture(std::string imgname) +{ + if(g_texturesource == NULL) + return; + + imgname += "^[forcesingle"; + + inventory_texture = g_texturesource->getTextureRaw(imgname); +} + +void ContentFeatures::setInventoryTextureCube(std::string top, + std::string left, std::string right) +{ + if(g_texturesource == NULL) + return; + + str_replace_char(top, '^', '&'); + str_replace_char(left, '^', '&'); + str_replace_char(right, '^', '&'); + + std::string imgname_full; + imgname_full += "[inventorycube{"; + imgname_full += top; + imgname_full += "{"; + imgname_full += left; + imgname_full += "{"; + imgname_full += right; + inventory_texture = g_texturesource->getTextureRaw(imgname_full); +} + struct ContentFeatures g_content_features[256]; ContentFeatures & content_features(u8 i) @@ -36,85 +86,144 @@ ContentFeatures & content_features(u8 i) return g_content_features[i]; } -void init_mapnode(IIrrlichtWrapper *irrlicht) +/* + See mapnode.h for description. +*/ +void init_mapnode() { + if(g_texturesource == NULL) + { + dstream<<"INFO: Initial run of init_mapnode with " + "g_texturesource=NULL. If this segfaults, " + "there is a bug with something not checking for " + "the NULL value."<tiles[j].material_type = initial_material_type; + } + u8 i; ContentFeatures *f = NULL; i = CONTENT_STONE; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("stone.png")); + f->setAllTextures("stone.png"); + f->setInventoryTextureCube("stone.png", "stone.png", "stone.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_GRASS; f = &g_content_features[i]; - f->setAllTextures(TextureSpec(irrlicht->getTextureId("mud.png"), - irrlicht->getTextureId("grass_side.png"))); - f->setTexture(0, irrlicht->getTextureId("grass.png")); - f->setTexture(1, irrlicht->getTextureId("mud.png")); - f->setInventoryTexture(irrlicht->getTextureId("grass.png")); + f->setAllTextures("mud.png^grass_side.png"); + f->setTexture(0, "grass.png"); + f->setTexture(1, "mud.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; i = CONTENT_GRASS_FOOTSTEPS; f = &g_content_features[i]; - f->setAllTextures(TextureSpec(irrlicht->getTextureId("mud.png"), - irrlicht->getTextureId("grass_side.png"))); - f->setTexture(0, irrlicht->getTextureId("grass_footsteps.png")); - f->setTexture(1, irrlicht->getTextureId("mud.png")); - f->setInventoryTexture(irrlicht->getTextureId("grass_footsteps.png")); + f->setAllTextures("mud.png^grass_side.png"); + f->setTexture(0, "grass_footsteps.png"); + f->setTexture(1, "mud.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(CONTENT_MUD)+" 1"; i = CONTENT_MUD; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("mud.png")); + f->setAllTextures("mud.png"); + f->setInventoryTextureCube("mud.png", "mud.png", "mud.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_SAND; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("mud.png")); + f->setAllTextures("sand.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_TREE; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("tree.png")); - f->setTexture(0, irrlicht->getTextureId("tree_top.png")); - f->setTexture(1, irrlicht->getTextureId("tree_top.png")); - f->setInventoryTexture(irrlicht->getTextureId("tree_top.png")); + f->setAllTextures("tree.png"); + f->setTexture(0, "tree_top.png"); + f->setTexture(1, "tree_top.png"); f->param_type = CPT_MINERAL; f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_LEAVES; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("leaves.png")); - f->param_type = CPT_MINERAL; + f->light_propagates = true; + //f->param_type = CPT_MINERAL; + f->param_type = CPT_LIGHT; f->is_ground_content = true; + if(new_style_leaves) + { + f->solidness = 0; // drawn separately, makes no faces + f->setInventoryTextureCube("leaves.png", "leaves.png", "leaves.png"); + } + else + { + f->setAllTextures("[noalpha:leaves.png"); + } + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_COALSTONE; f = &g_content_features[i]; //f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL); - f->setAllTextures(TextureSpec(irrlicht->getTextureId("coal.png"), - irrlicht->getTextureId("mineral_coal.png"))); + f->setAllTextures("stone.png^mineral_coal.png"); f->is_ground_content = true; i = CONTENT_WOOD; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("wood.png")); + f->setAllTextures("wood.png"); f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_MESE; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("mese.png")); + f->setAllTextures("mese.png"); f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_CLOUD; f = &g_content_features[i]; - f->setAllTextures(irrlicht->getTextureId("cloud.png")); + f->setAllTextures("cloud.png"); f->is_ground_content = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_AIR; f = &g_content_features[i]; @@ -129,7 +238,7 @@ void init_mapnode(IIrrlichtWrapper *irrlicht) i = CONTENT_WATER; f = &g_content_features[i]; - f->setInventoryTexture(irrlicht->getTextureId("water.png")); + f->setInventoryTextureCube("water.png", "water.png", "water.png"); f->param_type = CPT_LIGHT; f->light_propagates = true; f->solidness = 0; // Drawn separately, makes no faces @@ -141,26 +250,42 @@ void init_mapnode(IIrrlichtWrapper *irrlicht) i = CONTENT_WATERSOURCE; f = &g_content_features[i]; - //f->setTexture(0, irrlicht->getTextureId("water.png"), WATER_ALPHA); - f->setAllTextures(irrlicht->getTextureId("water.png"), WATER_ALPHA); - f->setInventoryTexture(irrlicht->getTextureId("water.png")); + f->setInventoryTexture("water.png"); + if(new_style_water) + { + f->solidness = 0; // drawn separately, makes no faces + } + else // old style + { + f->solidness = 1; + + TileSpec t; + if(g_texturesource) + t.texture = g_texturesource->getTexture("water.png"); + + t.alpha = WATER_ALPHA; + t.material_type = MATERIAL_ALPHA_VERTEX; + t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING; + f->setAllTiles(t); + } f->param_type = CPT_LIGHT; f->light_propagates = true; - f->solidness = 1; f->walkable = false; f->pointable = false; f->diggable = false; f->buildable_to = true; f->liquid_type = LIQUID_SOURCE; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; i = CONTENT_TORCH; f = &g_content_features[i]; - f->setInventoryTexture(irrlicht->getTextureId("torch_on_floor.png")); + f->setInventoryTexture("torch_on_floor.png"); f->param_type = CPT_LIGHT; f->light_propagates = true; f->solidness = 0; // drawn separately, makes no faces f->walkable = false; f->wall_mounted = true; + f->dug_item = std::string("MaterialItem ")+itos(i)+" 1"; } @@ -191,13 +316,23 @@ TileSpec MapNode::getTile(v3s16 dir) else spec = content_features(d).tiles[dir_i]; - if(content_features(d).param_type == CPT_MINERAL) + /* + If it contains some mineral, change texture id + */ + if(content_features(d).param_type == CPT_MINERAL && g_texturesource) { u8 mineral = param & 0x1f; - // Add mineral block texture - textureid_t tid = mineral_block_texture(mineral); - if(tid != 0) - spec.spec.addTid(tid); + std::string mineral_texture_name = mineral_block_texture(mineral); + if(mineral_texture_name != "") + { + u32 orig_id = spec.texture.id; + std::string texture_name = g_texturesource->getTextureName(orig_id); + //texture_name += "^blit:"; + texture_name += "^"; + texture_name += mineral_texture_name; + u32 new_id = g_texturesource->getTextureId(texture_name); + spec.texture = g_texturesource->getTexture(new_id); + } } return spec;