#ifndef TERRAIN_H #define TERRAIN_H #include "vector.h" #include #include class Terrain { private: std::set > 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(); 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 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