0xa0154806…bb3asent to0x99a9b7c1…b069·#16,563,801·view on Etherscan
let useA,prngA,prngB;
class Random {
constructor() {
useA = false;
let sfc32 = function (uint128Hex) {
let a = parseInt(uint128Hex.substr(0, 8), 16);
let b = parseInt(uint128Hex.substr(8, 8), 16);
let c = parseInt(uint128Hex.substr(16, 8), 16);
let d = parseInt(uint128Hex.substr(24, 8), 16);
return function () {
a |= 0; b |= 0; c |= 0; d |= 0;
let t = (((a + b) | 0) + d) | 0;
d = (d + 1) | 0;
a = b ^ (b >>> 9);
b = (c + (c << 3)) | 0;
c = (c << 21) | (c >>> 11);
c = (c + t) | 0;
return (t >>> 0) / 4294967296;
};
};
// seed prngA with first half of tokenData.hash
prngA = new sfc32(tokenData.hash.substr(2, 32));
// seed prngB with second half of tokenData.hash
prngB = new sfc32(tokenData.hash.substr(34, 32));
for (let i = 0; i < 1e6; i += 2) {
prngA(); prngB();
}
}
random_dec() {
useA = !useA;
return useA ? prngA() : prngB();
}
}
function rnd() { return R.random_dec() }
function vecscl(v,k) { let w=[]; for (let i=0; i<v.length; i++) { w[i] = v[i]*k; } return w }
function clamp(x) { return Math.max(0,Math.min(1,x)); }
function dot2(x,y) { return x[0]*y[0]+x[1]*y[1]; }
R = new Random();
let C,D,body,gl,Shader;
document.body.style.backgroundColor = "#030303";
console.log("Calian by Eric De Giuli");
C=({body}=D=document).createElement('canvas');
body.appendChild(C);
gl=C.getContext('webgl2');
Shader=(typ,src)=>{
const s =gl.createShader(typ);
gl.shaderSource(s,src);
gl.compileShader(s);
if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {
console.error(`Error compiling ${typ === gl.VERTEX_SHADER ? "vertex" : "fragment"} shader "${src}":`);
console.log(gl.getShaderInfoLog(s));
}
return s;
}
var GET = {};
var query = window.location.search.substring(1).split("&");
for (var i = 0, max = query.length; i < max; i++)
{
if (query[i] === "")
continue;
var param = query[i].split("=");
GET[decodeURIComponent(param[0])] = decodeURIComponent(param[1] || "");
}
let simp,colp,vs,fs;
let Lx,Ly,Nx,Ny;
Nx = 512;if (GET.N) { Nx=GET.N; }
Ny=Nx;
const head = /\bHeadlessChrome\//.test(navigator.userAgent);
let PI = 3.1415926;
let pal,pj,inv;
let palp = [3,5,3,4,1,2,4,4,1,3,2,2,4,2,3,3];
palp = vecscl(palp,1/46);
let cumpal = []; cumpal[0]=0;
for (let i=1; i<palp.length; i++) { cumpal[i]=cumpal[i-1]+palp[i-1]; }
let st = 1;
pj=1;
let palr = rnd();
while (st<palp.length && cumpal[st]<palr) { st++; } st--;
let pj2 = Math.floor(11*rnd());
(tokenData.tokenId%1000000==0)&&(st=1);
inv=0;
switch(st) {
case 0: pj=6;pj2=7; break; // embers in half light
case 1: pj=11;pj2=7; break; // liquid circuit
case 2: pj=1;pj2=5; break; // alpenglow
case 3: pj=1;pj2=0; break; // zabriskie point
case 4: pj=3;pj2=9; break; // aurum
case 5: pj=6;pj2=0; break; // tunguska
case 6: pj=5;pj2=7; break; // nocturne
case 7: pj=11;pj2=5; break; // kind of blue
case 8: pj=11;pj2=4; break; // inferno
case 9: pj=11;pj2=0; break; // constellation
case 10: pj=0;pj2=0;inv=1; break; // white heat
case 11: pj=3;pj2=3;inv=1; break; // calanque
case 12: pj=2;pj2=0; break; // bouquet
case 13: pj=2;pj2=10; break; // spectral
case 14: pj=10;pj2=8; break; // the forest path to the spring
case 15: pj=10;pj2=4; break; // abalone
}
pal = new Uint8Array(10*4*2);
for (let k=0; k<11; k++) { // which colour in palette
for (let k2=0; k2<2; k2++) { // which palette
let pp = (k2==0) ? pj : pj2;
let kk = Math.min(k,pals[pp].length-1);
pal[3*k+3*10*k2] = pals[pp][kk][0];
pal[3*k+3*10*k2+1] = pals[pp][kk][1];
pal[3*k+3*10*k2+2] = pals[pp][kk][2];
if (inv) { pal[3*k+3*10*k2] = (pal[3*k+3*10*k2]+180)%360; } //invert colour
}
}
let kp,km,kv,kw,kl,rand;
rand = []; for (let i=0; i<Nrand; i++) { rand[i]=rnd(); }
let k0=1;
let kl0=0.001;
kp = new Float32Array(N);
km = new Float32Array(N);
kl = new Float32Array(N);
switch(st) {
case 0: kp = [0.66, 0.95, 0.94, 0.037, 0.89, 0.26, 0.90, 0.94, 0.65, 0.76, 0.54, 0.11, 0.50, 0.66, 0.96, 0.74, 0.91, 0.33, 0.15, 0.85]; break;
case 1: kp = [0.97, 0.01, 0.89, 0.08, 0.78, 0.98, 0.16, 0.80, 0.53, 0.91, 0.40, 0.54, 0.84, 0.44, 0.14, 0.75, 0.45, 0.33, 0.47, 0.95]; break;
case 2: kp = [0.72, 0.85, 0.51, 0.08, 0.98, 0.29, 0.91, 0.19, 0.69, 0.24, 0.99, 0.32, 0.84, 0.03, 0.97, 0.14, 0.09, 0.04, 0.08, 0.26]; break;
case 3: kp = [0.14, 0.95, 0.24, 0.09, 0.05, 0.18, 0.96, 0.04, 0.47, 0.18, 0.13, 0.38, 0.21, 0.85, 0.66, 0.05, 0.15, 0.23, 0.25, 0.48]; break;
case 4: kp = [0.58, 0.02, 0.03, 0.84, 0.43, 0.40, 0.95, 0.76, 0.15, 0.55, 0.04, 0.49, 0.49, 0.55, 0.52, 0.07, 0.22, 0.16, 0.31, 0.37]; break;
case 5: kp = [0.21, 0.10, 0.21, 0.13, 0.07, 0.42, 0.26, 0.77, 0.28, 0.67, 0.79, 0.10, 0.28, 0.20, 0.04, 0.21, 0.35, 0.125, 0.75, 0.87]; break;
case 6: kp = [0.40, 0.28, 0.88, 0.36, 0.92, 0.96, 0.79, 0.24, 0.99, 0.73, 0.68, 0.03, 0.09, 0.52, 0.11, 0.29, 0.95, 0.01, 0.01, 0.62]; break;
case 7: kp = [0.10, 0.27, 0.31, 0.05, 0.40, 0.24, 0.67, 0.00, 0.02, 0.92, 0.75, 0.11, 0.40, 0.55, 0.97, 0.45, 0.12, 0.15, 0.54, 0.56]; break;
case 8: kp = [0.17, 0.81, 0.64, 0.19, 0.52, 0.27, 0.59, 0.11, 0.65, 0.87, 0.36, 0.17, 0.66, 0.10, 0.95, 0.08, 0.50, 0.43, 0.92, 0.13]; break;
case 9: kp = [0.59, 0.56, 0.03, 0.14, 0.58, 0.05, 0.80, 0.00, 0.09, 0.75, 0.80, 0.55, 0.07, 0.27, 0.46, 0.08, 0.35, 0.01, 0.17, 0.63]; break;
case 10: kp = [0.021, 0.68, 0.20, 0.04, 0.46, 0.40, 0.30, 0.76, 0.19, 0.20, 0.78, 0.50, 0.10, 0.58, 0.61, 0.13, 0.25, 0.39, 0.63, 0.38]; break;
case 11: kp = [0.11, 0.18, 0.02, 0.15, 0.49, 0.90, 0.73, 0.77, 0.69, 0.93, 0.95, 0.76, 0.78, 0.32, 0.13, 0.70, 0.07, 0.04, 0.30, 0.76]; break;
case 12: kp = [0.15, 0.27, 0.17, 0.11, 0.61, 0.44, 0.65, 0.21, 0.82, 0.79, 0.40, 0.33, 0.43, 0.22, 0.02, 0.07, 0.50, 0.13, 0.95, 0.34]; break;
case 13: kp = [0.89, 0.46, 0.48, 0.30, 0.38, 0.18, 0.13, 0.68, 0.20, 0.87, 0.92, 0.56, 0.06, 0.25, 0.32, 0.10, 0.05, 0.11, 0.31, 0.55]; break;
case 14: kp = [0.90, 0.025, 0.064, 0.439, 0.208, 0.154, 0.261, 0.085, 0.268, 0.917, 0.780, 0.709, 0.087, 0.068, 0.684, 0.057, 0.480, 0.282, 0.174, 0.819]; break;
case 15: kp = [0.81, 0.79, 0.38, 0.80, 0.19, 0.22, 0.39, 0.047, 0.82, 0.98, 0.90, 0.28, 0.12, 0.24, 0.12, 0.69, 0.62, 0.20, 0.99, 0.71]; break;
}
for (let i=0; i<N; i++) { km[i]=k0*rnd(); }
for (let i=0; i<N; i++) { kl[i]=kl0*rnd(); }
if (km[0]<0.15*k0 && st!=10 && st!=3 && st!=1) { kp[15]=0.69;kp[16]=1.34; }
let nx = 2+Math.floor(8*rnd());
let ny = 2+Math.floor(8*rnd());
let rr = rnd();
let n4 = Math.floor(Math.exp(4*rnd()));
let rbg = Math.floor(15*rnd());
// initial conditions
const tex0 = new Uint8Array(Nx*Ny*4);
let th;
for (let x = 0; x < Nx; x++) {
for (let y = 0; y < Ny; y++) {
let i = x+Nx*y;
let r2 = (x-Nx/2)**2+(y-Ny/2)**2;
r2/=(Nx*Nx+Ny*Ny)/4;
switch(rbg) {
case 0: r2 = Math.sin(x/nx)*Math.sin(y/ny)*Math.sin(25*r2)>.1+.5*rr; break;
case 1: r2 = Math.sin(x/Nx*nx*PI)*Math.sin(y/Ny*ny*PI)*Math.sin(25*r2)>0.5*rr; break;
case 2: r2 = Math.sin(y*x/Nx*nx*PI)*Math.sin(y/Ny*ny*PI)*Math.sin(25*r2)>0.5*rr; break;
case 3: r2 = Math.sin(y*x/Nx*nx*PI)*Math.sin(y/Ny*ny*PI)*Math.sin(2*(x-Nx/2)/(y-Ny/2)+1*(y-Ny/2)/(x-Nx/2))>0.5*rr; break;
case 4: r2 = Math.sin(Math.sin(x/Nx*n4)*y/Ny*nx*PI)*Math.sin(y/Ny*ny*PI)*Math.sin(2*(x-Nx/2)/(y-Ny/2)+1*(y-Ny/2)/(x-Nx/2))>0.5*rr; break;
case 5: r2 = Math.sin(Math.sin(x/Nx*n4*PI)*y/Ny*(1-y/Ny)*ny*PI)*Math.sin(x/Nx*nx*PI)>0.6*rr; break;
case 6: r2 = Math.sin(Math.sin(y/Ny*n4*PI)*x/Nx*(1-x/Nx)*nx*PI)*Math.sin(y/Ny*ny*PI)>0.6*rr; break;
case 7: r2 = Math.sin(30*x/Nx*nx*PI)*Math.sin(x/Nx*nx*PI)>0.6*rr; break;
case 8: r2 = Math.sin(30*x/Nx*nx*PI)*Math.sin(y/Ny*ny*PI)>0.6*rr; break;
case 9: r2 *= .7*(Math.sin(20*(x/Nx-0.5)*nx)+Math.sin(2*(y/Ny-0.5))); break;
case 10: r2 = r2*Math.sin(20*r2*nx)>.3*rr; break;
case 11: r2 = Math.sin(r2*nx*Math.tan(n4*x/Nx+9*y/Ny))>.6*rr; break;
case 12: th = Math.atan2(y-Ny/2,x-Nx/2); r2*=1+0.2*Math.cos(nx*th)*(1+0.6*Math.sin(nx/ny+3*nx*th)*(1+0.6*Math.cos(5*nx*th))); r2*=.72; break;
case 13: th = Math.atan2(y+(.3+.4*km[3])*Ny,x-.5*Nx); r2 = Math.sin(10*nx*(x-y)/Nx*PI)*Math.sin((y+x)/Ny*ny*PI+th*ny*nx)>(.2+km[2]*.8)*rr; break;
case 14: r2=0.6+.4*rr;
}
tex0[4*i] = Math.floor(rnd()*255*(r2));
tex0[4*i+1] = Math.floor(rnd()*255*(1-r2) );
tex0[4*i+2] = Math.floor(rnd()*255*(1-r2) );
tex0[4*i+3] = Math.floor(rnd()*255*(r2) );
}
}
dzc=0;
dzp=dzc;
let loc_a,loc_ac,loc_img,loc_img00,loc_res,loc_t,loc_rand,loc_palc,loc_kp,loc_km,loc_kl,loc_kv,loc_kw,loc_imgc,loc_imgc2,loc_resc,loc_Lc,loc_tc,loc_randc,loc_aavg,loc_bavg,loc_dxy,loc_dxyc,loc_rc,loc_rcc;
function thrower(prog) {
if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
console.log(`Link failed:\n${gl.getProgramInfoLog(prog)}`);
console.log(`VS LOG:\n${gl.getShaderInfoLog(vs)}`);
console.log(`FS LOG:\n${gl.getShaderInfoLog(fs)}`);
throw 'AARG DED';
}
}
simp = gl.createProgram(); // simulation program
vs = Shader(gl.VERTEX_SHADER, src_vert);
fs = Shader(gl.FRAGMENT_SHADER, src_simp);
gl.attachShader(simp, vs);
gl.attachShader(simp, fs);
gl.linkProgram(simp);
gl.useProgram(simp);
thrower(simp);
function gul(pr,lab) { return gl.getUniformLocation(pr,lab); }
loc_img=gul(simp,'img');
loc_img00=gul(simp,'img00');
loc_res=gul(simp,'res');
loc_t =gul(simp,'t');
loc_rand =gul(simp,'rand');
loc_kp =gul(simp,'kp');
loc_km =gul(simp,'km');
loc_kl =gul(simp,'kl');
loc_dxy =gul(simp,'dxy');
loc_rc =gul(simp,'rc');
gl.uniform1i(loc_img,0);
gl.uniform1i(loc_img00,1);
gl.uniform2f(loc_res,Nx,Ny);
loc_a = gl.getAttribLocation(simp, "a");
gl.activeTexture(gl.TEXTURE0);
gl.vertexAttribPointer(loc_a, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(loc_a);
colp = gl.createProgram(); // colour program
vs = Shader(gl.VERTEX_SHADER, src_vert);
fs = Shader(gl.FRAGMENT_SHADER, src_colp);
gl.attachShader(colp, vs);
gl.attachShader(colp, fs);
gl.linkProgram(colp);
gl.useProgram(colp);
thrower(colp);
loc_imgc=gul(colp,'img');
loc_imgc2=gul(colp,'img2');
loc_palc=gul(colp,'pal');
loc_resc=gul(colp,'res');
loc_Lc=gul(colp,'L');
loc_tc =gul(colp,'t');
loc_randc =gul(colp,'rand');
loc_dxyc =gul(colp,'dxy');
loc_rcc =gul(colp,'rc');
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0]),gl.STATIC_DRAW);
gl.uniform1i(loc_imgc,0);
gl.uniform1i(loc_imgc2,2);
gl.uniform2f(loc_resc,Nx,Ny);
loc_ac = gl.getAttribLocation(colp, "a"); //'a');
gl.activeTexture(gl.TEXTURE0);
gl.vertexAttribPointer(loc_ac, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(loc_ac);