]> git.lizzy.rs Git - minetest.git/blob - src/mapnode.cpp
new texture stuff quite working
[minetest.git] / src / mapnode.cpp
1 /*
2 Minetest-c55
3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
4
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.
9
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.
14
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.
18 */
19
20 #include "common_irrlicht.h"
21 #include "mapnode.h"
22 #include "tile.h"
23 #include "porting.h"
24 #include <string>
25 #include "mineral.h"
26 // For g_settings
27 #include "main.h"
28
29 ContentFeatures::~ContentFeatures()
30 {
31         if(translate_to)
32                 delete translate_to;
33 }
34
35 void ContentFeatures::setTexture(u16 i, std::string name, u8 alpha)
36 {
37         if(g_texturesource)
38         {
39                 tiles[i].texture = g_texturesource->getTexture(name);
40         }
41         
42         if(alpha != 255)
43         {
44                 tiles[i].alpha = alpha;
45                 tiles[i].material_type = MATERIAL_ALPHA_VERTEX;
46         }
47
48         if(inventory_texture == NULL)
49                 setInventoryTexture(name);
50 }
51
52 void ContentFeatures::setInventoryTexture(std::string imgname)
53 {
54         if(g_texturesource == NULL)
55                 return;
56         
57         imgname += "^[forcesingle";
58         
59         inventory_texture = g_texturesource->getTextureRaw(imgname);
60 }
61
62 void ContentFeatures::setInventoryTextureCube(std::string top,
63                 std::string left, std::string right)
64 {
65         if(g_texturesource == NULL)
66                 return;
67         
68         str_replace_char(top, '^', '&');
69         str_replace_char(left, '^', '&');
70         str_replace_char(right, '^', '&');
71
72         std::string imgname_full;
73         imgname_full += "[inventorycube{";
74         imgname_full += top;
75         imgname_full += "{";
76         imgname_full += left;
77         imgname_full += "{";
78         imgname_full += right;
79         inventory_texture = g_texturesource->getTextureRaw(imgname_full);
80 }
81
82 struct ContentFeatures g_content_features[256];
83
84 ContentFeatures & content_features(u8 i)
85 {
86         return g_content_features[i];
87 }
88
89 /*
90         See mapnode.h for description.
91 */
92 void init_mapnode()
93 {
94         if(g_texturesource == NULL)
95         {
96                 dstream<<"INFO: Initial run of init_mapnode with "
97                                 "g_texturesource=NULL. If this segfaults, "
98                                 "there is a bug with something not checking for "
99                                 "the NULL value."<<std::endl;
100         }
101         else
102         {
103                 dstream<<"INFO: Full run of init_mapnode with "
104                                 "g_texturesource!=NULL"<<std::endl;
105         }
106
107         // Read some settings
108         bool new_style_water = g_settings.getBool("new_style_water");
109         bool new_style_leaves = g_settings.getBool("new_style_leaves");
110
111         /*
112                 Initialize content feature table
113         */
114         
115         /*
116                 Set initial material type to same in all tiles, so that the
117                 same material can be used in more stuff.
118                 This is set according to the leaves because they are the only
119                 differing material to which all materials can be changed to
120                 get this optimization.
121         */
122         u8 initial_material_type = MATERIAL_ALPHA_SIMPLE;
123         /*if(new_style_leaves)
124                 initial_material_type = MATERIAL_ALPHA_SIMPLE;
125         else
126                 initial_material_type = MATERIAL_ALPHA_NONE;*/
127         for(u16 i=0; i<256; i++)
128         {
129                 ContentFeatures *f = &g_content_features[i];
130                 for(u16 j=0; j<6; j++)
131                         f->tiles[j].material_type = initial_material_type;
132         }
133         
134         u8 i;
135         ContentFeatures *f = NULL;
136
137         i = CONTENT_STONE;
138         f = &g_content_features[i];
139         f->setAllTextures("stone.png");
140         f->setInventoryTextureCube("stone.png", "stone.png", "stone.png");
141         f->param_type = CPT_MINERAL;
142         f->is_ground_content = true;
143         
144         i = CONTENT_GRASS;
145         f = &g_content_features[i];
146         f->setAllTextures("mud.png^grass_side.png");
147         f->setTexture(0, "grass.png");
148         f->setTexture(1, "mud.png");
149         f->param_type = CPT_MINERAL;
150         f->is_ground_content = true;
151         
152         i = CONTENT_GRASS_FOOTSTEPS;
153         f = &g_content_features[i];
154         f->setAllTextures("mud.png^grass_side.png");
155         f->setTexture(0, "grass_footsteps.png");
156         f->setTexture(1, "mud.png");
157         f->param_type = CPT_MINERAL;
158         f->is_ground_content = true;
159         
160         i = CONTENT_MUD;
161         f = &g_content_features[i];
162         f->setAllTextures("mud.png");
163         f->param_type = CPT_MINERAL;
164         f->is_ground_content = true;
165         
166         i = CONTENT_SAND;
167         f = &g_content_features[i];
168         f->setAllTextures("sand.png");
169         f->param_type = CPT_MINERAL;
170         f->is_ground_content = true;
171         
172         i = CONTENT_TREE;
173         f = &g_content_features[i];
174         f->setAllTextures("tree.png");
175         f->setTexture(0, "tree_top.png");
176         f->setTexture(1, "tree_top.png");
177         f->param_type = CPT_MINERAL;
178         f->is_ground_content = true;
179         
180         i = CONTENT_LEAVES;
181         f = &g_content_features[i];
182         f->light_propagates = true;
183         //f->param_type = CPT_MINERAL;
184         f->param_type = CPT_LIGHT;
185         f->is_ground_content = true;
186         if(new_style_leaves)
187         {
188                 f->solidness = 0; // drawn separately, makes no faces
189         }
190         else
191         {
192                 f->setAllTextures("[noalpha:leaves.png");
193         }
194         
195         i = CONTENT_COALSTONE;
196         f = &g_content_features[i];
197         //f->translate_to = new MapNode(CONTENT_STONE, MINERAL_COAL);
198         f->setAllTextures("stone.png^mineral_coal.png");
199         f->is_ground_content = true;
200         
201         i = CONTENT_WOOD;
202         f = &g_content_features[i];
203         f->setAllTextures("wood.png");
204         f->is_ground_content = true;
205         
206         i = CONTENT_MESE;
207         f = &g_content_features[i];
208         f->setAllTextures("mese.png");
209         f->is_ground_content = true;
210         
211         i = CONTENT_CLOUD;
212         f = &g_content_features[i];
213         f->setAllTextures("cloud.png");
214         f->is_ground_content = true;
215         
216         i = CONTENT_AIR;
217         f = &g_content_features[i];
218         f->param_type = CPT_LIGHT;
219         f->light_propagates = true;
220         f->sunlight_propagates = true;
221         f->solidness = 0;
222         f->walkable = false;
223         f->pointable = false;
224         f->diggable = false;
225         f->buildable_to = true;
226         
227         i = CONTENT_WATER;
228         f = &g_content_features[i];
229         f->setInventoryTextureCube("water.png", "water.png", "water.png");
230         f->param_type = CPT_LIGHT;
231         f->light_propagates = true;
232         f->solidness = 0; // Drawn separately, makes no faces
233         f->walkable = false;
234         f->pointable = false;
235         f->diggable = false;
236         f->buildable_to = true;
237         f->liquid_type = LIQUID_FLOWING;
238         
239         i = CONTENT_WATERSOURCE;
240         f = &g_content_features[i];
241         f->setInventoryTexture("water.png");
242         if(new_style_water)
243         {
244                 f->solidness = 0; // drawn separately, makes no faces
245         }
246         else // old style
247         {
248                 f->solidness = 1;
249
250                 TileSpec t;
251                 if(g_texturesource)
252                         t.texture = g_texturesource->getTexture("water.png");
253                 
254                 t.alpha = WATER_ALPHA;
255                 t.material_type = MATERIAL_ALPHA_VERTEX;
256                 t.material_flags &= ~MATERIAL_FLAG_BACKFACE_CULLING;
257                 f->setAllTiles(t);
258         }
259         f->param_type = CPT_LIGHT;
260         f->light_propagates = true;
261         f->walkable = false;
262         f->pointable = false;
263         f->diggable = false;
264         f->buildable_to = true;
265         f->liquid_type = LIQUID_SOURCE;
266         
267         i = CONTENT_TORCH;
268         f = &g_content_features[i];
269         f->setInventoryTexture("torch_on_floor.png");
270         f->param_type = CPT_LIGHT;
271         f->light_propagates = true;
272         f->solidness = 0; // drawn separately, makes no faces
273         f->walkable = false;
274         f->wall_mounted = true;
275         
276 }
277
278 TileSpec MapNode::getTile(v3s16 dir)
279 {
280         TileSpec spec;
281         
282         s32 dir_i = -1;
283         
284         if(dir == v3s16(0,0,0))
285                 dir_i = -1;
286         else if(dir == v3s16(0,1,0))
287                 dir_i = 0;
288         else if(dir == v3s16(0,-1,0))
289                 dir_i = 1;
290         else if(dir == v3s16(1,0,0))
291                 dir_i = 2;
292         else if(dir == v3s16(-1,0,0))
293                 dir_i = 3;
294         else if(dir == v3s16(0,0,1))
295                 dir_i = 4;
296         else if(dir == v3s16(0,0,-1))
297                 dir_i = 5;
298         
299         if(dir_i == -1)
300                 // Non-directional
301                 spec = content_features(d).tiles[0];
302         else 
303                 spec = content_features(d).tiles[dir_i];
304         
305         /*
306                 If it contains some mineral, change texture id
307         */
308         if(content_features(d).param_type == CPT_MINERAL && g_texturesource)
309         {
310                 u8 mineral = param & 0x1f;
311                 std::string mineral_texture_name = mineral_block_texture(mineral);
312                 if(mineral_texture_name != "")
313                 {
314                         u32 orig_id = spec.texture.id;
315                         std::string texture_name = g_texturesource->getTextureName(orig_id);
316                         //texture_name += "^blit:";
317                         texture_name += "^";
318                         texture_name += mineral_texture_name;
319                         u32 new_id = g_texturesource->getTextureId(texture_name);
320                         spec.texture = g_texturesource->getTexture(new_id);
321                 }
322         }
323
324         return spec;
325 }
326
327 u8 MapNode::getMineral()
328 {
329         if(content_features(d).param_type == CPT_MINERAL)
330         {
331                 return param & 0x1f;
332         }
333
334         return MINERAL_NONE;
335 }
336
337 // Pointers to c_str()s g_content_features[i].inventory_image_path
338 //const char * g_content_inventory_texture_paths[USEFUL_CONTENT_COUNT] = {0};
339
340 void init_content_inventory_texture_paths()
341 {
342         dstream<<"DEPRECATED "<<__FUNCTION_NAME<<std::endl;
343         /*for(u16 i=0; i<USEFUL_CONTENT_COUNT; i++)
344         {
345                 g_content_inventory_texture_paths[i] =
346                                 g_content_features[i].inventory_image_path.c_str();
347         }*/
348 }
349