]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/terrain.h
Improve tile axis calculation
[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 set_node_elevation(unsigned, float);
73                 void update_axis();
74                 void save(std::list<Msp::DataFile::Statement> &) const;
75         };
76
77         struct NodeCoordinates
78         {
79                 unsigned x, y;
80                 unsigned i;
81
82                 NodeCoordinates();
83                 NodeCoordinates(unsigned, unsigned, unsigned);
84         };
85
86         sigc::signal<void, unsigned, unsigned> signal_size_changed;
87         sigc::signal<void, unsigned, unsigned> signal_tile_changed;
88
89 private:
90         const TerrainType &type;
91         unsigned width;
92         unsigned height;
93         std::vector<Tile> tiles;
94
95 public:
96         Terrain(Layout &, const TerrainType &);
97         virtual ~Terrain();
98
99         virtual Terrain *clone(Layout *) const;
100
101         virtual const TerrainType &get_type() const { return type; }
102         virtual void set_position(const Vector &);
103         virtual void set_rotation(const Angle &);
104         virtual void set_tilt(const Angle &) { }
105
106         void set_size(unsigned, unsigned);
107         unsigned get_width() const { return width; }
108         unsigned get_height() const { return height; }
109         const Tile &get_tile(unsigned, unsigned) const;
110         void set_node_elevation(const NodeCoordinates &, float, bool = false);
111         float get_node_elevation(const NodeCoordinates &) const;
112         Vector get_node_position(const NodeCoordinates &) const;
113         NodeCoordinates get_closest_node(const Ray &) const;
114
115         void save(std::list<Msp::DataFile::Statement> &) const;
116 };
117
118 } // namespace R2C2
119
120 #endif