Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.82 KB | None | 0 0
  1. #include <cmath>
  2.  
  3. #define FASTFLOOR(x) (x > 0 ? (int)x : (int)x - 1)
  4. #define DOT(x,y,z,g) (x*g[0] + y*g[1] + z*g[2])
  5. #define MAKECUBE(x,y,z,grid) \
  6.     uint face[3]; int tex[6];\
  7.     loopi(3) face[i]=uint(double(2155905152));\
  8.     loopi(6) tex[i]= 1;\
  9.     cubecreate(x*grid, y*grid, z*grid, grid, face, tex);
  10.  
  11. #define FORVOXEL(w,h,d) \
  12.     for (int x = 0; x < w; x++) {\
  13.     for (int y = 0; y < h; y++) {\
  14.     for (int z = 0; z < d; z++) {
  15.  
  16. #define ENDFOR }}}
  17. #define MAX(a,b) a > b ? a:b
  18. #define MIN(a,b) a > b ? b:a
  19.  
  20. double grad[12][3] = {
  21.     {1.0,1.0,0.0},{-1.0,1.0,0.0},{1.0,-1.0,0.0},{-1.0,-1.0,0.0},
  22.     {1.0,0.0,1.0},{-1.0,0.0,1.0},{1.0,0.0,-1.0},{-1.0,0.0,-1.0},
  23.     {0.0,1.0,1.0},{0.0,-1.0,1.0},{0.0,1.0,-1.0},{0.0,-1.0,-1.0}
  24. };
  25.  
  26. int perm[512] = {151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180, 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180};
  27.  
  28. double noise(double xin, double yin, double zin){
  29.     double n0, n1, n2, n3;
  30.  
  31.     double F3 = 1.0/3.0;
  32.     double s = (xin+yin+zin)*F3;
  33.     int i = xin+s;
  34.     int j = yin+s;
  35.     int k = zin+s;
  36.     double G3 = 1.0/6.0;
  37.     double t = (i+j+k)*G3;
  38.     double X0 = i-t;
  39.     double Y0 = j-t;
  40.     double Z0 = k-t;
  41.     double x0 = xin-X0;
  42.     double y0 = yin-Y0;
  43.     double z0 = zin-Z0;
  44.  
  45.     int i1, j1, k1, i2, j2, k2;
  46.  
  47.     if(x0 >= y0){
  48.         if(y0 >= z0){
  49.             i1=1; j1=0; k1=0; i2=1; j2=1; k2=0;
  50.         }
  51.         else if(x0 >= z0){
  52.              i1=1; j1=0; k1=0; i2=1; j2=0; k2=1;
  53.         }
  54.         else{
  55.             i1=0; j1=0; k1=1; i2=1; j2=0; k2=1;
  56.         }
  57.     }
  58.     else{
  59.         if(y0 < z0){
  60.             i1=0; j1=0; k1=1; i2=0; j2=1; k2=1;
  61.         }
  62.         else if(x0 < z0){
  63.             i1=0; j1=1; k1=0; i2=0; j2=1; k2=1;
  64.         }
  65.         else{
  66.             i1=0; j1=1; k1=0; i2=1; j2=1; k2=0;
  67.         }
  68.     }
  69.  
  70.     double x1 = x0 - i1 + G3;
  71.     double y1 = y0 - j1 + G3;
  72.     double z1 = z0 - k1 + G3;
  73.     double x2 = x0 - i2 + 2.0*G3;
  74.     double y2 = y0 - j2 + 2.0*G3;
  75.     double z2 = z0 - k2 + 2.0*G3;
  76.     double x3 = x0 - 1.0 + 3.0*G3;
  77.     double y3 = y0 - 1.0 + 3.0*G3;
  78.     double z3 = z0 - 1.0 + 3.0*G3;
  79.  
  80.     int ii = i & 255;
  81.     int jj = j & 255;
  82.     int kk = k & 255;
  83.  
  84.     int gi0 = perm[ii+perm[jj+perm[kk]]] % 12;
  85.     int gi1 = perm[ii+i1+perm[jj+j1+perm[kk+k1]]] % 12;
  86.     int gi2 = perm[ii+i2+perm[jj+j2+perm[kk+k2]]] % 12;
  87.     int gi3 = perm[ii+1+perm[jj+1+perm[kk+1]]] % 12;
  88.  
  89.     double t0 = 0.6 - x0*x0 - y0*y0 - z0*z0;
  90.     if(t0<0){
  91.          n0 = 0.0;
  92.     }
  93.     else{
  94.         t0 *= t0;
  95.         n0 = t0 * t0 * DOT(x0, y0, z0, grad[gi0]);
  96.     }
  97.  
  98.     double t1 = 0.6 - x1*x1 - y1*y1 - z1*z1;
  99.     if(t1<0){
  100.          n1 = 0.0;
  101.     }
  102.     else{
  103.         t1 *= t1;
  104.         n1 = t1 * t1 * DOT(x1, y1, z1, grad[gi1]);
  105.     }
  106.  
  107.     double t2 = 0.6 - x2*x2 - y2*y2 - z2*z2;
  108.     if(t2<0){
  109.          n2 = 0.0;
  110.     }
  111.     else{
  112.         t2 *= t2;
  113.         n2 = t2 * t2 * DOT(x2, y2, z2, grad[gi2]);
  114.     }
  115.  
  116.     double t3 = 0.6 - x3*x3 - y3*y3 - z3*z3;
  117.     if(t3<0){
  118.          n3 = 0.0;
  119.     }
  120.     else{
  121.         t3 *= t3;
  122.         n3 = t3 * t3 * DOT(x3, y3, z3, grad[gi3]);
  123.     }
  124.     //double value = MAX(MIN(value, 1), 0)
  125.     return 16.0*(n0 + n1 + n2 + n3) + .5;
  126. }
  127.  
  128. double simplex_noise(int octaves, double x, double y, double z){
  129.     double value = 0.0;
  130.     for(int i=0; i<octaves; i++){
  131.         value += noise(
  132.             x*pow(2, i),
  133.             y*pow(2, i),
  134.             z*pow(2, i)
  135.         );
  136.     }
  137.     return value;
  138. }
  139.  
  140. ///////////////////////////////////////////////////////////////////////////////////////////////
  141. ///////////////////////////////////////////////////////////////////////////////////////////////
  142.  
  143. void gensimplex(int w, int h, int d, int grid, float scaling, float threshold, int octaves, int seed) {
  144.     if (w == 0 || h == 0 || d == 0 || octaves == 0) {
  145.         conoutf("int w, int h, int d, int grid, float scaling, float threshold, int octaves, int seed");
  146.         return;
  147.     }
  148.     double min = 1000.0, max = -1000.0;
  149.     FORVOXEL(w,h,d)
  150.         double a = simplex_noise(octaves,(x*scaling)+seed, (y*scaling)+seed, (z*scaling)+seed) / octaves;
  151.         if (a < min) min = a;
  152.         if (a > max) max = a;
  153.         if (a > threshold) {
  154.             MAKECUBE(x,y,z,grid);
  155.         }
  156.     ENDFOR
  157.     conoutf("Min: %f Max: %f", min, max);
  158.     conoutf("simplex noise done. /remip to show cubes");
  159. }
  160.  
  161. ICOMMAND(simplex,"iiiiffii",(int *w, int *h, int *d, int *grid, float *scaling, float *threshold, int *octaves, int *seed), gensimplex(*w, *h, *d, *grid, *scaling, * threshold, *octaves, *seed));
  162.  
  163. ///////////////////////////////////////////////////////////////////////////////////////////////
  164. ///////////////////////////////////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement