Fix special tile backspace culling
[oweals/minetest.git] / src / nodedef.h
1 /*
2 Minetest
3 Copyright (C) 2010-2013 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 Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser 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 #ifndef NODEDEF_HEADER
21 #define NODEDEF_HEADER
22
23 #include "irrlichttypes_bloated.h"
24 #include <string>
25 #include <iostream>
26 #include <map>
27 #include <list>
28 #include "mapnode.h"
29 #ifndef SERVER
30 #include "tile.h"
31 #include "shader.h"
32 #endif
33 #include "itemgroup.h"
34 #include "sound.h" // SimpleSoundSpec
35 #include "constants.h" // BS
36
37 class IItemDefManager;
38 class ITextureSource;
39 class IShaderSource;
40 class IGameDef;
41
42 typedef std::list<std::pair<content_t, int> > GroupItems;
43
44 enum ContentParamType
45 {
46         CPT_NONE,
47         CPT_LIGHT,
48 };
49
50 enum ContentParamType2
51 {
52         CPT2_NONE,
53         // Need 8-bit param2
54         CPT2_FULL,
55         // Flowing liquid properties
56         CPT2_FLOWINGLIQUID,
57         // Direction for chests and furnaces and such
58         CPT2_FACEDIR,
59         // Direction for signs, torches and such
60         CPT2_WALLMOUNTED,
61         // Block level like FLOWINGLIQUID
62         CPT2_LEVELED,
63 };
64
65 enum LiquidType
66 {
67         LIQUID_NONE,
68         LIQUID_FLOWING,
69         LIQUID_SOURCE,
70 };
71
72 enum NodeBoxType
73 {
74         NODEBOX_REGULAR, // Regular block; allows buildable_to
75         NODEBOX_FIXED, // Static separately defined box(es)
76         NODEBOX_WALLMOUNTED, // Box for wall mounted nodes; (top, bottom, side)
77         NODEBOX_LEVELED, // Same as fixed, but with dynamic height from param2. for snow, ...
78 };
79
80 struct NodeBox
81 {
82         enum NodeBoxType type;
83         // NODEBOX_REGULAR (no parameters)
84         // NODEBOX_FIXED
85         std::vector<aabb3f> fixed;
86         // NODEBOX_WALLMOUNTED
87         aabb3f wall_top;
88         aabb3f wall_bottom;
89         aabb3f wall_side; // being at the -X side
90
91         NodeBox()
92         { reset(); }
93
94         void reset();
95         void serialize(std::ostream &os, u16 protocol_version) const;
96         void deSerialize(std::istream &is);
97 };
98
99 struct MapNode;
100 class NodeMetadata;
101
102 /*
103         Stand-alone definition of a TileSpec (basically a server-side TileSpec)
104 */
105 enum TileAnimationType{
106         TAT_NONE=0,
107         TAT_VERTICAL_FRAMES=1,
108 };
109 struct TileDef
110 {
111         std::string name;
112         bool backface_culling; // Takes effect only in special cases
113         struct{
114                 enum TileAnimationType type;
115                 int aspect_w; // width for aspect ratio
116                 int aspect_h; // height for aspect ratio
117                 float length; // seconds
118         } animation;
119
120         TileDef()
121         {
122                 name = "";
123                 backface_culling = true;
124                 animation.type = TAT_NONE;
125                 animation.aspect_w = 1;
126                 animation.aspect_h = 1;
127                 animation.length = 1.0;
128         }
129
130         void serialize(std::ostream &os, u16 protocol_version) const;
131         void deSerialize(std::istream &is);
132 };
133
134 enum NodeDrawType
135 {
136         NDT_NORMAL, // A basic solid block
137         NDT_AIRLIKE, // Nothing is drawn
138         NDT_LIQUID, // Do not draw face towards same kind of flowing/source liquid
139         NDT_FLOWINGLIQUID, // A very special kind of thing
140         NDT_GLASSLIKE, // Glass-like, don't draw faces towards other glass
141         NDT_ALLFACES, // Leaves-like, draw all faces no matter what
142         NDT_ALLFACES_OPTIONAL, // Fancy -> allfaces, fast -> normal
143         NDT_TORCHLIKE,
144         NDT_SIGNLIKE,
145         NDT_PLANTLIKE,
146         NDT_FENCELIKE,
147         NDT_RAILLIKE,
148         NDT_NODEBOX,
149         NDT_GLASSLIKE_FRAMED, // Glass-like, draw connected frames and all all
150                               // visible faces
151                                                   // uses 2 textures, one for frames, second for faces
152         NDT_FIRELIKE, // Draw faces slightly rotated and only on connecting nodes,
153         NDT_GLASSLIKE_FRAMED_OPTIONAL,  // enabled -> connected, disabled -> Glass-like
154                                                                         // uses 2 textures, one for frames, second for faces
155 };
156
157 #define CF_SPECIAL_COUNT 6
158
159 struct ContentFeatures
160 {
161         /*
162                 Cached stuff
163         */
164 #ifndef SERVER
165         // 0     1     2     3     4     5
166         // up    down  right left  back  front 
167         TileSpec tiles[6];
168         // Special tiles
169         // - Currently used for flowing liquids
170         TileSpec special_tiles[CF_SPECIAL_COUNT];
171         u8 solidness; // Used when choosing which face is drawn
172         u8 visual_solidness; // When solidness=0, this tells how it looks like
173         bool backface_culling;
174 #endif
175
176         // Server-side cached callback existence for fast skipping
177         bool has_on_construct;
178         bool has_on_destruct;
179         bool has_after_destruct;
180
181         /*
182                 Actual data
183         */
184
185         std::string name; // "" = undefined node
186         ItemGroupList groups; // Same as in itemdef
187
188         // Visual definition
189         enum NodeDrawType drawtype;
190         float visual_scale; // Misc. scale parameter
191         TileDef tiledef[6];
192         TileDef tiledef_special[CF_SPECIAL_COUNT]; // eg. flowing liquid
193         u8 alpha;
194
195         // Post effect color, drawn when the camera is inside the node.
196         video::SColor post_effect_color;
197         // Type of MapNode::param1
198         ContentParamType param_type;
199         // Type of MapNode::param2
200         ContentParamType2 param_type_2;
201         // True for all ground-like things like stone and mud, false for eg. trees
202         bool is_ground_content;
203         bool light_propagates;
204         bool sunlight_propagates;
205         // This is used for collision detection.
206         // Also for general solidness queries.
207         bool walkable;
208         // Player can point to these
209         bool pointable;
210         // Player can dig these
211         bool diggable;
212         // Player can climb these
213         bool climbable;
214         // Player can build on these
215         bool buildable_to;
216         // Player cannot build to these (placement prediction disabled)
217         bool rightclickable;
218         // Flowing liquid or snow, value = default level
219         u8 leveled;
220         // Whether the node is non-liquid, source liquid or flowing liquid
221         enum LiquidType liquid_type;
222         // If the content is liquid, this is the flowing version of the liquid.
223         std::string liquid_alternative_flowing;
224         // If the content is liquid, this is the source version of the liquid.
225         std::string liquid_alternative_source;
226         // Viscosity for fluid flow, ranging from 1 to 7, with
227         // 1 giving almost instantaneous propagation and 7 being
228         // the slowest possible
229         u8 liquid_viscosity;
230         // Is liquid renewable (new liquid source will be created between 2 existing)
231         bool liquid_renewable;
232         // Ice for water, water for ice
233         std::string freezemelt;
234         // Number of flowing liquids surrounding source
235         u8 liquid_range;
236         u8 drowning;
237         // Amount of light the node emits
238         u8 light_source;
239         u32 damage_per_second;
240         NodeBox node_box;
241         NodeBox selection_box;
242         // Used for waving leaves/plants
243         u8 waving;
244         // Compatibility with old maps
245         // Set to true if paramtype used to be 'facedir_simple'
246         bool legacy_facedir_simple;
247         // Set to true if wall_mounted used to be set to true
248         bool legacy_wallmounted;
249
250         // Sound properties
251         SimpleSoundSpec sound_footstep;
252         SimpleSoundSpec sound_dig;
253         SimpleSoundSpec sound_dug;
254
255         /*
256                 Methods
257         */
258         
259         ContentFeatures();
260         ~ContentFeatures();
261         void reset();
262         void serialize(std::ostream &os, u16 protocol_version);
263         void deSerialize(std::istream &is);
264         void serializeOld(std::ostream &os, u16 protocol_version);
265         void deSerializeOld(std::istream &is, int version);
266
267         /*
268                 Some handy methods
269         */
270         bool isLiquid() const{
271                 return (liquid_type != LIQUID_NONE);
272         }
273         bool sameLiquid(const ContentFeatures &f) const{
274                 if(!isLiquid() || !f.isLiquid()) return false;
275                 return (liquid_alternative_flowing == f.liquid_alternative_flowing);
276         }
277 };
278
279 class INodeDefManager
280 {
281 public:
282         INodeDefManager(){}
283         virtual ~INodeDefManager(){}
284         // Get node definition
285         virtual const ContentFeatures& get(content_t c) const=0;
286         virtual const ContentFeatures& get(const MapNode &n) const=0;
287         virtual bool getId(const std::string &name, content_t &result) const=0;
288         virtual content_t getId(const std::string &name) const=0;
289         // Allows "group:name" in addition to regular node names
290         virtual void getIds(const std::string &name, std::set<content_t> &result)
291                         const=0;
292         virtual const ContentFeatures& get(const std::string &name) const=0;
293         
294         virtual void serialize(std::ostream &os, u16 protocol_version)=0;
295 };
296
297 class IWritableNodeDefManager : public INodeDefManager
298 {
299 public:
300         IWritableNodeDefManager(){}
301         virtual ~IWritableNodeDefManager(){}
302         virtual IWritableNodeDefManager* clone()=0;
303         // Get node definition
304         virtual const ContentFeatures& get(content_t c) const=0;
305         virtual const ContentFeatures& get(const MapNode &n) const=0;
306         virtual bool getId(const std::string &name, content_t &result) const=0;
307         // If not found, returns CONTENT_IGNORE
308         virtual content_t getId(const std::string &name) const=0;
309         // Allows "group:name" in addition to regular node names
310         virtual void getIds(const std::string &name, std::set<content_t> &result)
311                         const=0;
312         // If not found, returns the features of CONTENT_UNKNOWN
313         virtual const ContentFeatures& get(const std::string &name) const=0;
314
315         // Register node definition by name (allocate an id)
316         // If returns CONTENT_IGNORE, could not allocate id
317         virtual content_t set(const std::string &name,
318                         const ContentFeatures &def)=0;
319         // If returns CONTENT_IGNORE, could not allocate id
320         virtual content_t allocateDummy(const std::string &name)=0;
321
322         /*
323                 Update item alias mapping.
324                 Call after updating item definitions.
325         */
326         virtual void updateAliases(IItemDefManager *idef)=0;
327
328         /*
329                 Update tile textures to latest return values of TextueSource.
330         */
331         virtual void updateTextures(ITextureSource *tsrc,
332                 IShaderSource *shdsrc)=0;
333
334         virtual void serialize(std::ostream &os, u16 protocol_version)=0;
335         virtual void deSerialize(std::istream &is)=0;
336 };
337
338 IWritableNodeDefManager* createNodeDefManager();
339
340 #endif
341