// ==UserScript== // @name DigDig.IO Glow Effect // @namespace http://tampermonkey.net/ // @version 0.1.1 // @description Makes the lava, diamonds, and gold glow in digdig.io // @author Zertalious (Zert) // @match *://digdig.io/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @require https://unpkg.com/three@latest/build/three.min.js // @require https://unpkg.com/three@latest/examples/js/postprocessing/EffectComposer.js // @require https://unpkg.com/three@latest/examples/js/postprocessing/RenderPass.js // @require https://unpkg.com/three@latest/examples/js/postprocessing/UnrealBloomPass.js // @require https://unpkg.com/three@latest/examples/js/postprocessing/ShaderPass.js // @require https://unpkg.com/three@latest/examples/js/shaders/LuminosityHighPassShader.js // @require https://unpkg.com/three@latest/examples/js/shaders/CopyShader.js // @downloadURL none // ==/UserScript== ( function () { const canvas = document.getElementById( 'canvas' ); canvas.style.opacity = '0'; const params = { exposure: 1, bloomStrength: 0.5, bloomThreshold: 0, bloomRadius: 0 }; const renderer = new THREE.WebGLRenderer( { alpha: true, preserveDrawingBuffer: true } ); renderer.domElement.style.position = 'absolute'; renderer.domElement.style.left = '0'; renderer.domElement.style.top = '0'; renderer.domElement.style.pointerEvents = 'none'; renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.insertBefore( renderer.domElement, canvas ); const scene = new THREE.Scene(); const camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 100 ); camera.position.z = 5; const texture = new THREE.CanvasTexture( canvas ); const maskMaterial = new THREE.MeshBasicMaterial( { map: texture } ); maskMaterial.onBeforeCompile = function ( shader ) { const diamond = '#31a59e'; const gold = '#a59e15'; const lava = '#a61906'; const array = [ diamond, gold, lava ]; let text = ''; for ( let i = 0; i < array.length; i ++ ) { const hex = array[ i ]; const r = parseInt( hex.slice( 1, 3 ), 16 ) / 255; const g = parseInt( hex.slice( 3, 5 ), 16 ) / 255; const b = parseInt( hex.slice( 5, 7 ), 16 ) / 255; text += 'length(vec3(' + r + ', ' + g + ', ' + b + ') - gl_FragColor.rgb) > 0.1'; if ( i < array.length - 1 ) { text += ' && '; } } console.log( { text } ); shader.fragmentShader = shader.fragmentShader.replace( '}', 'if (' + text + ') discard;}' ); } const mesh = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), maskMaterial ); scene.add( mesh ); const renderScene = new THREE.RenderPass( scene, camera ); const bloomPass = new THREE.UnrealBloomPass( new THREE.Vector2( window.innerWidth, window.innerHeight ), 1.5, 0.4, 0.85 ); bloomPass.threshold = params.bloomThreshold; bloomPass.strength = params.bloomStrength; bloomPass.radius = params.bloomRadius; const finalPass = new THREE.ShaderPass( new THREE.ShaderMaterial( { uniforms: { baseTexture: { value: null }, originalTexture: { value: texture } }, vertexShader: ` varying vec2 vUv; void main() { vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); } `, fragmentShader: ` uniform sampler2D baseTexture; uniform sampler2D originalTexture; varying vec2 vUv; void main() { gl_FragColor = ( texture2D( baseTexture, vUv ) + vec4( 1.0 ) * texture2D( originalTexture, vUv ) ); } `, defines: {} } ), "baseTexture" ); finalPass.needsSwap = true; composer = new THREE.EffectComposer( renderer ); composer.addPass( renderScene ); composer.addPass( bloomPass ); composer.addPass( finalPass ); window.addEventListener( 'resize', function () { const width = window.innerWidth; const height = window.innerHeight; camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize( width, height ); composer.setSize( width, height ); } ); function animate() { bloomPass.strength = ( Math.sin( Date.now() / 150 ) * 0.5 + 0.5 ) * 0.75 + 0.5; requestAnimationFrame( animate ); texture.needsUpdate = true; composer.render(); } animate(); } )();