fixed terrain tiles generation
[demo] / src / terrain.cc
index bdd787f..92dce56 100644 (file)
@@ -32,6 +32,12 @@ void Terrain::destroy()
        delete vis_scene;
 }
 
+struct GenData {
+       const TerrainParams *tp;
+       float xoffs;
+       float yoffs;
+};
+
 bool Terrain::generate(const TerrainParams &params)
 {
        tiles.clear();
@@ -44,11 +50,22 @@ bool Terrain::generate(const TerrainParams &params)
                        TerrainTile tile;
                        tile.mesh = gfx_create_mesh();
 
+                       GenData data;
+                       data.tp = &params;
+                       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*)&params);
+                                       (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);
 
 /*
@@ -78,7 +95,15 @@ static float calc_height(float u, float v, void *ptr)
                return 0;
        }
 
-       TerrainParams *tp = (TerrainParams*)ptr;
+       GenData *data = (GenData*)ptr;
+       const TerrainParams *tp = data->tp;
+
+       // float ufreq = tp->noise_freq / tp->xtiles;
+       // float vfreq = tp->noise_freq / tp->ytiles;
+
+       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 */
        return sn;