comparison src/tgp.cpp @ 5587:c44c070c5032 draft

(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
author rubidium <rubidium@openttd.org>
date Wed, 10 Jan 2007 18:56:51 +0000
parents 4b26bd55bd24
children ca6b459bf488
comparison
equal deleted inserted replaced
5586:9a8c53342d29 5587:c44c070c5032
12 #include "variables.h" 12 #include "variables.h"
13 #include "void_map.h" 13 #include "void_map.h"
14 #include "tgp.h" 14 #include "tgp.h"
15 #include "console.h" 15 #include "console.h"
16 #include "genworld.h" 16 #include "genworld.h"
17 #include "helpers.hpp"
17 18
18 /* 19 /*
19 * OTTD Perlin Noise Landscape Generator, aka TerraGenesis Perlin 20 * OTTD Perlin Noise Landscape Generator, aka TerraGenesis Perlin
20 * 21 *
21 * Quickie guide to Perlin Noise 22 * Quickie guide to Perlin Noise
188 #define I2A(i) ((i) << amplitude_decimal_bits) 189 #define I2A(i) ((i) << amplitude_decimal_bits)
189 /** Conversion: amplitude_t to int */ 190 /** Conversion: amplitude_t to int */
190 #define A2I(i) ((i) >> amplitude_decimal_bits) 191 #define A2I(i) ((i) >> amplitude_decimal_bits)
191 192
192 /** Conversion: amplitude_t to height_t */ 193 /** Conversion: amplitude_t to height_t */
193 #define A2H(a) ((height_decimal_bits < amplitude_decimal_bits) \ 194 #define A2H(a) ((a) >> (amplitude_decimal_bits - height_decimal_bits))
194 ? ((a) >> (amplitude_decimal_bits - height_decimal_bits)) \ 195
195 : ((a) << (height_decimal_bits - amplitude_decimal_bits)))
196 196
197 /** Walk through all items of _height_map.h */ 197 /** Walk through all items of _height_map.h */
198 #define FOR_ALL_TILES_IN_HEIGHT(h) for (h = _height_map.h; h < &_height_map.h[_height_map.total_size]; h++) 198 #define FOR_ALL_TILES_IN_HEIGHT(h) for (h = _height_map.h; h < &_height_map.h[_height_map.total_size]; h++)
199 199
200 /** Noise amplitudes (multiplied by 1024) 200 /** Noise amplitudes (multiplied by 1024)
237 _height_map.size_y = MapSizeY(); 237 _height_map.size_y = MapSizeY();
238 238
239 /* Allocate memory block for height map row pointers */ 239 /* Allocate memory block for height map row pointers */
240 _height_map.total_size = (_height_map.size_x + 1) * (_height_map.size_y + 1); 240 _height_map.total_size = (_height_map.size_x + 1) * (_height_map.size_y + 1);
241 _height_map.dim_x = _height_map.size_x + 1; 241 _height_map.dim_x = _height_map.size_x + 1;
242 _height_map.h = calloc(_height_map.total_size, sizeof(*_height_map.h)); 242 CallocT(&_height_map.h, _height_map.total_size);
243 if (_height_map.h == NULL) return false; 243 if (_height_map.h == NULL) return false;
244 244
245 /* Iterate through height map initialize values */ 245 /* Iterate through height map initialize values */
246 FOR_ALL_TILES_IN_HEIGHT(h) *h = _invalid_height; 246 FOR_ALL_TILES_IN_HEIGHT(h) *h = _invalid_height;
247 247
453 default: 453 default:
454 NOT_REACHED(); 454 NOT_REACHED();
455 break; 455 break;
456 } 456 }
457 /* Transform it back into h_min..h_max space */ 457 /* Transform it back into h_min..h_max space */
458 *h = fheight * (h_max - h_min) + h_min; 458 *h = (height_t)(fheight * (h_max - h_min) + h_min);
459 if (*h < 0) *h = I2H(0); 459 if (*h < 0) *h = I2H(0);
460 if (*h >= h_max) *h = h_max - 1; 460 if (*h >= h_max) *h = h_max - 1;
461 } 461 }
462 } 462 }
463 463
470 int *hist_buf, *hist; 470 int *hist_buf, *hist;
471 471
472 HeightMapGetMinMaxAvg(&h_min, &h_max, &h_avg); 472 HeightMapGetMinMaxAvg(&h_min, &h_max, &h_avg);
473 473
474 /* Allocate histogram buffer and clear its cells */ 474 /* Allocate histogram buffer and clear its cells */
475 hist_buf = calloc(h_max - h_min + 1, sizeof(*hist_buf)); 475 CallocT(&hist_buf, h_max - h_min + 1);
476 /* Fill histogram */ 476 /* Fill histogram */
477 hist = HeightMapMakeHistogram(h_min, h_max, hist_buf); 477 hist = HeightMapMakeHistogram(h_min, h_max, hist_buf);
478 478
479 /* How many water tiles do we want? */ 479 /* How many water tiles do we want? */
480 desired_water_tiles = (int)(((int64)water_percent) * (int64)(_height_map.size_x * _height_map.size_y)) >> amplitude_decimal_bits; 480 desired_water_tiles = (int)(((int64)water_percent) * (int64)(_height_map.size_x * _height_map.size_y)) >> amplitude_decimal_bits;
527 static void HeightMapCoastLines(void) 527 static void HeightMapCoastLines(void)
528 { 528 {
529 int smallest_size = min(_patches.map_x, _patches.map_y); 529 int smallest_size = min(_patches.map_x, _patches.map_y);
530 const int margin = 4; 530 const int margin = 4;
531 uint y, x; 531 uint y, x;
532 uint max_x; 532 double max_x;
533 uint max_y; 533 double max_y;
534 534
535 /* Lower to sea level */ 535 /* Lower to sea level */
536 for (y = 0; y <= _height_map.size_y; y++) { 536 for (y = 0; y <= _height_map.size_y; y++) {
537 /* Top right */ 537 /* Top right */
538 max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.9, 53) + 0.25) * 5 + (perlin_coast_noise_2D(y, y, 0.35, 179) + 1) * 12); 538 max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.9, 53) + 0.25) * 5 + (perlin_coast_noise_2D(y, y, 0.35, 179) + 1) * 12);
539 max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x); 539 max_x = dmax((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
540 if (smallest_size < 8 && max_x > 5) max_x /= 1.5; 540 if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
541 for (x = 0; x < max_x; x++) { 541 for (x = 0; x < max_x; x++) {
542 HeightMapXY(x, y) = 0; 542 HeightMapXY(x, y) = 0;
543 } 543 }
544 544
545 /* Bottom left */ 545 /* Bottom left */
546 max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.85, 101) + 0.3) * 6 + (perlin_coast_noise_2D(y, y, 0.45, 67) + 0.75) * 8); 546 max_x = myabs((perlin_coast_noise_2D(_height_map.size_y - y, y, 0.85, 101) + 0.3) * 6 + (perlin_coast_noise_2D(y, y, 0.45, 67) + 0.75) * 8);
547 max_x = max((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x); 547 max_x = dmax((smallest_size * smallest_size / 16) + max_x, (smallest_size * smallest_size / 16) + margin - max_x);
548 if (smallest_size < 8 && max_x > 5) max_x /= 1.5; 548 if (smallest_size < 8 && max_x > 5) max_x /= 1.5;
549 for (x = _height_map.size_x; x > (_height_map.size_x - 1 - max_x); x--) { 549 for (x = _height_map.size_x; x > (_height_map.size_x - 1 - max_x); x--) {
550 HeightMapXY(x, y) = 0; 550 HeightMapXY(x, y) = 0;
551 } 551 }
552 } 552 }
553 553
554 /* Lower to sea level */ 554 /* Lower to sea level */
555 for (x = 0; x <= _height_map.size_x; x++) { 555 for (x = 0; x <= _height_map.size_x; x++) {
556 /* Top left */ 556 /* Top left */
557 max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 2, 0.9, 167) + 0.4) * 5 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.4, 211) + 0.7) * 9); 557 max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 2, 0.9, 167) + 0.4) * 5 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.4, 211) + 0.7) * 9);
558 max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y); 558 max_y = dmax((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
559 if (smallest_size < 8 && max_y > 5) max_y /= 1.5; 559 if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
560 for (y = 0; y < max_y; y++) { 560 for (y = 0; y < max_y; y++) {
561 HeightMapXY(x, y) = 0; 561 HeightMapXY(x, y) = 0;
562 } 562 }
563 563
564 564
565 /* Bottom right */ 565 /* Bottom right */
566 max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.85, 71) + 0.25) * 6 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.35, 193) + 0.75) * 12); 566 max_y = myabs((perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.85, 71) + 0.25) * 6 + (perlin_coast_noise_2D(x, _height_map.size_y / 3, 0.35, 193) + 0.75) * 12);
567 max_y = max((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y); 567 max_y = dmax((smallest_size * smallest_size / 16) + max_y, (smallest_size * smallest_size / 16) + margin - max_y);
568 if (smallest_size < 8 && max_y > 5) max_y /= 1.5; 568 if (smallest_size < 8 && max_y > 5) max_y /= 1.5;
569 for (y = _height_map.size_y; y > (_height_map.size_y - 1 - max_y); y--) { 569 for (y = _height_map.size_y; y > (_height_map.size_y - 1 - max_y); y--) {
570 HeightMapXY(x, y) = 0; 570 HeightMapXY(x, y) = 0;
571 } 571 }
572 } 572 }