+ for (int surface = 0; surface <= 5; ++surface) {
+ for (int y = 0; y < p.SideLength(); ++y) {
+ for (int x = 0; x < p.SideLength(); ++x) {
+ glm::dvec3 to_tile = p.TileCenter(surface, x, y);
+ double near_axis = std::abs(glm::dot(glm::normalize(to_tile), axis));
+ if (near_axis > cap_thresh) {
+ p.TileAt(surface, x, y).type = ice;
+ continue;
+ }
+ float elevation = math::OctaveNoise(
+ elevation_gen,
+ to_tile / p.Radius(),
+ 3, // octaves
+ 0.5, // persistence
+ 5 / p.Radius(), // frequency
+ 2, // amplitude
+ 2 // growth
+ );
+ float variation = math::OctaveNoise(
+ variation_gen,
+ to_tile / p.Radius(),
+ 3, // octaves
+ 0.5, // persistence
+ 16 / p.Radius(), // frequency
+ 2, // amplitude
+ 2 // growth
+ );
+ if (elevation < ocean_thresh) {
+ p.TileAt(surface, x, y).type = ocean;
+ } else if (elevation < water_thresh) {
+ if (variation > 0.3) {
+ p.TileAt(surface, x, y).type = algae;
+ } else {
+ p.TileAt(surface, x, y).type = water;
+ }
+ } else if (elevation < beach_thresh) {
+ p.TileAt(surface, x, y).type = sand;
+ } else if (elevation < highland_thresh) {
+ if (near_axis < equ_thresh) {
+ if (variation > 0.6) {
+ p.TileAt(surface, x, y).type = grass;
+ } else if (variation > 0.2) {
+ p.TileAt(surface, x, y).type = sand;
+ } else {
+ p.TileAt(surface, x, y).type = desert;
+ }
+ } else if (near_axis < fzone_start) {
+ if (variation > 0.4) {
+ p.TileAt(surface, x, y).type = forest;
+ } else if (variation < -0.5) {
+ p.TileAt(surface, x, y).type = jungle;
+ } else if (variation > -0.02 && variation < 0.02) {
+ p.TileAt(surface, x, y).type = wheat;
+ } else {
+ p.TileAt(surface, x, y).type = grass;
+ }
+ } else if (near_axis < fzone_end) {
+ p.TileAt(surface, x, y).type = tundra;
+ } else {
+ p.TileAt(surface, x, y).type = taiga;
+ }
+ } else if (elevation < mountain_thresh) {
+ if (variation > 0.3) {
+ p.TileAt(surface, x, y).type = mntn;
+ } else {
+ p.TileAt(surface, x, y).type = rock;
+ }
+ } else {
+ p.TileAt(surface, x, y).type = mntn;
+ }
+ }
+ }
+ }
+ p.BuildVAO(tiles);
+}