3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "common_irrlicht.h"
28 #include "content_mapnode.h"
29 #include "nodemetadata.h"
31 ContentFeatures::~ContentFeatures()
36 delete initial_metadata;
39 void ContentFeatures::setTexture(u16 i, std::string name, u8 alpha)
43 tiles[i].texture = g_texturesource->getTexture(name);
48 tiles[i].alpha = alpha;
49 tiles[i].material_type = MATERIAL_ALPHA_VERTEX;
52 if(inventory_texture == NULL)
53 setInventoryTexture(name);
56 void ContentFeatures::setInventoryTexture(std::string imgname)
58 if(g_texturesource == NULL)
61 imgname += "^[forcesingle";
63 inventory_texture = g_texturesource->getTextureRaw(imgname);
66 void ContentFeatures::setInventoryTextureCube(std::string top,
67 std::string left, std::string right)
69 if(g_texturesource == NULL)
72 str_replace_char(top, '^', '&');
73 str_replace_char(left, '^', '&');
74 str_replace_char(right, '^', '&');
76 std::string imgname_full;
77 imgname_full += "[inventorycube{";
82 imgname_full += right;
83 inventory_texture = g_texturesource->getTextureRaw(imgname_full);
86 struct ContentFeatures g_content_features[256];
88 ContentFeatures & content_features(u8 i)
90 return g_content_features[i];
94 See mapnode.h for description.
98 if(g_texturesource == NULL)
100 dstream<<"INFO: Initial run of init_mapnode with "
101 "g_texturesource=NULL. If this segfaults, "
102 "there is a bug with something not checking for "
103 "the NULL value."<<std::endl;
107 dstream<<"INFO: Full run of init_mapnode with "
108 "g_texturesource!=NULL"<<std::endl;
111 /*// Read some settings
112 bool new_style_water = g_settings.getBool("new_style_water");
113 bool new_style_leaves = g_settings.getBool("new_style_leaves");*/
116 Initialize content feature table
120 Set initial material type to same in all tiles, so that the
121 same material can be used in more stuff.
122 This is set according to the leaves because they are the only
123 differing material to which all materials can be changed to
124 get this optimization.
126 u8 initial_material_type = MATERIAL_ALPHA_SIMPLE;
127 /*if(new_style_leaves)
128 initial_material_type = MATERIAL_ALPHA_SIMPLE;
130 initial_material_type = MATERIAL_ALPHA_NONE;*/
131 for(u16 i=0; i<256; i++)
133 ContentFeatures *f = &g_content_features[i];
137 for(u16 j=0; j<6; j++)
138 f->tiles[j].material_type = initial_material_type;
142 Initialize mapnode content
144 content_mapnode_init();
148 v3s16 facedir_rotate(u8 facedir, v3s16 dir)
151 Face 2 (normally Z-) direction:
158 if(facedir==0) // Same
159 newdir = v3s16(dir.X, dir.Y, dir.Z);
160 else if(facedir == 1) // Face is taken from rotXZccv(-90)
161 newdir = v3s16(-dir.Z, dir.Y, dir.X);
162 else if(facedir == 2) // Face is taken from rotXZccv(180)
163 newdir = v3s16(-dir.X, dir.Y, -dir.Z);
164 else if(facedir == 3) // Face is taken from rotXZccv(90)
165 newdir = v3s16(dir.Z, dir.Y, -dir.X);
171 TileSpec MapNode::getTile(v3s16 dir)
173 if(content_features(d).param_type == CPT_FACEDIR_SIMPLE)
174 dir = facedir_rotate(param1, dir);
180 if(dir == v3s16(0,0,0))
182 else if(dir == v3s16(0,1,0))
184 else if(dir == v3s16(0,-1,0))
186 else if(dir == v3s16(1,0,0))
188 else if(dir == v3s16(-1,0,0))
190 else if(dir == v3s16(0,0,1))
192 else if(dir == v3s16(0,0,-1))
197 spec = content_features(d).tiles[0];
199 spec = content_features(d).tiles[dir_i];
202 If it contains some mineral, change texture id
204 if(content_features(d).param_type == CPT_MINERAL && g_texturesource)
206 u8 mineral = param & 0x1f;
207 std::string mineral_texture_name = mineral_block_texture(mineral);
208 if(mineral_texture_name != "")
210 u32 orig_id = spec.texture.id;
211 std::string texture_name = g_texturesource->getTextureName(orig_id);
212 //texture_name += "^blit:";
214 texture_name += mineral_texture_name;
215 u32 new_id = g_texturesource->getTextureId(texture_name);
216 spec.texture = g_texturesource->getTexture(new_id);
223 u8 MapNode::getMineral()
225 if(content_features(d).param_type == CPT_MINERAL)
234 Gets lighting value at face of node
236 Parameters must consist of air and !air.
237 Order doesn't matter.
239 If either of the nodes doesn't exist, light is 0.
242 daynight_ratio: 0...1000
244 n2: getNodeParent(p + face_dir)
245 face_dir: axis oriented unit vector from p to p2
247 returns encoded light value.
249 u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
254 u8 l1 = n.getLightBlend(daynight_ratio);
255 u8 l2 = n2.getLightBlend(daynight_ratio);
261 // Make some nice difference to different sides
263 // This makes light come from a corner
264 /*if(face_dir.X == 1 || face_dir.Z == 1 || face_dir.Y == -1)
265 light = diminish_light(diminish_light(light));
266 else if(face_dir.X == -1 || face_dir.Z == -1)
267 light = diminish_light(light);*/
269 // All neighboring faces have different shade (like in minecraft)
270 if(face_dir.X == 1 || face_dir.X == -1 || face_dir.Y == -1)
271 light = diminish_light(diminish_light(light));
272 else if(face_dir.Z == 1 || face_dir.Z == -1)
273 light = diminish_light(light);
277 catch(InvalidPositionException &e)