3 Copyright (C) 2010-2011 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 #ifndef NODEDEF_HEADER
21 #define NODEDEF_HEADER
23 #include "common_irrlicht.h"
30 #include "materials.h" // MaterialProperties
34 TODO: Rename to nodedef.h
42 Used for determining properties of MapNodes by content type without
43 storing such properties in the nodes itself.
47 Initialize content feature table.
49 Must be called before accessing the table.
51 void init_contentfeatures(ITextureSource *tsrc);
60 // Direction for chests and furnaces and such
73 NODEBOX_REGULAR, // Regular block; allows buildable_to
74 NODEBOX_FIXED, // Static separately defined box
75 NODEBOX_WALLMOUNTED, // Box for wall_mounted nodes; (top, bottom, side)
80 enum NodeBoxType type;
81 // NODEBOX_REGULAR (no parameters)
83 core::aabbox3d<f32> fixed;
84 // NODEBOX_WALLMOUNTED
85 core::aabbox3d<f32> wall_top;
86 core::aabbox3d<f32> wall_bottom;
87 core::aabbox3d<f32> wall_side; // being at the -X side
90 type(NODEBOX_REGULAR),
91 // default is rail-like
92 fixed(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2),
93 // default is sign/ladder-like
94 wall_top(-BS/2, BS/2-BS/16., -BS/2, BS/2, BS/2, BS/2),
95 wall_bottom(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2),
96 wall_side(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2)
103 struct ContentFeatures
116 std::string inventory_texture_name;
117 video::ITexture *inventory_texture;
119 // Used currently for flowing liquids
121 // Post effect color, drawn when the camera is inside the node.
122 video::SColor post_effect_color;
123 // Special irrlicht material, used sometimes
124 video::SMaterial *special_material;
125 video::SMaterial *special_material2;
126 // Currently used for fetching liquid texture coordinates
127 // - This is also updated to the above two (if they are non-NULL)
128 // when textures are updated
129 AtlasPointer *special_atlas;
132 // List of all block textures that have been used (value is dummy)
133 // Used for texture atlas making.
134 // Exists on server too for cleaner code in content_mapnode.cpp.
135 std::set<std::string> used_texturenames;
137 // Type of MapNode::param1
138 ContentParamType param_type;
139 // True for all ground-like things like stone and mud, false for eg. trees
140 bool is_ground_content;
141 bool light_propagates;
142 bool sunlight_propagates;
143 u8 solidness; // Used when choosing which face is drawn
144 u8 visual_solidness; // When solidness=0, this tells how it looks like
145 // This is used for collision detection.
146 // Also for general solidness queries.
148 // Player can point to these
150 // Player can dig these
152 // Player can climb these
154 // Player can build on these
156 // If true, param2 is set to direction when placed. Used for torches.
157 // NOTE: the direction format is quite inefficient and should be changed
159 // If true, node is equivalent to air. Torches are, air is. Water is not.
160 // Is used for example to check whether a mud block can have grass on.
162 // Whether this content type often contains mineral.
163 // Used for texture atlas creation.
164 // Currently only enabled for CONTENT_STONE.
165 bool often_contains_mineral;
167 // Inventory item string as which the node appears in inventory when dug.
168 // Mineral overrides this.
169 std::string dug_item;
171 // Extra dug item and its rarity
172 std::string extra_dug_item;
173 s32 extra_dug_item_rarity;
175 // Initial metadata is cloned from this
176 NodeMetadata *initial_metadata;
178 // Whether the node is non-liquid, source liquid or flowing liquid
179 enum LiquidType liquid_type;
180 // If the content is liquid, this is the flowing version of the liquid.
181 content_t liquid_alternative_flowing;
182 // If the content is liquid, this is the source version of the liquid.
183 content_t liquid_alternative_source;
184 // Viscosity for fluid flow, ranging from 1 to 7, with
185 // 1 giving almost instantaneous propagation and 7 being
186 // the slowest possible
189 // Amount of light the node emits
192 u32 damage_per_second;
194 NodeBox selection_box;
196 MaterialProperties material;
198 // NOTE: Move relevant properties to here from elsewhere
203 inventory_texture = NULL;
206 post_effect_color = video::SColor(0, 0, 0, 0);
207 special_material = NULL;
208 special_material2 = NULL;
209 special_atlas = NULL;
211 used_texturenames.clear();
212 param_type = CPT_NONE;
213 is_ground_content = false;
214 light_propagates = false;
215 sunlight_propagates = false;
217 visual_solidness = 0;
222 buildable_to = false;
223 wall_mounted = false;
224 air_equivalent = false;
225 often_contains_mineral = false;
227 initial_metadata = NULL;
228 liquid_type = LIQUID_NONE;
229 liquid_alternative_flowing = CONTENT_IGNORE;
230 liquid_alternative_source = CONTENT_IGNORE;
231 liquid_viscosity = 0;
233 damage_per_second = 0;
234 selection_box = NodeBox();
235 material = MaterialProperties();
246 Quickhands for simple materials
250 void setTexture(ITextureSource *tsrc, u16 i, std::string name,
253 void setAllTextures(ITextureSource *tsrc, std::string name, u8 alpha=255)
256 void setTexture(ITextureSource *tsrc,
257 u16 i, std::string name, u8 alpha=255);
259 void setAllTextures(ITextureSource *tsrc,
260 std::string name, u8 alpha=255)
262 for(u16 i=0; i<6; i++)
264 setTexture(tsrc, i, name, alpha);
266 // Force inventory texture too
267 setInventoryTexture(name, tsrc);
272 void setTile(u16 i, const TileSpec &tile)
274 void setAllTiles(const TileSpec &tile)
275 { for(u16 i=0; i<6; i++) setTile(i, tile); }
279 void setInventoryTexture(std::string imgname,
280 ITextureSource *tsrc)
282 void setInventoryTextureCube(std::string top,
283 std::string left, std::string right, ITextureSource *tsrc)
286 void setInventoryTexture(std::string imgname, ITextureSource *tsrc);
288 void setInventoryTextureCube(std::string top,
289 std::string left, std::string right, ITextureSource *tsrc);
295 bool isLiquid() const{
296 return (liquid_type != LIQUID_NONE);
298 bool sameLiquid(const ContentFeatures &f) const{
299 if(!isLiquid() || !f.isLiquid()) return false;
300 return (liquid_alternative_flowing == f.liquid_alternative_flowing);
304 class INodeDefManager
308 virtual ~INodeDefManager(){}
309 // Get node definition
310 virtual const ContentFeatures& get(content_t c) const=0;
311 virtual const ContentFeatures& get(const MapNode &n) const=0;
314 class IWritableNodeDefManager : public INodeDefManager
317 IWritableNodeDefManager(){}
318 virtual ~IWritableNodeDefManager(){}
319 virtual IWritableNodeDefManager* clone()=0;
320 // Get node definition
321 virtual const ContentFeatures& get(content_t c) const=0;
322 virtual const ContentFeatures& get(const MapNode &n) const=0;
324 // Register node definition
325 virtual void set(content_t c, const ContentFeatures &def)=0;
326 virtual ContentFeatures* getModifiable(content_t c)=0;
329 Update tile textures to latest return values of TextueSource.
330 Call after updating the texture atlas of a TextureSource.
332 virtual void updateTextures(ITextureSource *tsrc)=0;
335 // If textures not actually available (server), tsrc can be NULL
336 IWritableNodeDefManager* createNodeDefManager(ITextureSource *tsrc);