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"
31 #include "materials.h" // MaterialProperties
36 TODO: Rename to nodedef.h
44 Used for determining properties of MapNodes by content type without
45 storing such properties in the nodes itself.
49 Initialize content feature table.
51 Must be called before accessing the table.
53 void init_contentfeatures(ITextureSource *tsrc);
62 // Direction for chests and furnaces and such
75 NODEBOX_REGULAR, // Regular block; allows buildable_to
76 NODEBOX_FIXED, // Static separately defined box
77 NODEBOX_WALLMOUNTED, // Box for wall_mounted nodes; (top, bottom, side)
82 enum NodeBoxType type;
83 // NODEBOX_REGULAR (no parameters)
85 core::aabbox3d<f32> fixed;
86 // NODEBOX_WALLMOUNTED
87 core::aabbox3d<f32> wall_top;
88 core::aabbox3d<f32> wall_bottom;
89 core::aabbox3d<f32> wall_side; // being at the -X side
92 type(NODEBOX_REGULAR),
93 // default is rail-like
94 fixed(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2),
95 // default is sign/ladder-like
96 wall_top(-BS/2, BS/2-BS/16., -BS/2, BS/2, BS/2, BS/2),
97 wall_bottom(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2),
98 wall_side(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2)
101 void serialize(std::ostream &os) const;
102 void deSerialize(std::istream &is);
111 bool backface_culling;
113 MaterialSpec(const std::string &tname_="", bool backface_culling_=true):
115 backface_culling(backface_culling_)
118 void serialize(std::ostream &os) const;
119 void deSerialize(std::istream &is);
124 NDT_NORMAL, // A basic solid block
125 NDT_AIRLIKE, // Nothing is drawn
126 NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid
127 NDT_FLOWINGLIQUID, // A very special kind of thing
128 NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass
129 NDT_ALLFACES, // Leaves-like, draw all faces no matter what
130 NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal
138 #define CF_SPECIAL_COUNT 2
140 struct ContentFeatures
147 // up down right left back front
149 video::ITexture *inventory_texture;
150 // Special material/texture
151 // - Currently used for flowing liquids
152 video::SMaterial *special_materials[CF_SPECIAL_COUNT];
153 AtlasPointer *special_aps[CF_SPECIAL_COUNT];
154 u8 solidness; // Used when choosing which face is drawn
155 u8 visual_solidness; // When solidness=0, this tells how it looks like
156 bool backface_culling;
159 // List of textures that are used and are wanted to be included in
161 std::set<std::string> used_texturenames;
163 // True if this actually contains non-default data
171 enum NodeDrawType drawtype;
172 float visual_scale; // Misc. scale parameter
173 std::string tname_tiles[6];
174 std::string tname_inventory;
175 MaterialSpec mspec_special[CF_SPECIAL_COUNT]; // Use setter methods
178 // Post effect color, drawn when the camera is inside the node.
179 video::SColor post_effect_color;
180 // Type of MapNode::param1
181 ContentParamType param_type;
182 // True for all ground-like things like stone and mud, false for eg. trees
183 bool is_ground_content;
184 bool light_propagates;
185 bool sunlight_propagates;
186 // This is used for collision detection.
187 // Also for general solidness queries.
189 // Player can point to these
191 // Player can dig these
193 // Player can climb these
195 // Player can build on these
197 // If true, param2 is set to direction when placed. Used for torches.
198 // NOTE: the direction format is quite inefficient and should be changed
200 // If true, node is equivalent to air. Torches are, air is. Water is not.
201 // Is used for example to check whether a mud block can have grass on.
203 // Whether this content type often contains mineral.
204 // Used for texture atlas creation.
205 // Currently only enabled for CONTENT_STONE.
206 bool often_contains_mineral;
207 // Inventory item string as which the node appears in inventory when dug.
208 // Mineral overrides this.
209 std::string dug_item;
210 // Extra dug item and its rarity
211 std::string extra_dug_item;
212 // Usual get interval for extra dug item
213 s32 extra_dug_item_rarity;
214 // Initial metadata is cloned from this
215 NodeMetadata *initial_metadata;
216 // Whether the node is non-liquid, source liquid or flowing liquid
217 enum LiquidType liquid_type;
218 // If the content is liquid, this is the flowing version of the liquid.
219 content_t liquid_alternative_flowing;
220 // If the content is liquid, this is the source version of the liquid.
221 content_t liquid_alternative_source;
222 // Viscosity for fluid flow, ranging from 1 to 7, with
223 // 1 giving almost instantaneous propagation and 7 being
224 // the slowest possible
226 // Amount of light the node emits
228 u32 damage_per_second;
229 NodeBox selection_box;
230 MaterialProperties material;
231 std::string cookresult_item;
240 void serialize(std::ostream &os);
241 void deSerialize(std::istream &is, IGameDef *gamedef);
248 // Texture setters. They also add stuff to used_texturenames.
249 void setTexture(u16 i, std::string name);
250 void setAllTextures(std::string name);
251 void setSpecialMaterial(u16 i, const MaterialSpec &mspec);
253 void setInventoryTexture(std::string imgname);
254 void setInventoryTextureCube(std::string top,
255 std::string left, std::string right);
260 bool isLiquid() const{
261 return (liquid_type != LIQUID_NONE);
263 bool sameLiquid(const ContentFeatures &f) const{
264 if(!isLiquid() || !f.isLiquid()) return false;
265 return (liquid_alternative_flowing == f.liquid_alternative_flowing);
269 class INodeDefManager
273 virtual ~INodeDefManager(){}
274 // Get node definition
275 virtual const ContentFeatures& get(content_t c) const=0;
276 virtual const ContentFeatures& get(const MapNode &n) const=0;
278 virtual void serialize(std::ostream &os)=0;
281 class IWritableNodeDefManager : public INodeDefManager
284 IWritableNodeDefManager(){}
285 virtual ~IWritableNodeDefManager(){}
286 virtual IWritableNodeDefManager* clone()=0;
287 // Get node definition
288 virtual const ContentFeatures& get(content_t c) const=0;
289 virtual const ContentFeatures& get(const MapNode &n) const=0;
291 // Register node definition
292 virtual void set(content_t c, const ContentFeatures &def)=0;
293 virtual ContentFeatures* getModifiable(content_t c)=0;
296 Update tile textures to latest return values of TextueSource.
297 Call after updating the texture atlas of a TextureSource.
299 virtual void updateTextures(ITextureSource *tsrc)=0;
301 virtual void serialize(std::ostream &os)=0;
302 virtual void deSerialize(std::istream &is, IGameDef *gamedef)=0;
305 IWritableNodeDefManager* createNodeDefManager();