/** 2D float Perlin periodic noise. */ float pnoise2( float x, float y, int px, int py ) { int ix0, iy0, ix1, iy1; float fx0, fy0, fx1, fy1; float s, t, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; t = FADE( fy0 ); s = FADE( fx0 ); nx0 = grad2(perm[ix0 + perm[iy0]], fx0, fy0); nx1 = grad2(perm[ix0 + perm[iy1]], fx0, fy1); n0 = LERP( t, nx0, nx1 ); nx0 = grad2(perm[ix1 + perm[iy0]], fx1, fy0); nx1 = grad2(perm[ix1 + perm[iy1]], fx1, fy1); n1 = LERP(t, nx0, nx1); return 0.507f * ( LERP( s, n0, n1 ) ); }
/** 2D float Perlin noise. */ float noise2( float x, float y ) { int ix0, iy0, ix1, iy1; float fx0, fy0, fx1, fy1; float s, t, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255 iy1 = (iy0 + 1) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; t = FADE( fy0 ); s = FADE( fx0 ); nx0 = noise_grad2(noise_perm[ix0 + noise_perm[iy0]], fx0, fy0); nx1 = noise_grad2(noise_perm[ix0 + noise_perm[iy1]], fx0, fy1); n0 = LERP( t, nx0, nx1 ); nx0 = noise_grad2(noise_perm[ix1 + noise_perm[iy0]], fx1, fy0); nx1 = noise_grad2(noise_perm[ix1 + noise_perm[iy1]], fx1, fy1); n1 = LERP(t, nx0, nx1); return 0.507f * ( LERP( s, n0, n1 ) ); }
template <class T> T pnoise(T x,T y, int px, int py,const unsigned char *perm) { int ix0, iy0, ix1, iy1; T fx0, fy0, fx1, fy1; T s, t, nx0, nx1, n0, n1; px = max(px,1); py = max(py,1); ix0 = FASTFLOOR( x ); iy0 = FASTFLOOR( y ); fx0 = x - ix0; fy0 = y - iy0; fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; ix1 = (( ix0 + 1 ) % px) & 0xff; iy1 = (( iy0 + 1 ) % py) & 0xff; ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; t = FADE( fy0 ); s = FADE( fx0 ); nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0); nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1); n0 = LERP( t, nx0, nx1 ); nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0); nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1); n1 = LERP(t, nx0, nx1); return 0.5f * (1.0f + 0.507f * ( LERP( s, n0, n1 ) ) ); }
static double noise3(int * p, double x, double y, double z) { int X = (int)FASTFLOOR(x) & 255, /* FIND UNIT CUBE THAT */ Y = (int)FASTFLOOR(y) & 255, /* CONTAINS POINT. */ Z = (int)FASTFLOOR(z) & 255; double u, v, w; int A = p[X ]+Y, AA = p[A]+Z, AB = p[A+1]+Z, /* HASH COORDINATES OF */ B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z; /* THE 8 CUBE CORNERS, */ x -= FASTFLOOR(x); /* FIND RELATIVE X,Y,Z */ y -= FASTFLOOR(y); /* OF POINT IN CUBE. */ z -= FASTFLOOR(z); u = FADE(x); /* COMPUTE FADE CURVES */ v = FADE(y); /* FOR EACH OF X,Y,Z. */ w = FADE(z); return LERP(w, LERP(v, LERP(u, GRAD(p[AA ], x , y , z ), /* AND ADD */ GRAD(p[BA ], x-1.0, y , z )), /* BLENDED */ LERP(u, GRAD(p[AB ], x , y-1.0, z ), /* RESULTS */ GRAD(p[BB ], x-1.0, y-1.0, z ))),/* FROM 8 */ LERP(v, LERP(u, GRAD(p[AA+1], x , y , z-1.0 ), /* CORNERS */ GRAD(p[BA+1], x-1.0, y , z-1.0 )), /* OF CUBE */ LERP(u, GRAD(p[AB+1], x , y-1.0, z-1.0 ), GRAD(p[BB+1], x-1.0, y-1.0, z-1.0 )))); }
void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) { #define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep) FADE(rgb[0], toR); FADE(rgb[1], toG); FADE(rgb[2], toB); #undef FADE }
template <class T> T pnoise(T x,T y,T z,int px,int py,int pz,const unsigned char *perm) { int ix0, iy0, ix1, iy1, iz0, iz1; T fx0, fy0, fz0, fx1, fy1, fz1; T s, t, r; T nxy0, nxy1, nx0, nx1, n0, n1; px = max(px,1); py = max(py,1); pz = max(pz,1); ix0 = FASTFLOOR( x ); iy0 = FASTFLOOR( y ); iz0 = FASTFLOOR( z ); fx0 = x - ix0; fy0 = y - iy0; fz0 = z - iz0; fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; ix1 = (( ix0 + 1 ) % px ) & 0xff; iy1 = (( iy0 + 1 ) % py ) & 0xff; iz1 = (( iz0 + 1 ) % pz ) & 0xff; ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; iz0 = ( iz0 % pz ) & 0xff; r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.5f * (1.0f + 0.936f * ( LERP( s, n0, n1 ) ) ); }
/** 3D float Perlin periodic noise. */ float pnoise3( float x, float y, float z, int px, int py, int pz ) { int ix0, iy0, ix1, iy1, iz0, iz1; float fx0, fy0, fz0, fx1, fy1, fz1; float s, t, r; float nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of z fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; iz0 = ( iz0 % pz ) & 0xff; r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxy0 = grad3(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0); nxy1 = grad3(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0); nxy1 = grad3(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxy0 = grad3(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0); nxy1 = grad3(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = grad3(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0); nxy1 = grad3(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.936f * ( LERP( s, n0, n1 ) ); }
/** 3D float Perlin noise. */ float noise3( float x, float y, float z ) { int ix0, iy0, ix1, iy1, iz0, iz1; float fx0, fy0, fz0, fx1, fy1, fz1; float s, t, r; float nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of z fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 iy1 = ( iy0 + 1 ) & 0xff; iz1 = ( iz0 + 1 ) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; iz0 = iz0 & 0xff; r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxy0 = noise_grad3(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz0]]], fx0, fy0, fz0); nxy1 = noise_grad3(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz1]]], fx0, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = noise_grad3(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz0]]], fx0, fy1, fz0); nxy1 = noise_grad3(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz1]]], fx0, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxy0 = noise_grad3(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz0]]], fx1, fy0, fz0); nxy1 = noise_grad3(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz1]]], fx1, fy0, fz1); nx0 = LERP( r, nxy0, nxy1 ); nxy0 = noise_grad3(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz0]]], fx1, fy1, fz0); nxy1 = noise_grad3(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz1]]], fx1, fy1, fz1); nx1 = LERP( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.936f * ( LERP( s, n0, n1 ) ); }
template <class T> T noise(T x,const unsigned char *perm) { int ix0, ix1; T fx0, fx1; T s, n0, n1; ix0 = FASTFLOOR( x ); fx0 = x - ix0; fx1 = fx0 - 1.0f; ix1 = ( ix0+1 ) & 0xff; ix0 = ix0 & 0xff; s = FADE( fx0 ); n0 = grad( perm[ ix0 ], fx0 ); n1 = grad( perm[ ix1 ], fx1 ); return 0.5f * (1.0f + 0.188f * ( LERP( s, n0, n1 ) )); }
/** 1D float Perlin periodic noise, SL "pnoise()" */ float pnoise1( float x, int px ) { int ix0, ix1; float fx0, fx1; float s, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x fx0 = x - ix0; // Fractional part of x fx1 = fx0 - 1.0f; ix1 = (( ix0 + 1 ) % px) & 0xff; // Wrap to 0..px-1 *and* wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; // (because px might be greater than 256) s = FADE( fx0 ); n0 = grad1( perm[ ix0 ], fx0 ); n1 = grad1( perm[ ix1 ], fx1 ); return 0.188f * ( LERP( s, n0, n1 ) ); }
/** 1D float Perlin noise, SL "noise()" */ float noise1( float x ) { int ix0, ix1; float fx0, fx1; float s, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x fx0 = x - ix0; // Fractional part of x fx1 = fx0 - 1.0f; ix1 = ( ix0+1 ) & 0xff; ix0 = ix0 & 0xff; // Wrap to 0..255 s = FADE( fx0 ); n0 = grad1( perm[ ix0 ], fx0 ); n1 = grad1( perm[ ix1 ], fx1 ); return 0.188f * ( LERP( s, n0, n1 ) ); }
float pnoise4( float x, float y, float z, float w, int px, int py, int pz, int pw ) { int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; float s, t, r, q; float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of y iw0 = FASTFLOOR( w ); // Integer part of w fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fw0 = w - iw0; // Fractional part of w fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; fw1 = fw0 - 1.0f; ix1 = (( ix0 + 1 ) % px ) & 0xff; // Wrap to 0..px-1 and wrap to 0..255 iy1 = (( iy0 + 1 ) % py ) & 0xff; // Wrap to 0..py-1 and wrap to 0..255 iz1 = (( iz0 + 1 ) % pz ) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255 iw1 = (( iw0 + 1 ) % pw ) & 0xff; // Wrap to 0..pw-1 and wrap to 0..255 ix0 = ( ix0 % px ) & 0xff; iy0 = ( iy0 % py ) & 0xff; iz0 = ( iz0 % pz ) & 0xff; iw0 = ( iw0 % pw ) & 0xff; q = FADE( fw0 ); r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); nxyz1 = grad4(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); nxyz1 = grad4(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.87f * ( LERP( s, n0, n1 ) ); }
uint8_t B = P(X+1)+Y; uint8_t BA = P(B) + Z; uint8_t BB = P(B+1)+Z; // Get the relative position of the point in the cube uint16_t u = x & 0xFFFF; uint16_t v = y & 0xFFFF; uint16_t w = z & 0xFFFF; // Get a signed version of the above for the grad function int16_t xx = (u >> 1) & 0x7FFF; int16_t yy = (v >> 1) & 0x7FFF; int16_t zz = (w >> 1) & 0x7FFF; uint16_t N = 0x8000L; u = FADE(u); v = FADE(v); w = FADE(w); // skip the log fade adjustment for the moment, otherwise here we would // adjust fade values for u,v,w int16_t X1 = LERP(grad16(P(AA), xx, yy, zz), grad16(P(BA), xx - N, yy, zz), u); int16_t X2 = LERP(grad16(P(AB), xx, yy-N, zz), grad16(P(BB), xx - N, yy - N, zz), u); int16_t X3 = LERP(grad16(P(AA+1), xx, yy, zz-N), grad16(P(BA+1), xx - N, yy, zz-N), u); int16_t X4 = LERP(grad16(P(AB+1), xx, yy-N, zz-N), grad16(P(BB+1), xx - N, yy - N, zz - N), u); int16_t Y1 = LERP(X1,X2,v); int16_t Y2 = LERP(X3,X4,v); int16_t ans = LERP(Y1,Y2,w); return ans;
float noise4( float x, float y, float z, float w ) { int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; float s, t, r, q; float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); // Integer part of x iy0 = FASTFLOOR( y ); // Integer part of y iz0 = FASTFLOOR( z ); // Integer part of y iw0 = FASTFLOOR( w ); // Integer part of w fx0 = x - ix0; // Fractional part of x fy0 = y - iy0; // Fractional part of y fz0 = z - iz0; // Fractional part of z fw0 = w - iw0; // Fractional part of w fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; fw1 = fw0 - 1.0f; ix1 = ( ix0 + 1 ) & 0xff; // Wrap to 0..255 iy1 = ( iy0 + 1 ) & 0xff; iz1 = ( iz0 + 1 ) & 0xff; iw1 = ( iw0 + 1 ) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; iz0 = iz0 & 0xff; iw0 = iw0 & 0xff; q = FADE( fw0 ); r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxyz0 = noise_grad4(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz0 + noise_perm[iw0]]]], fx0, fy0, fz0, fw0); nxyz1 = noise_grad4(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz0 + noise_perm[iw1]]]], fx0, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = noise_grad4(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz1 + noise_perm[iw0]]]], fx0, fy0, fz1, fw0); nxyz1 = noise_grad4(noise_perm[ix0 + noise_perm[iy0 + noise_perm[iz1 + noise_perm[iw1]]]], fx0, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = noise_grad4(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz0 + noise_perm[iw0]]]], fx0, fy1, fz0, fw0); nxyz1 = noise_grad4(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz0 + noise_perm[iw1]]]], fx0, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = noise_grad4(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz1 + noise_perm[iw0]]]], fx0, fy1, fz1, fw0); nxyz1 = noise_grad4(noise_perm[ix0 + noise_perm[iy1 + noise_perm[iz1 + noise_perm[iw1]]]], fx0, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxyz0 = noise_grad4(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz0 + noise_perm[iw0]]]], fx1, fy0, fz0, fw0); nxyz1 = noise_grad4(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz0 + noise_perm[iw1]]]], fx1, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = noise_grad4(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz1 + noise_perm[iw0]]]], fx1, fy0, fz1, fw0); nxyz1 = noise_grad4(noise_perm[ix1 + noise_perm[iy0 + noise_perm[iz1 + noise_perm[iw1]]]], fx1, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = noise_grad4(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz0 + noise_perm[iw0]]]], fx1, fy1, fz0, fw0); nxyz1 = noise_grad4(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz0 + noise_perm[iw1]]]], fx1, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = noise_grad4(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz1 + noise_perm[iw0]]]], fx1, fy1, fz1, fw0); nxyz1 = noise_grad4(noise_perm[ix1 + noise_perm[iy1 + noise_perm[iz1 + noise_perm[iw1]]]], fx1, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.87f * ( LERP( s, n0, n1 ) ); }
template <class T> T noise(T x,T y,T z,T w,const unsigned char *perm) { int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1; T fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1; T s, t, r, q; T nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1; ix0 = FASTFLOOR( x ); iy0 = FASTFLOOR( y ); iz0 = FASTFLOOR( z ); iw0 = FASTFLOOR( w ); fx0 = x - ix0; fy0 = y - iy0; fz0 = z - iz0; fw0 = w - iw0; fx1 = fx0 - 1.0f; fy1 = fy0 - 1.0f; fz1 = fz0 - 1.0f; fw1 = fw0 - 1.0f; ix1 = ( ix0 + 1 ) & 0xff; iy1 = ( iy0 + 1 ) & 0xff; iz1 = ( iz0 + 1 ) & 0xff; iw1 = ( iw0 + 1 ) & 0xff; ix0 = ix0 & 0xff; iy0 = iy0 & 0xff; iz0 = iz0 & 0xff; iw0 = iw0 & 0xff; q = FADE( fw0 ); r = FADE( fz0 ); t = FADE( fy0 ); s = FADE( fx0 ); nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0); nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0); nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0); nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0); nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n0 = LERP( t, nx0, nx1 ); nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0); nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0); nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx0 = LERP ( r, nxy0, nxy1 ); nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0); nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1); nxy0 = LERP( q, nxyz0, nxyz1 ); nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0); nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1); nxy1 = LERP( q, nxyz0, nxyz1 ); nx1 = LERP ( r, nxy0, nxy1 ); n1 = LERP( t, nx0, nx1 ); return 0.5f * (1.0f + 0.87f * ( LERP( s, n0, n1 ) ) ); }
void play_intro(void) { #define COL(index,red,green,blue) \ if ((index>=min) && (index<=max)) { \ pal[index].r = (red); \ pal[index].g = (green); \ pal[index].b = (blue); \ } #define FADE(speed) \ fade_from(source, pal, speed); \ get_palette(source) #define NORMAL() \ min = 0; \ max = PAL_SIZE-1 BITMAP *bg = (BITMAP *)datafile[MYLOGO_BMP].dat; PALETTE source, pal; int n, n2; int min, max; /* play the introduction theme */ qtetris_music(MUSIC_INTRO, FALSE); n = 0; NORMAL(); set_palette(black_palette); get_palette(source); get_palette(pal); /* DAC *********************************/ clear(virtual); blit(bg, virtual, 0, 0, QTETRIS_SCREEN_W/2 - bg->w/2, QTETRIS_SCREEN_H/2 - bg->h/2, bg->w, bg->h); qtetris_blit(virtual); FADE(1); /* David A. Capello */ /* fg */ min = 1; max = 28; for (n2=0, n=min; n<=max+2; n2=n, n+=2) { COL(n2, 0, 0, 0); COL(n, 32, 32, 63); COL(n+1, 63, 63, 63); FADE(32); } /* bg */ min = 32; max = 45; for (n=max; n>=min-4; n--) { NORMAL(); for (n2=1; n2<=28; n2+=2) { COL(n2+1, 63-(-63*(n-45)/(45-32+4)), 63-(-63*(n-45)/(45-32+4)), 63-(-63*(n-45)/(45-32+4))); COL(n2, -63*(n-45)/(45-32+4), 0, 0); } min = 32; max = 45; COL(n+4, 63, 63, 63); COL(n+2, 63, 0, 0); COL(n, 63, 63, 0); FADE(64); } /* Present */ NORMAL(); COL(253, 63, 63, 63); COL(254, 32, 32, 32); COL(255, 16, 16, 16); FADE(4); /* fin de la primer etapa **************/ fade_out(2); /* QUEEN LOGO **************************/ fade_out(2); clear(virtual); blit(datafile[QUEENLOG_BMP].dat, virtual, 0, 0, QTETRIS_SCREEN_W/2-((BITMAP *)datafile[QUEENLOG_BMP].dat)->w/2, QTETRIS_SCREEN_H/2-((BITMAP *)datafile[QUEENLOG_BMP].dat)->h/2, ((BITMAP *)datafile[QUEENLOG_BMP].dat)->w, ((BITMAP *)datafile[QUEENLOG_BMP].dat)->h); qtetris_blit(virtual); fade_in(datafile[PALETTE_BMP].dat, 1); get_palette(pal); get_palette(source); FADE(2); fade_out(2); /* TETRIS ******************************/ set_palette(black_palette); get_palette(source); get_palette(pal); NORMAL(); for (n=0; n<PAL_SIZE; n++) { COL(n, 63, 63, 63); } FADE(2); /* mainscreen */ clear(virtual); drawing_mode(DRAW_MODE_COPY_PATTERN, datafile[TETRISBG_BMP].dat, 0, 0); rectfill(virtual, 0, 0, QTETRIS_SCREEN_W, QTETRIS_SCREEN_H, -1); color_map = shadow_map; drawing_mode(DRAW_MODE_TRANS, NULL, 0, 0); draw_trans_sprite(virtual, datafile[TETRIS_BMP].dat, QTETRIS_SCREEN_W/2 - ((BITMAP *)datafile[TETRIS_BMP].dat)->w/2 + 6, QTETRIS_SCREEN_H/2 - ((BITMAP *)datafile[TETRIS_BMP].dat)->h/2 + 12); solid_mode(); draw_sprite(virtual, datafile[TETRIS_BMP].dat, QTETRIS_SCREEN_W/2 - ((BITMAP *)datafile[TETRIS_BMP].dat)->w/2, QTETRIS_SCREEN_H/2 - ((BITMAP *)datafile[TETRIS_BMP].dat)->h/2); qtetris_blit(virtual); for (n=15; n<112; n++) { COL(n, 0, 0, 0); } FADE(2); FADE(2); fade_from(pal, datafile[PALETTE_BMP].dat, 2); }