#include "common_irrlicht.h"
#include <string>
+#include <iostream>
#include <set>
#include "mapnode.h"
#ifndef SERVER
#endif
#include "materials.h" // MaterialProperties
class ITextureSource;
+class IGameDef;
/*
TODO: Rename to nodedef.h
wall_bottom(-BS/2, -BS/2, -BS/2, BS/2, -BS/2+BS/16., BS/2),
wall_side(-BS/2, -BS/2, -BS/2, -BS/2+BS/16., BS/2, BS/2)
{}
+
+ void serialize(std::ostream &os);
+ void deSerialize(std::istream &is);
};
struct MapNode;
class NodeMetadata;
+struct MaterialSpec
+{
+ std::string tname;
+ bool backface_culling;
+
+ MaterialSpec(const std::string &tname_="", bool backface_culling_=true):
+ tname(tname_),
+ backface_culling(backface_culling_)
+ {}
+
+ void serialize(std::ostream &os);
+ void deSerialize(std::istream &is);
+};
+
+enum NodeDrawType
+{
+ NDT_NORMAL, // A basic solid block
+ NDT_AIRLIKE, // Nothing is drawn
+ NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid
+ NDT_FLOWINGLIQUID, // A very special kind of thing
+ NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass
+ NDT_ALLFACES, // Leaves-like, draw all faces no matter what
+ NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal
+ NDT_TORCHLIKE,
+ NDT_SIGNLIKE,
+ NDT_PLANTLIKE,
+ NDT_FENCELIKE,
+ NDT_RAILLIKE,
+};
+
+#define CF_SPECIAL_COUNT 2
+
struct ContentFeatures
{
-#ifndef SERVER
/*
- 0: up
- 1: down
- 2: right
- 3: left
- 4: back
- 5: front
+ Cached stuff
*/
+#ifndef SERVER
+ // 0 1 2 3 4 5
+ // up down right left back front
TileSpec tiles[6];
-
video::ITexture *inventory_texture;
-
- // Used currently for flowing liquids
- u8 vertex_alpha;
- // Post effect color, drawn when the camera is inside the node.
- video::SColor post_effect_color;
- // Special irrlicht material, used sometimes
- video::SMaterial *special_material;
- video::SMaterial *special_material2;
- AtlasPointer *special_atlas;
+ // Special material/texture
+ // - Currently used for flowing liquids
+ video::SMaterial *special_materials[CF_SPECIAL_COUNT];
+ AtlasPointer *special_aps[CF_SPECIAL_COUNT];
+ u8 solidness; // Used when choosing which face is drawn
+ u8 visual_solidness; // When solidness=0, this tells how it looks like
+ bool backface_culling;
#endif
-
+
// List of all block textures that have been used (value is dummy)
// Used for texture atlas making.
// Exists on server too for cleaner code in content_mapnode.cpp.
std::set<std::string> used_texturenames;
+ // True if this actually contains non-default data
+ bool modified;
+
+ /*
+ Actual data
+ */
+
+ // Visual definition
+ enum NodeDrawType drawtype;
+ float visual_scale; // Misc. scale parameter
+ std::string tname_tiles[6];
+ std::string tname_inventory;
+ MaterialSpec mspec_special[CF_SPECIAL_COUNT];
+ u8 alpha;
+
+ // Post effect color, drawn when the camera is inside the node.
+ video::SColor post_effect_color;
// Type of MapNode::param1
ContentParamType param_type;
// True for all ground-like things like stone and mud, false for eg. trees
bool is_ground_content;
bool light_propagates;
bool sunlight_propagates;
- u8 solidness; // Used when choosing which face is drawn
- u8 visual_solidness; // When solidness=0, this tells how it looks like
// This is used for collision detection.
// Also for general solidness queries.
bool walkable;
// Used for texture atlas creation.
// Currently only enabled for CONTENT_STONE.
bool often_contains_mineral;
-
// Inventory item string as which the node appears in inventory when dug.
// Mineral overrides this.
std::string dug_item;
-
// Extra dug item and its rarity
std::string extra_dug_item;
s32 extra_dug_item_rarity;
-
// Initial metadata is cloned from this
NodeMetadata *initial_metadata;
-
// Whether the node is non-liquid, source liquid or flowing liquid
enum LiquidType liquid_type;
// If the content is liquid, this is the flowing version of the liquid.
// 1 giving almost instantaneous propagation and 7 being
// the slowest possible
u8 liquid_viscosity;
-
// Amount of light the node emits
u8 light_source;
-
u32 damage_per_second;
-
NodeBox selection_box;
-
MaterialProperties material;
-
- // NOTE: Move relevant properties to here from elsewhere
- void reset()
- {
-#ifndef SERVER
- inventory_texture = NULL;
-
- vertex_alpha = 255;
- post_effect_color = video::SColor(0, 0, 0, 0);
- special_material = NULL;
- special_material2 = NULL;
- special_atlas = NULL;
-#endif
- used_texturenames.clear();
- param_type = CPT_NONE;
- is_ground_content = false;
- light_propagates = false;
- sunlight_propagates = false;
- solidness = 2;
- visual_solidness = 0;
- walkable = true;
- pointable = true;
- diggable = true;
- climbable = false;
- buildable_to = false;
- wall_mounted = false;
- air_equivalent = false;
- often_contains_mineral = false;
- dug_item = "";
- initial_metadata = NULL;
- liquid_type = LIQUID_NONE;
- liquid_alternative_flowing = CONTENT_IGNORE;
- liquid_alternative_source = CONTENT_IGNORE;
- liquid_viscosity = 0;
- light_source = 0;
- damage_per_second = 0;
- selection_box = NodeBox();
- material = MaterialProperties();
- }
-
- ContentFeatures()
- {
- reset();
- }
-
- ~ContentFeatures();
+ /*
+ Methods
+ */
+ ContentFeatures();
+ ~ContentFeatures();
+ void reset();
+ void serialize(std::ostream &os);
+ void deSerialize(std::istream &is, IGameDef *gamedef);
+
/*
Quickhands for simple materials
*/
-#ifdef SERVER
- void setTexture(ITextureSource *tsrc, u16 i, std::string name,
- u8 alpha=255)
- {}
- void setAllTextures(ITextureSource *tsrc, std::string name, u8 alpha=255)
- {}
-#else
- void setTexture(ITextureSource *tsrc,
- u16 i, std::string name, u8 alpha=255);
+ void setTexture(u16 i, std::string name);
- void setAllTextures(ITextureSource *tsrc,
- std::string name, u8 alpha=255)
+ void setAllTextures(std::string name, u8 alpha=255)
{
for(u16 i=0; i<6; i++)
- {
- setTexture(tsrc, i, name, alpha);
- }
+ setTexture(i, name);
+ alpha = alpha;
// Force inventory texture too
- setInventoryTexture(name, tsrc);
+ setInventoryTexture(name);
}
-#endif
-
-#ifndef SERVER
- void setTile(u16 i, const TileSpec &tile)
- { tiles[i] = tile; }
- void setAllTiles(const TileSpec &tile)
- { for(u16 i=0; i<6; i++) setTile(i, tile); }
-#endif
-#ifdef SERVER
- void setInventoryTexture(std::string imgname,
- ITextureSource *tsrc)
- {}
- void setInventoryTextureCube(std::string top,
- std::string left, std::string right, ITextureSource *tsrc)
- {}
-#else
- void setInventoryTexture(std::string imgname, ITextureSource *tsrc);
-
+ void setInventoryTexture(std::string imgname);
void setInventoryTextureCube(std::string top,
- std::string left, std::string right, ITextureSource *tsrc);
-#endif
+ std::string left, std::string right);
/*
Some handy methods
// Get node definition
virtual const ContentFeatures& get(content_t c) const=0;
virtual const ContentFeatures& get(const MapNode &n) const=0;
+
+ virtual void serialize(std::ostream &os)=0;
};
class IWritableNodeDefManager : public INodeDefManager
Call after updating the texture atlas of a TextureSource.
*/
virtual void updateTextures(ITextureSource *tsrc)=0;
-};
-// If textures not actually available (server), tsrc can be NULL
-IWritableNodeDefManager* createNodeDefManager(ITextureSource *tsrc);
+ virtual void serialize(std::ostream &os)=0;
+ virtual void deSerialize(std::istream &is, IGameDef *gamedef)=0;
+};
+IWritableNodeDefManager* createNodeDefManager();
#endif