diff options
Diffstat (limited to 'terrain.h')
-rw-r--r-- | terrain.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/terrain.h b/terrain.h new file mode 100644 index 0000000..736b719 --- /dev/null +++ b/terrain.h @@ -0,0 +1,73 @@ +#ifndef TERRAIN_H +#define TERRAIN_H + +#include "vector.h" + +#include <list> +#include <set> + +class Terrain { + private: + std::set<std::pair<int, int> > chunk_indices; + + public: + struct Chunk; + + struct Node { + Chunk *chunk; + float x, y; + float vertex_array[12]; + + Node(Chunk *chunk, float x, float y); + virtual ~Node(); + + float distance(float px, float pz); + void fill(); + void draw_grid(); + void draw_normal(); + float get_height(float px, float py); + Vector3 get_normal(int index); + }; + + struct Chunk { + Terrain *terrain; + Node **nodes; + float x, y, width, height; + int h_width, h_height; + float *heights; + Vector3 *normals; + size_t buf_size; + unsigned int vbo_object; + unsigned int node_count; + unsigned int vertices; + float init_time; + + Chunk(Terrain *tree, float x, float y, float width, float height); + ~Chunk(); + + float distance(float px, float pz); + void make_vbo(); + Node *find(float x, float y); + void calc_normals(); + }; + + static const int chunk_size = 32; + + std::list<Chunk*> chunks; + Terrain(); + virtual ~Terrain(); + + float *generate_heights(int x, int y, int width, int height); + float *get_chunk(int x, int y, int width, int height); + bool has_chunk(int x, int y); + void save_chunk(float *chunk, int x, int y, int width, int height); + float *load_chunk(int x, int y, int width, int height); + + void raise(float x, float z, float radius, float focus, float strength, bool up = true); + + void update(float x, float z); + Chunk *find_chunk(float x, float y); + Node *find(float x, float y); +}; + +#endif |