]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/terrain.h
Add editable terrain objects
[r2c2.git] / source / libr2c2 / terrain.h
1 #ifndef LIBR2C2_TERRAIN_H_
2 #define LIBR2C2_TERRAIN_H_
3
4 #include "object.h"
5 #include "terraintype.h"
6
7 namespace R2C2 {
8
9 class Terrain: public Object
10 {
11 public:
12         class Loader: public Msp::DataFile::ObjectLoader<Terrain>
13         {
14         private:
15                 unsigned next_tile;
16
17         public:
18                 Loader(Terrain &);
19
20         private:
21                 void position(float, float, float);
22                 void rotation(float);
23                 void size(unsigned, unsigned);
24                 void tile();
25                 void tile_coords(unsigned, unsigned);
26         };
27
28         struct Node
29         {
30                 class Loader: public Msp::DataFile::ObjectLoader<Node>
31                 {
32                 private:
33                         Terrain &terrain;
34
35                 public:
36                         Loader(Terrain &, Node &);
37
38                 private:
39                         void ground(unsigned);
40                 };
41
42                 float elevation;
43                 unsigned ground;
44                 unsigned wall;
45
46                 Node();
47
48                 void save(std::list<Msp::DataFile::Statement> &) const;
49         };
50
51         struct Tile
52         {
53                 class Loader: public Msp::DataFile::ObjectLoader<Tile>
54                 {
55                 private:
56                         Terrain &terrain;
57
58                 public:
59                         Loader(Terrain &, Tile &);
60
61                 private:
62                         void ground(unsigned);
63                         void elevation(float);
64                         void node(unsigned);
65                 };
66
67                 Node nodes[4];
68                 bool secondary_axis;
69
70                 Tile();
71
72                 void save(std::list<Msp::DataFile::Statement> &) const;
73         };
74
75         struct NodeCoordinates
76         {
77                 unsigned x, y;
78                 unsigned i;
79
80                 NodeCoordinates();
81                 NodeCoordinates(unsigned, unsigned, unsigned);
82         };
83
84         sigc::signal<void, unsigned, unsigned> signal_size_changed;
85         sigc::signal<void, unsigned, unsigned> signal_tile_changed;
86
87 private:
88         const TerrainType &type;
89         unsigned width;
90         unsigned height;
91         std::vector<Tile> tiles;
92
93 public:
94         Terrain(Layout &, const TerrainType &);
95         virtual ~Terrain();
96
97         virtual Terrain *clone(Layout *) const;
98
99         virtual const TerrainType &get_type() const { return type; }
100         virtual void set_position(const Vector &);
101         virtual void set_rotation(const Angle &);
102         virtual void set_tilt(const Angle &) { }
103
104         void set_size(unsigned, unsigned);
105         unsigned get_width() const { return width; }
106         unsigned get_height() const { return height; }
107         const Tile &get_tile(unsigned, unsigned) const;
108         void set_node_elevation(const NodeCoordinates &, float, bool = false);
109         float get_node_elevation(const NodeCoordinates &) const;
110         Vector get_node_position(const NodeCoordinates &) const;
111         NodeCoordinates get_closest_node(const Ray &) const;
112
113         void save(std::list<Msp::DataFile::Statement> &) const;
114 };
115
116 } // namespace R2C2
117
118 #endif