DigDig.IO 3D Effect

3D effect for DigDig.IO

À partir de 2021-07-11. Voir la dernière version.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         DigDig.IO 3D Effect
// @namespace    http://tampermonkey.net/
// @version      0.1.1
// @description  3D effect for DigDig.IO
// @author       Zertalious (Zert)
// @match        *://digdig.io/
// @icon         https://www.google.com/s2/favicons?domain=digdig.io
// @require      https://unpkg.com/three@latest/build/three.min.js
// ==/UserScript==

( function () {

	const canvas = document.getElementById( 'canvas' );
	canvas.style.opacity = '0';

	CanvasRenderingContext2D.prototype.fillRect = new Proxy( CanvasRenderingContext2D.prototype.fillRect, {
		apply( target, thisArgs, args ) {

			if ( thisArgs.globalAlpha < 1 && args[ 3 ] > 50 ) {

				return;

			}

			return Reflect.apply( ...arguments );

		}
	} );

	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.PerspectiveCamera( 60, 1, 0.1, 1000 );

	camera.position.z = Math.sin( Math.PI / 3 );

	const texture = new THREE.CanvasTexture( canvas );
	texture.minFilter = texture.magFilter = THREE.NearestFilter;

	const material = new THREE.RawShaderMaterial( {
		vertexShader: `

		precision mediump float;

		attribute vec3 position;
		attribute vec2 uv;

		uniform mat4 projectionMatrix;
		uniform mat4 modelViewMatrix;

		uniform vec3 ground;
		uniform sampler2D texture;
		uniform float groundDepth;

		varying vec2 vUv;
		varying float vDepth;

		void main() {

			vec4 p = vec4( position, 1.0 );

			vec3 texColor = texture2D( texture, uv ).rgb;

			if ( length( ground - texColor ) < 0.05 ) p.z -= groundDepth;

			vDepth = - p.z;

			gl_Position = projectionMatrix * modelViewMatrix * p;
			vUv = uv;

		}

		`,
		fragmentShader: `

		precision mediump float;

		uniform sampler2D texture;
		uniform vec3 ground;
		uniform float groundDepth;

		varying vec2 vUv;
		varying float vDepth;

		void main() {

			if ( vDepth > 0.0 && vDepth < groundDepth ) {

				gl_FragColor = vec4( ground * 0.8, 1.0 );

			} else {

				gl_FragColor = texture2D( texture, vUv );

			}

		}

		`,
		uniforms: {
			texture: { value: texture },
			ground: { value: new THREE.Color( '#522e00' ) },
			groundDepth: { value: 0.10 }
		}
	} );

	scene.background = material.uniforms.ground.value;

	const mesh = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1, 500, 500 ), material );
	scene.add( mesh );

	window.addEventListener( 'resize', function () {

		renderer.setSize( window.innerWidth, window.innerHeight );

		renderer.render( scene, camera );

	} );

	function animate() {

		requestAnimationFrame( animate );

		texture.needsUpdate = true;

		renderer.render( scene, camera );

	}

	animate();

} )();