delete vis_scene;
}
+struct GenData {
+ const TerrainParams *tp;
+ float xoffs;
+ float yoffs;
+};
+
bool Terrain::generate(const TerrainParams ¶ms)
{
tiles.clear();
TerrainTile tile;
tile.mesh = gfx_create_mesh();
+ GenData data;
+ data.tp = ¶ms;
+ data.xoffs = (float)j / (float)params.xtiles;
+ data.yoffs = (float)i / (float)params.ytiles;
+
gen_heightfield(tile.mesh, txsz, tysz, params.max_height,
params.tile_usub, params.tile_vsub, calc_height,
- (void*)¶ms);
+ (void*)&data);
+
+ float xoffs = j * txsz - params.xsz / 2.0 + txsz / 2.0;
+ float yoffs = i * tysz - params.ysz / 2.0 + tysz / 2.0;
+
+ Mat4 offmat;
+ offmat.translation(xoffs, 0, yoffs);
+ tile.mesh->transform(offmat);
- tile.mesh->update_vertex_data();
tiles.push_back(tile);
/*
return 0;
}
- TerrainParams *tp = (TerrainParams*)ptr;
+ GenData *data = (GenData*)ptr;
+ const TerrainParams *tp = data->tp;
+
+ u = u / tp->xtiles + data->xoffs;
+ v = v / tp->ytiles + data->yoffs;
+
float sn = gph::fbm(u * tp->noise_freq, v * tp->noise_freq, tp->num_octaves);
- /* todo use the image later */
+
+ if(tp->coarse_heightmap) {
+ Vec4 texel = tp->coarse_heightmap->lookup_nearest(u, v);
+ sn *= texel.x;
+ }
return sn;
}
\ No newline at end of file