1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #define INDEX(x,y,s) (((y) % (s)) * (s) + ((x) % (s)))
void generate_heightmap (std::vector<float> & map, int size, int x, int y, int work)
{
if (work < 2)
return;
int hwork = work/2;
float h = map[INDEX (x, y, size)] + map[INDEX (x + work, y, size)] +
map[INDEX (x, y + work, size)] + map[INDEX (x + work, y + work, size)];
h *= 0.25f;
h += (frand (-1, 1) * work) / size;
map[INDEX (x + hwork, y + hwork, size)] = h;
if (map[INDEX (x + hwork, y, size)] == -1)
{
h = (map[INDEX (x, y, size)] + map[INDEX (x + work, y, size)]) * 0.5f;
h += (frand (-1, 1) * work) / size;
map[INDEX (x + hwork, y, size)] = h;
}
if (map[INDEX (x + hwork, y + work, size)] == -1)
{
h = (map[INDEX (x, y + work, size)] + map[INDEX (x + work, y + work, size)]) * 0.5f;
h += (frand (-1, 1) * work) / size;
map[INDEX (x + hwork, y + work, size)] = h;
}
if (map[INDEX (x, y + hwork, size)] == -1)
{
h = (map[INDEX (x, y, size)] + map[INDEX (x, y + work, size)]) * 0.5f;
h += (frand (-1, 1) * work) / size;
map[INDEX (x, y + hwork, size)] = h;
}
if (map[INDEX (x + work, y + hwork, size)] == -1)
{
h = (map[INDEX (x + work, y, size)] + map[INDEX (x + work, y + work, size)]) * 0.5f;
h += (frand (-1, 1) * work) / size;
map[INDEX (x + work, y + hwork, size)] = h;
}
generate_heightmap (map, size, x, y, hwork);
generate_heightmap (map, size, x + hwork, y, hwork);
generate_heightmap (map, size, x, y + hwork, hwork);
generate_heightmap (map, size, x + hwork, y + hwork, hwork);
}
#undef INDEX |