nuclear@1: #ifndef TERRAIN_H_ nuclear@1: #define TERRAIN_H_ nuclear@1: nuclear@1: #include "vmath/vmath.h" nuclear@1: nuclear@1: class Terrain { nuclear@1: private: nuclear@1: float dx, dy; // inter-pixel distance in uv-space nuclear@1: int xsz, ysz; nuclear@1: float *hmap; nuclear@1: nuclear@1: float scale, height_scale; nuclear@1: nuclear@1: mutable int dlist, dlist_norm; nuclear@1: mutable int dlist_sub[2], dlist_norm_sub[2]; nuclear@1: mutable float dlist_norm_sz; nuclear@1: nuclear@1: void invalidate_mesh(); nuclear@1: nuclear@1: public: nuclear@1: Terrain(); nuclear@1: ~Terrain(); nuclear@1: nuclear@1: void set_scale(float s); nuclear@1: float get_scale() const; nuclear@1: nuclear@1: void set_height_scale(float s); nuclear@1: float get_height_scale() const; nuclear@1: nuclear@1: bool load(const char *fname); nuclear@1: int get_map_width() const { return xsz; } nuclear@1: int get_map_height() const { return ysz; } nuclear@1: nuclear@1: Vector2 world_to_uv(const Vector2 &pt) const; nuclear@1: Vector2 uv_to_world(const Vector2 &pt) const; nuclear@1: nuclear@1: float lookup(int x, int y) const; nuclear@1: nuclear@1: float get_height(const Vector2 &pt) const; nuclear@1: Vector3 get_normal(const Vector2 &pt) const; nuclear@1: nuclear@1: float get_world_height(const Vector2 &pt) const; nuclear@1: nuclear@1: bool intersect(const Ray &ray, float *dist) const; nuclear@1: bool intersect_micro(const Ray &ray, float *dist, float thres = 0.01) const; nuclear@1: nuclear@1: void draw(int usub = 0, int vsub = 0) const; nuclear@1: void draw_normals(float sz = 1.0, int usub = 0, int vsub = 0) const; nuclear@1: }; nuclear@1: nuclear@1: #endif // TERRAIN_H_