X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fterrain.h;fp=source%2Flibr2c2%2Fterrain.h;h=837119e00429d916d342db09dfad5c03cd3bb8f5;hb=2220ba2f11705ea9a4e480603d43ab7ed4cf5a89;hp=0000000000000000000000000000000000000000;hpb=e37f7bfbbee86eef3b1f6e338a21239905911608;p=r2c2.git diff --git a/source/libr2c2/terrain.h b/source/libr2c2/terrain.h new file mode 100644 index 0000000..837119e --- /dev/null +++ b/source/libr2c2/terrain.h @@ -0,0 +1,118 @@ +#ifndef LIBR2C2_TERRAIN_H_ +#define LIBR2C2_TERRAIN_H_ + +#include "object.h" +#include "terraintype.h" + +namespace R2C2 { + +class Terrain: public Object +{ +public: + class Loader: public Msp::DataFile::ObjectLoader + { + private: + unsigned next_tile; + + public: + Loader(Terrain &); + + private: + void position(float, float, float); + void rotation(float); + void size(unsigned, unsigned); + void tile(); + void tile_coords(unsigned, unsigned); + }; + + struct Node + { + class Loader: public Msp::DataFile::ObjectLoader + { + private: + Terrain &terrain; + + public: + Loader(Terrain &, Node &); + + private: + void ground(unsigned); + }; + + float elevation; + unsigned ground; + unsigned wall; + + Node(); + + void save(std::list &) const; + }; + + struct Tile + { + class Loader: public Msp::DataFile::ObjectLoader + { + private: + Terrain &terrain; + + public: + Loader(Terrain &, Tile &); + + private: + void ground(unsigned); + void elevation(float); + void node(unsigned); + }; + + Node nodes[4]; + bool secondary_axis; + + Tile(); + + void save(std::list &) const; + }; + + struct NodeCoordinates + { + unsigned x, y; + unsigned i; + + NodeCoordinates(); + NodeCoordinates(unsigned, unsigned, unsigned); + }; + + sigc::signal signal_size_changed; + sigc::signal signal_tile_changed; + +private: + const TerrainType &type; + unsigned width; + unsigned height; + std::vector tiles; + +public: + Terrain(Layout &, const TerrainType &); + virtual ~Terrain(); + + virtual Terrain *clone(Layout *) const; + + virtual const TerrainType &get_type() const { return type; } + virtual void set_position(const Vector &); + virtual void set_rotation(const Angle &); + virtual void set_tilt(const Angle &) { } + + void set_size(unsigned, unsigned); + unsigned get_width() const { return width; } + unsigned get_height() const { return height; } + const Tile &get_tile(unsigned, unsigned) const; + void set_node_elevation(const NodeCoordinates &, float, bool = false); + float get_node_elevation(const NodeCoordinates &) const; + Vector get_node_position(const NodeCoordinates &) const; + NodeCoordinates get_closest_node(const Ray &) const; + + void save(std::list &) const; +}; + +} // namespace R2C2 + +#endif