--- /dev/null
+#ifndef R2C2_3D_TERRAIN_H_
+#define R2C2_3D_TERRAIN_H_
+
+#include <msp/gl/mesh.h>
+#include <msp/gl/primitivebuilder.h>
+#include <msp/gl/renderable.h>
+#include <msp/gl/technique.h>
+#include "libr2c2/terrain.h"
+#include "object.h"
+
+namespace R2C2 {
+
+class Terrain3D: public Object3D, public Msp::GL::Renderable
+{
+private:
+ Terrain &terrain;
+ Msp::GL::Mesh mesh;
+ const Msp::GL::Technique &tech;
+
+ static unsigned surface_indices[];
+ static unsigned wall_indices[];
+
+public:
+ Terrain3D(Layout3D &, Terrain &);
+ virtual ~Terrain3D();
+
+ virtual Vector get_node() const;
+ virtual bool is_visible() const { return true; }
+
+private:
+ void create_mesh();
+ void gather_nodes(unsigned, unsigned, Vector *);
+ void build_triangle(Msp::GL::PrimitiveBuilder &, const Vector *, const unsigned *);
+ void update_triangle(unsigned, const Vector *, const unsigned *);
+
+ void size_changed(unsigned, unsigned);
+ void tile_changed(unsigned, unsigned, bool);
+
+public:
+ virtual void render(Msp::GL::Renderer &, const Msp::GL::Tag &) const;
+};
+
+} // namespace R2C2
+
+#endif