0x4f597b39…60c8sent to0xa7d8d9ef…d270·#15,315,505·view on Etherscan
h>0.) { n=m.origin+m.dir*l; vec3 R=gNorm(n); p=tint(n); p=hsvA(p,uHSV.x,uHSV.yz); p*=gLight(n,m,R,d,t); float e=cAO(n,R,uAO.x,uAO.y),U=clamp(curve(n,uCurve.x)*.5+.5,0.,1.); U=U*uCurve.y+uCurve.z; float w=U*e; p*=w; T=p; } float e=1.-step(0.,h*2.-1.); p*=1.-e; ${l} float R=smoothstep(uFog.x,uFog.y,l*h); ${p} p=mix(p,vec3(0.),R); p+=d*T*mix(1.25,.15,R); ${u} p=aces(p); const float w=2.2; p=pow(p,vec3(1./w)); gl_FragColor=vec4(p,1.); }\n`})}function injectBlur(e){let t="";return"Asteroids"!=e&&"Exoplanet"!=e||(t="vec4 blurred = blur9(sInput, v, uResolution, vec2(1.0));\n float blurMask = smoothstep(0.0, 1.0, w - 0.1);\n r = mix(r, blurred, blurMask);"),t}function getPostShader(e,t){const c=injectBlur(t);return new THREE.ShaderMaterial({uniforms:uniformsPost,vertexShader:"varying vec2 vUv; void main(){vUv=uv;gl_Position=vec4(position,1.);}",fragmentShader:`varying vec2 vUv; uniform vec2 uResolution; uniform sampler2D sInput; uniform float uStep, uMask;\n#define FXAA_REDUCE_MIN (1./128.)\n#define FXAA_REDUCE_MUL (1./8.)\n#define FXAA_SPAN_MAX 8.\nvec4 fxaa(sampler2D s,vec2 v,vec2 u,vec2 m,vec2 z,vec2 y,vec2 F,vec2 f){ vec4 r; mediump vec2 x=vec2(1./u.x,1./u.y); vec3 t=texture2D(s,m).xyz,a=texture2D(s,z).xyz,X=texture2D(s,y).xyz,p=texture2D(s,F).xyz; vec4 d=texture2D(s,f); vec3 b=d.xyz,w=vec3(.299,.587,.114); float l=dot(t,w),N=dot(a,w),e=dot(X,w),L=dot(p,w),c=dot(b,w),A=min(c,min(min(l,N),min(e,L))),o=max(c,max(max(l,N),max(e,L))); mediump vec2 i; i.x=-(l+N-(e+L)); i.y=l+e-(N+L); float D=max((l+N+e+L)*(.25*FXAA_REDUCE_MUL),FXAA_REDUCE_MIN),n=1./(min(abs(i.x),abs(i.y))+D); i=min(vec2(FXAA_SPAN_MAX,FXAA_SPAN_MAX),max(vec2(-FXAA_SPAN_MAX,-FXAA_SPAN_MAX),i*n))*x; vec3 T=.5*(texture2D(s,v*x+i*(1./3.-.5)).xyz+texture2D(s,v*x+i*(2./3.-.5)).xyz),R=T*.5+.25*(texture2D(s,v*x+i*-.5).xyz+texture2D(s,v*x+i*.5).xyz); float M=dot(R,w); if(M<A||M>o) r=vec4(T,d.w); else r=vec4(R,d.w); return r; } vec4 blur9(sampler2D s,vec2 v,vec2 z,vec2 x){ vec4 r=vec4(0.); vec2 i=vec2(1.38462)*x,w=vec2(3.23077)*x; r+=texture2D(s,v)*.227027; r+=texture2D(s,v+i/z)*.316216; r+=texture2D(s,v-i/z)*.316216; r+=texture2D(s,v+w/z)*.0702703; r+=texture2D(s,v-w/z)*.0702703; return r; } void main() { vec2 v=vUv,s=v*2.-1.; s.x*=uResolution.x/uResolution.y; float w=length(s); vec4 r; vec2 i=1./uResolution*uStep,m=v+vec2(-i.x,i.y),z=v+i,x=v-i,u=v+vec2(i.x,-i.y),L=v; r=fxaa(sInput,v*uResolution,uResolution,m,z,x,u,L); ${c} float t=1.-smoothstep(.1,uMask,w); r*=t; gl_FragColor=r; }`})}function print(e){console.log(e)}const PROB_FOV=.03,PROB_SPEED=.2,PROB_SPEED_ULTRA=.03,PROB_BEAM=.15;function remap(e,t,c,r,s){return r+(s-r)*(e-t)/(c-t)}function randomFromArray(e,t){const c=t.length;return t[Math.min(parseInt(e*c),c-1)%c]}function selectTerrain(e,t,c,r){let s;s=e<.34?["Exoplanet"]:e<.62?["Tunnel"]:e<.96?["Carved","Helicoidal"]:["Asteroids"],0==r&&(s=["Exoplanet"]);let n=randomFromArray(t,s);return null!=c&&(n=c),{data:terrains[n],name:n}}function selectPath(e,t){const c=e.Paths;return c[randomFromArray(t,Object.keys(c))]}function selectFogFar(e,t){const c=randomFromArray(t,Object.keys(e.Visibility));return{name:c,val:e.Visibility[c]}}function selectHeightFog(e,t){return{active:e.HeightFog,pars:e.HeightFogOptions,attenuate:e.HeightFogAttenuate}}function selectDeformation(e,t){const c=randomFromArray(t[0],Object.keys(e.Deformations)),r=e.DeformationWeights[c],s=remap(t[1],0,1,r[0],r[1]),n=e.DeformationStrengths[c],i=remap(t[2],0,1,n[0],n[1]);return{name:c,val:e.Deformations[c],weight:s,strength:i}}function selectHorizon(e,t){const c=e.Horizon,r=randomFromArray(t,Object.keys(e.HorizonOptions));return{active:c,name:r,far:e.HorizonOptions[r]}}function selectBackground(e,t){let c=0;return t<e.BackgroundChance&&(c=1),c}function selectBackground(e,t){let c=0;return t<e.BackgroundChance&&(c=1),c}function selectPalette(e,t,c){let r=Object.keys(e.Palettes),s=r,n=randomFromArray(t[0],s),i=e.Palettes[n];if("smooth"==c.name){s=[];for(let t=0;t<r.length;t++){const c=r[t];e.Palettes[c].s&&s.push(c)}n=randomFromArray(t[0],s),(i=e.Palettes[n]).pS=remap(t[1],0,1,.03,.1),i.pSb=remap(t[2],0,1,.05,1)}return{name:n,vals:i}}function selectSpeed(e,t,c,r){let s="Normal";if(e<PROB_SPEED&&r.warp)if(t<=PROB_SPEED_ULTRA)s="Hyper";else{s=randomFromArray(c,["Fast","Hasty","Slow"])}return{name:s,val:{Slow:.33,Normal:.5,Fast:.75,Hasty:1,Hyper:2}[s]}}function selectFOV(e,t){let c=["Normal",127];return e<PROB_FOV&&("Tunnel"==t||"Helicoidal"==t)&&(c=["Warp",170]),{name:c[0],val:c[1]}}function selectBeam(e,t){const c={White:[1,1,1],Red:[1,0,0],Green:[0,1,0],Blue:[0,0,1]};let r="White";return e<PROB_BEAM&&(r=randomFromArray(t,Object.keys(c))),{name:r,val:c[r]}}function selectSmooth(e){let t;return{name:t=e?"Smooth":"Rough"}}function processConfig(e,t,c,r){let s={};return s.FOV=selectFOV(c[0],e),s.Speed=selectSpeed(c[1],c[2],c[3],t),s.Beam=selectBeam(c[4],c[5]),s.Surface=selectSmooth(r),s}function processTerrain(e,t,c,r){let s=0;if(0==r%100&&0!=r){e=selectTerrain(0,0,randomFromArray(c,["Helicoidal","Tunnel"]),r),t.val=0,e.data.HeightFog=0,s=1}return{terrain:e,smooth:s}}function selectRarities(e,t,c,r){const s=processTerrain(e,t,c[0],r),n=s.terrain,i=s.smooth,o=n.name,a=selectPath(n.data,c[1]);return{terrain:n,paths:a,config:processConfig(o,a,c.slice(2,8),i)}}class Random{constructor(){this.useA=!1;let e=function(e){let t=parseInt(e.substr(0,8),16),c=parseInt(e.substr(8,8),16),r=parseInt(e.substr(16,8),16),s=parseInt(e.substr(24,8),16);return function(){let e=((t|=0)+(c|=0)|0)+(s|=0)|0;return s=s+1|0,t=c^c>>>9,c=(r|=0)+(r<<3)|0,r=(r=r<<21|r>>>11)+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substr(2,32)),this.prngB=new e(tokenData.hash.substr(34,32));for(let e=0;e<1e6;e+=2)this.prngA(),this.prngB()}rand(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}randBool(e){return this.rand()<e}getSeeds(){let e=[];for(let t=0;t<32;t++)e.push(this.rand());return e}}function createUniforms(e,t,c,r,s,n,i,o,a,v,l,p){const u=[n.p1x[0],n.p1x[1],n.p1y[0],n.p1y[1]],f=[n.p2x[0],n.p2x[1],n.p2y[0],n.p2y[1]],h=l.vals,g=p.Beam.val.concat([5]),y=[a.active,a.pars[0],a.pars[1],a.attenuate],m=[p.FOV.val,p.Speed.val],x=[v.weight,v.strength],S=[h.pSb,h.pS];uniforms={uTime:{value:0},uPath1:{value:u},uPath2:{value:f},uFog:{value:[0,o.val]},uColorA:{value:h.cA},uColorB:{value:h.cB},uColorC:{value:h.cC},uColorD:{value:h.cD},uColorE:{value:h.cE},uColorProps:{value:S},uHSV:{value:h.hsv},uBeamColor:{value:g},uLight1Color:{value:h.lg1},uStaticLight1:{value:n.l1},uResolution:{value:[e.x,e.y]},uSeed:{value:c},uTerrainOps:{value:x},uFog2Color:{value:h.f2},uHeightFog:{value:y},uHorizon:{value:i.far},uAO:{value:r.AO},uStaticLight2:{value:n.l2},uLight2Color:{value:h.lg2},uHSVHorz:{value:h.hsv2},uCurve:{value:r.Curve},uConfig:{value:m},uHSVStars:{value:h.hsv3}}}function createPostUniforms(e){uniformsPost={uResolution:{value:[e.x,e.y]},uTime:{value:0},uStep:{value:1},sInput:{value:null},uMask:{value:2.5}}}function getDimension(e){const t={Canvas:1.25,Adapt:window.innerHeight/window.innerWidth}[e];let c,r;return window.innerHeight>=t*window.innerWidth?(c=window.innerWidth,r=t*window.innerWidth):(r=window.innerHeight,c=window.innerHeight/t),{x:c,y:r}}function getRenderTarget(e,t){const c=new THREE.WebGLRenderTarget(t.x,t.y,{depthBuffer:!1,stencilBuffer:!1}),r=new THREE.OrthographicCamera(-1,1,1,-1,0,1),s=new THREE.Scene,n=new THREE.PlaneGeometry(2,2),i=new THREE.Mesh(n,e);return s.add(i),c.texture.wrapS=c.texture.wrapT=THREE.ClampToEdgeWrapping,{target:c,scene:s,camera:r}}function createScene(e){camera=new THREE.OrthographicCamera(-1,1,1,-1,0,1),scene=new THREE.Scene;const t=new THREE.PlaneGeometry(2,2),c=new THREE.Mesh(t,e);scene.add(c)}let camera,scene,renderer,main,uniforms,uniformsPost,aspect,fov,isAnimation=!0;function lowResCheck(){return window.matchMedia("only screen and (max-width: 760px)").matches}function init(){aspect="Canvas";let e=new Random,t=getDimension(aspect);const c=e.getSeeds();let r=Math.floor(parseInt(tokenData.tokenId)/1e6);const s=parseInt(tokenData.tokenId)%(1e6*r);let n=2*e.randBool(.5)-1;const i=c[1]*n,o=[i,3.141592*i*2],a=selectTerrain(c[2],c[3],null,s),v=selectDeformation(a.data,c.slice(4,7)),l=selectRarities(a,v,c.slice(7,17),s),p=l.config,u=l.terrain.data,f=l.terrain.name,h=l.paths,g=p.Surface,y=selectHorizon(u,c[17]),m=selectFogFar(u,c[18]),x=selectHeightFog(u,c[19]),S=selectBackground(u,c[20]),d=selectPalette(u,c.slice(21,24),g);renderer=new THREE.WebGL1Renderer({preserveDrawingBuffer:!0,depth:!1,antialias:!1,powerPreference:"high-performance"});const A=lowResCheck()?Math.min(2,window.devicePixelRatio):window.devicePixelRatio;renderer.setPixelRatio(A),renderer.setSize(t.x,t.y);renderer.autoClear=!1;const C=new THREE.Vector2;renderer.getDrawingBufferSize(C),createUniforms(t={x:C.width,y:C.height},s,o,u,f,h,y,m,x,v,d,p);const D=getShader(uniforms,v.val,f,S,x.active,y.active);main=getRenderTarget(D,t),createPostUniforms(t),uniformsPost.sInput.value=main.target.texture,createScene(getPostShader(uniformsPost,f));let E=document.createElement("div");document.body.appendChild(E),E.appendChild(renderer.domElement),onWindowResize(),window.addEventListener("resize",onWindowResize),document.addEventListener("keydown",onDocumentKeyDown,!1)}function updateFOV(e){uniforms.uConfig.value[0]=e}function updateSpeed(e){uniforms.uConfig.value[1]=e}function updateVignette(e){uniformsPost.uMask.value=e}function onDocumentKeyDown(e){var t=e.which;32==t?isAnimation=!isAnimation:49==t?updateSpeed(.33):50==t?updateSpeed(.5):51==t?updateSpeed(.74):52==t?updateSpeed(1):57==t?(aspect="Adapt",updateFOV(90),updateVignette(4),onWindowResize()):48==t&&(aspect="Canvas",updateFOV(127),updateVignette(2.5),onWindowResize())}function onWindowResize(){let e=getDimension(aspect);renderer.setSize(e.x,e.y);const t=new THREE.Vector2;renderer.getDrawingBufferSize(t),e={x:t.width,y:t.height},uniforms.uResolution={value:[e.x,e.y]},uniformsPost.uResolution={value:[e.x,e.y]},renderer.render(scene,camera),render()}function render(){renderer.setRenderTarget(main.target),renderer.render(main.scene,main.camera),renderer.setRenderTarget(null),renderer.render(scene,camera)}function animate(){requestAnimationFrame(animate);let e=performance.now()/1e3;isAnimation&&(uniforms.uTime.value=e,uniformsPost.uTime.value=e,render())}init(),render(),animate();