Advertisement
Guest User

Untitled

a guest
Jun 27th, 2014
698
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.75 KB | None | 0 0
  1. float         fade(float t) { return t * t * t * (t * (t * 6 - 15) + 10); }
  2.     float         linear(float start,float end,float coef){return coef*(end-start)+start;}
  3.     float         poly(float coef){return 3.f*coef*coef - 2.f*coef*coef*coef ;}
  4.     float         interp2(float start,float end,float coef){return linear(start, end, poly(coef));}
  5.     float         interp3(float start,float end,float coef){return linear(start, end, fade(coef));}
  6.          sandbox::sandbox(){
  7.     }
  8.     float interpsmoother(float a, float b, float x){
  9.         return interp(a,b,fade(x));
  10.         //    return 3*x*x-2*x*x*x;
  11.     //    return fade(x);
  12.     }
  13.     float getnoise(Vec2&A, Vec2&B, Vec2&C, Vec2&D, Vec2 rel){
  14.     //    Vec2 grad = interp(interp(A,B,rel.x),interp(C,D,rel.x),rel.y);
  15.     //    rel=rel*.8f+Vec2(.125f,.125f);
  16.     //    rel+=Vec2(.1,.1);
  17.         float
  18.         dot_a=prod(A ,Vec2((rel.x   ),rel.y)),
  19.         dot_b=prod(B ,Vec2((rel.x-1 ),rel.y)),
  20.         dot_c=prod(C ,Vec2((rel.x   ),rel.y-1)),
  21.         dot_d=prod(D ,Vec2((rel.x-1 ),rel.y-1));
  22.     //#define DATINTERP interpsmooth
  23.     //#define DATINTERP interpsmoother
  24.     //#define DATINTERP interp
  25.     #define DATINTERP interp2
  26.     //#define DATINTERP interp3
  27.         return DATINTERP
  28.         (DATINTERP(dot_a,dot_b,rel.x),DATINTERP(dot_c,dot_d,rel.x),rel.y);
  29.     //    return interpsmooth
  30.     //    (interpsmooth(dot_a,dot_b,rel.x),interpsmooth(dot_c,dot_d,rel.x),rel.y);
  31.     }
  32.     void diagnose(int divisions, float cellsize, vector<Vec2> & randv)
  33.     {
  34.         glines.clear();
  35.        
  36.         for(int jj=0;jj<=divisions;++jj){
  37.             for(int ii=0;ii<=divisions;++ii)
  38.             {
  39.                 Vec2
  40.                 A = randv[divisions*jj      +ii];
  41.                 glines.append(Vertex(Vec2(10,10)+cellsize*Vec2(ii,jj)));
  42.                 glines.append(Vertex(Vec2(10,10)+cellsize*Vec2(ii,jj)+A*cellsize*.5f));
  43.                 ptpls.put(Vec2(10,10)+cellsize*Vec2(ii,jj));
  44.             }
  45.         }
  46.     //    lb2(getnoise(randv[0],randv[1],randv[2],randv[3],Vec2(0,0)));
  47.     }
  48.     Vec2 getrel(int i, int j, float cellsize){
  49.         return Vec2
  50.         (float
  51.          (i // which pixel
  52.           -(i/int(cellsize))//which cell
  53.           *cellsize)// floor() equivalent
  54.           /cellsize,// [0,1] range
  55.          float(j-(j/int(cellsize))*cellsize)/cellsize
  56.          )
  57.     //    *.8f+Vec2(.125,.125)
  58.         ;
  59.     }
  60.     void sandbox::init(){
  61.         show_diagnose = false;
  62.         call=cfg->getstring("noise_call");
  63.         seed = cfg->getint("noise_seed");
  64.     //    float maxval=-1e20,minval=1e20;
  65.  
  66.         int pixels = cfg->getint("noise_size");
  67.         int divisions = cfg->getint("noise_divisions");
  68.         float cellsize = float(pixels)/divisions;
  69.  
  70.         lambdas["noise_good"]=
  71.         [this,cellsize,pixels,divisions]()
  72.         {
  73.             auto randv = seeded_rand_vec2(seed,(divisions+1)*(divisions+1));
  74.             float factor=2.f;
  75.             for(auto&a:randv)
  76.             {
  77.                 a= a*factor-factor*.5f*Vec2(1.f,1.f);
  78.                 a=normalize(a);
  79.             }
  80.             glines.clear();
  81.             ptpls.clear();
  82.             if (show_diagnose) diagnose(divisions,cellsize,randv);
  83.     //        Image img;
  84.             img.create(pixels,pixels,Color(0,0,0));
  85.             float maxval=-1e20,minval=1e20;
  86.             float maxval2=-1e20,minval2=1e20;
  87.             for(int j=0;j<pixels;++j)
  88.             {
  89.                 for(int i=0;i<pixels;++i)
  90.                 {
  91.                     int ii = int(i/cellsize);
  92.                     int jj = int(j/cellsize);
  93.                     Vec2
  94.                     A = randv[divisions*jj      +ii],
  95.                     B = randv[divisions*jj      +ii+1],
  96.                     C = randv[divisions*(jj+1)  +ii],
  97.                     D = randv[divisions*(jj+1)  +ii+1];
  98.  
  99.                     float val = getnoise(A,B,C,D,getrel(i,j,cellsize));
  100.                     if(val>maxval)maxval=val;lb2(maxval);
  101.                     if(val<minval)minval=val;lb2(minval);
  102.  
  103.     //                val+=.7f;
  104.     //                val*=.7f;
  105.                     val = .5f*(val+.7f);
  106.                     if(val>maxval2)maxval2=val;lb2(maxval2);
  107.                     if(val<minval2)minval2=val;lb2(minval2);
  108.     //                Color c = rgb_from_hue(val);
  109.     //                img.setPixel(i,j,c);
  110.                     val*=255.f;
  111.                     img.setPixel(i,j,Color(val,val,val));
  112.                 }
  113.             }
  114.             tx.loadFromImage(img);
  115.             spr.setPosition(Vec2(10,10));
  116.             spr.setTexture(tx);
  117.             lb2(minval);
  118.             lb2(maxval);
  119.             lb2(minval2);
  120.             lb2(maxval2);
  121.             lb2(randv[0]);
  122.             lb2(randv[1]);
  123.             lb2(randv[2]);
  124.            
  125.         };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement