<canvas id="canvas" style="position : absolute; top : 0px; left : 0px;"></canvas>
<script type="text/javascript" src="http://sheepeuh.com/rain/dat.gui.js"></script>
<div style="position : absolute; bottom : 0px; left : 0px; margin : 20px; padding : 5px; background-color:#ce3635;">
  <a href="http://sheepeuh.com" style="color: white; text-decoration : none; font-family: 'Lato', sans-serif; text-shadow: 1px 1px 1px black;">Me</a>
</div>
requestAnimFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000/60);
};
})();

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

var width = 0;
var height = 0;

window.onresize = function onresize() {
	width = canvas.width = window.innerWidth;
	height = canvas.height = window.innerHeight;
}

window.onresize();

var mouse = {
	X : 0,
	Y : 0
}

window.onmousemove = function onmousemove(event) {
	mouse.X = event.clientX;
	mouse.Y = event.clientY;
}

var particules = [];
var gouttes = [];
var nombrebase = 5;
var nombreb = 2;

var controls = {
	rain : 2,
	Object : "Nothing",
	alpha : 1,
	color : 200,
	auto : false,
	opacity : 1,
	saturation : 100,
	lightness : 50,
	back : 100,
	red : 0,
	green : 0,
	blue : 0,
	multi : false,
	speed : 2
};

function Rain(X, Y, nombre) {
	if (!nombre) {
		nombre = nombreb;
	}
	while (nombre--) {
		particules.push( 
		{
			vitesseX : (Math.random() * 0.25),
			vitesseY : (Math.random() * 9) + 1,
			X : X,
			Y : Y,
			alpha : 1,
			couleur : "hsla(" + controls.color + "," + controls.saturation + "%, " + controls.lightness + "%," + controls.opacity + ")",
		})
	}
}

function explosion(X, Y, couleur, nombre) {
	if (!nombre) {
		nombre = nombrebase;
	}
	while (nombre--) {
		gouttes.push( 
		{
			vitesseX : (Math.random() * 4-2	),
			vitesseY : (Math.random() * -4 ),
			X : X,
			Y : Y,
			radius : 0.65 + Math.floor(Math.random() *1.6),
			alpha : 1,
			couleur : couleur
		})
	}
}

function rendu(ctx) {

	if (controls.multi == true) {
		controls.color = Math.random()*360;
	}

	ctx.save();
	ctx.fillStyle = 'rgba('+controls.red+','+controls.green+','+controls.blue+',' + controls.alpha + ')';
	ctx.fillRect(0, 0, width, height);
	
	var particuleslocales = particules;
	var goutteslocales = gouttes;
	var tau = Math.PI * 2;

	for (var i = 0, particulesactives; particulesactives = particuleslocales[i]; i++) {
			
		ctx.globalAlpha = particulesactives.alpha;
		ctx.fillStyle = particulesactives.couleur;
		ctx.fillRect(particulesactives.X, particulesactives.Y, particulesactives.vitesseY/4, particulesactives.vitesseY);
	}

	for (var i = 0, gouttesactives; gouttesactives = goutteslocales[i]; i++) {
			
		ctx.globalAlpha = gouttesactives.alpha;
		ctx.fillStyle = gouttesactives.couleur;
		
		ctx.beginPath();
		ctx.arc(gouttesactives.X, gouttesactives.Y, gouttesactives.radius, 0, tau);
		ctx.fill();
	}
		ctx.strokeStyle = "white";
		ctx.lineWidth   = 2;

		if (controls.Object == "Umbrella") {
			ctx.beginPath();
			ctx.arc(mouse.X, mouse.Y+10, 138, 1 * Math.PI, 2 * Math.PI, false);
			ctx.lineWidth = 3;
			ctx.strokeStyle = "hsla(0,100%,100%,1)";
			ctx.stroke();
		}
		if (controls.Object == "Cup") {
			ctx.beginPath();
			ctx.arc(mouse.X, mouse.Y+10, 143, 1 * Math.PI, 2 * Math.PI, true);
			ctx.lineWidth = 3;
			ctx.strokeStyle = "hsla(0,100%,100%,1)";
			ctx.stroke();
		}
		if (controls.Object == "Circle") {
			ctx.beginPath();
			ctx.arc(mouse.X, mouse.Y+10, 138, 1 * Math.PI, 3 * Math.PI, false);
			ctx.lineWidth = 3;
			ctx.strokeStyle = "hsla(0,100%,100%,1)";
			ctx.stroke();
		}
	ctx.restore();
	
	if (controls.auto) {
		controls.color += controls.speed;
		if (controls.color >=360) {
			controls.color = 0;
		}
	}
}

function update() {

	var particuleslocales = particules;
	var goutteslocales = gouttes;
	
	for (var i = 0, particulesactives; particulesactives = particuleslocales[i]; i++) {
		particulesactives.X += particulesactives.vitesseX;
		particulesactives.Y += particulesactives.vitesseY+5;
		if (particulesactives.Y > height-15) {
			particuleslocales.splice(i--, 1);
			explosion(particulesactives.X, particulesactives.Y, particulesactives.couleur);
		}
		var umbrella = (particulesactives.X - mouse.X)*(particulesactives.X - mouse.X) + (particulesactives.Y - mouse.Y)*(particulesactives.Y - mouse.Y);
			if (controls.Object == "Umbrella") {
				if (umbrella < 20000 && umbrella > 10000 && particulesactives.Y < mouse.Y) {
					explosion(particulesactives.X, particulesactives.Y, particulesactives.couleur);
					particuleslocales.splice(i--, 1);
				}
			}
			if (controls.Object == "Cup") {
				if (umbrella > 20000 && umbrella < 30000 && particulesactives.X+138 > mouse.X && particulesactives.X-138 < mouse.X && particulesactives.Y > mouse.Y) {
					explosion(particulesactives.X, particulesactives.Y, particulesactives.couleur);
					particuleslocales.splice(i--, 1);
				}
			}
			if (controls.Object == "Circle") {
				if (umbrella < 20000) {
					explosion(particulesactives.X, particulesactives.Y, particulesactives.couleur);
					particuleslocales.splice(i--, 1);
				}
			}
	}

	for (var i = 0, gouttesactives; gouttesactives = goutteslocales[i]; i++) {
		gouttesactives.X += gouttesactives.vitesseX;
		gouttesactives.Y += gouttesactives.vitesseY;
		gouttesactives.radius -= 0.075;
		if (gouttesactives.alpha > 0) {
			gouttesactives.alpha -= 0.005;
		} else {
			gouttesactives.alpha = 0;
		}
		if (gouttesactives.radius < 0) {
			goutteslocales.splice(i--, 1);
		}
	}

	var i = controls.rain;
	while (i--) {
		Rain(Math.floor((Math.random()*width)), -15);
	}
}

function Screenshot() {
	window.open(canvas.toDataURL());
}

window.onload = function() {
	var gui = new dat.GUI();
	gui.add(controls, 'rain', 1, 10).name("Rain intensity").step(1);
	gui.add(controls, 'alpha', 0.1, 1).name("Alpha").step(0.1);
	gui.add(controls, 'color', 0, 360).name("Color").step(1).listen();
	gui.add(controls, 'auto').name("Automatic color");
	gui.add(controls, 'speed', 1, 10).name("Speed color").step(1);
	gui.add(controls, 'multi').name("Multicolor");
	gui.add(controls, 'saturation', 0, 100).name("Saturation").step(1);
	gui.add(controls, 'lightness', 0, 100).name("Lightness").step(1);
	gui.add(controls, 'opacity', 0.0, 1).name("Opacity").step(0.1);
	gui.add(controls, 'Object', ['Nothing','Circle','Umbrella', 'Cup']);
	gui.add(window, 'Screenshot');
	var Background = gui.addFolder('Background color');
	Background.add(controls, 'red', 0, 255).step(1);
	Background.add(controls, 'green', 0, 255).step(1);
	Background.add(controls, 'blue', 0, 255).step(1);
};

(function boucle() {
	requestAnimFrame(boucle);
	update();
	rendu(ctx);
})();

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.