]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/terrain.h
Add editable terrain objects
[r2c2.git] / source / 3d / terrain.h
diff --git a/source/3d/terrain.h b/source/3d/terrain.h
new file mode 100644 (file)
index 0000000..2cd9854
--- /dev/null
@@ -0,0 +1,45 @@
+#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