X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fterrain.cc;h=89caa6ea92a0c0cb9fdebcda2acc51c505427127;hb=HEAD;hp=6bfabe8cc5b166f2c3c023aea9bf416399dfb7b3;hpb=197f20b5d4db937029f7b585be23ee7fe5da66dc;p=demo diff --git a/src/terrain.cc b/src/terrain.cc index 6bfabe8..89caa6e 100644 --- a/src/terrain.cc +++ b/src/terrain.cc @@ -1,39 +1,133 @@ +#include + #include "camera.h" -#include "image.h" +#include "gfxapi.h" +#include "mesh.h" +#include "meshgen.h" +#include "object.h" #include "scene.h" #include "terrain.h" -Terrain::Terrain() {} +static float calc_height(float u, float v, void *ptr); + +Terrain::Terrain() +{ + vis_scene = 0; +} Terrain::~Terrain() { } +bool Terrain::init() +{ + vis_scene = new Scene; + + return true; +} + +void Terrain::destroy() +{ + delete vis_scene; +} + +struct GenData { + const Terrain *terrain; + const TerrainParams *tp; + float xoffs; + float yoffs; +}; + bool Terrain::generate(const TerrainParams ¶ms) { - // if(xsz <= 0 || ysz <=0) { - // fprintf(stderr, "Invalid terrain size.\n"); - // return false; - // } + tiles.clear(); + this->params = params; + + float txsz = params.xsz / params.xtiles; + float tysz = params.ysz / params.ytiles; + + for(int i=0; itransform(offmat); - // for(int i=0; imesh = tile.mesh; + o->material = &material; + o->transform = Mat4::identity; + + vis_scene->objects.push_back(o); + } + } return true; } Scene *Terrain::get_visible(const Camera *camera) const { - return 0; + return vis_scene; +} + +float Terrain::get_height(const Vec3 &pos) const +{ + float x = pos.x; + float y = pos.z; + + float half_width = params.xsz / 2.0; + float half_height = params.ysz / 2.0; + + if(x < -half_width || x > half_width) + return 0; + if(y < -half_height || y > half_height) + return 0; + + float u = (x + half_width) / params.xsz; + float v = (y + half_height) / params.ysz; + + return get_height(u, v) * params.max_height; +} + +float Terrain::get_height(float u, float v) const +{ + float sn = gph::fbm(u * params.noise_freq, v * params.noise_freq, params.num_octaves); + sn = sn * 0.5 + 0.5; + + if(params.coarse_heightmap.pixels) { + Vec4 texel = params.coarse_heightmap.lookup_linear(u, v, 1.0 / params.tile_usub, 1.0 / params.tile_vsub); + sn *= texel.x; + } + return sn; } + +static float calc_height(float u, float v, void *ptr) +{ + GenData *data = (GenData *)ptr; + const TerrainParams *tp = data->tp; + + u = u / tp->xtiles + data->xoffs; + v = v / tp->ytiles + data->yoffs; + + return data->terrain->get_height(u, v); +} \ No newline at end of file