home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2007 September / maximum-cd-2007-09.iso / Assets / data / AssaultCube_v0.93.exe / source / src / rndmap.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2007-03-31  |  2.1 KB  |  71 lines

  1. // rndmap.cpp: perlin noise landscape generation and some experimental random map stuff, currently not used
  2.  
  3. #include "cube.h"
  4.  
  5. float noise(int x, int y, int seed)
  6. {
  7.     int n = x+y*57;
  8.     n = (n<<13)^n;
  9.     return 1.0f-((n*(n*n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0f;
  10. }
  11.  
  12. float smoothednoise(int x, int y, int seed)
  13. {
  14.     float corners = (noise(x-1, y-1, seed)+noise(x+1, y-1, seed)+noise(x-1, y+1, seed)+noise(x+1, y+1, seed))/16;
  15.     float sides = (noise(x-1, y, seed)+noise(x+1, y, seed)+noise(x, y-1, seed)+noise(x, y+1, seed))/8;
  16.     float center = noise(x, y, seed)/4;
  17.     return corners+sides+center;
  18. }
  19.  
  20. float interpolate(float a, float b, float x)
  21. {
  22.     float ft = x*3.1415927f;
  23.     float f = (1.0f-cosf(ft))*0.5f;
  24.     return a*(1-f)+b*f;
  25. }
  26.  
  27. float interpolatednoise(float x, float y, int seed)
  28. {
  29.     int ix = (int)x;
  30.     float fx = x-ix;
  31.     int iy = (int)y;
  32.     float fy = y-iy;
  33.     float v1 = smoothednoise(ix,   iy,   seed);
  34.     float v2 = smoothednoise(ix+1, iy,   seed);
  35.     float v3 = smoothednoise(ix,   iy+1, seed);
  36.     float v4 = smoothednoise(ix+1, iy+1, seed);
  37.     float i1 = interpolate(v1, v2, fx);
  38.     float i2 = interpolate(v3, v4, fy);
  39.     return interpolate(i1, i2, fy);
  40. }
  41.  
  42. float perlinnoise_2D(float x, float y, int seedstep, float pers)
  43. {
  44.     float total = 0;
  45.     int seed = 0;
  46.     for(int i = 0; i<7; i++)
  47.     {
  48.         float frequency = (float)(2^i);
  49.         float amplitude = (float)pow(pers, i);
  50.         total += interpolatednoise(x*frequency, y*frequency, seed)*amplitude;
  51.         seed += seedstep;
  52.     }
  53.     return total;
  54. }
  55.  
  56. void perlinarea(block &b, int scale, int seed, int psize)
  57. {
  58.     srand(seed);
  59.     seed = rnd(10000);
  60.     if(!scale) scale = 10;
  61.     for(int x = b.x; x<=b.x+b.xs; x++) for(int y = b.y; y<=b.y+b.ys; y++)
  62.     {
  63.         sqr *s = S(x,y);
  64.         if(!SOLID(s) && x!=b.x+b.xs && y!=b.y+b.ys) s->type = FHF; 
  65.         s->vdelta = (int)(perlinnoise_2D(x/((float)scale)+seed, y/((float)scale)+seed, 1000, 0.01f)*50+25);
  66.         if(s->vdelta>128) s->vdelta = 0;
  67.     }
  68. }
  69.  
  70.  
  71.