You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
0x40-web/waifuCanvas.js

149 lines
3.7 KiB

var canvas;
var needsRedraw = false;
var waifuImgs = new Array();
var waifuColour = "#FFF";
// constant
var blurIterations = 20; // quality
var blurMin = -blurIterations/2;
var blurMax = blurIterations/2;
var blurAlpha = 1/(blurIterations/2);
var blurDecay = 25;
var blurAmount = 15;
// dynamic
var blurStart = 0;
var blurDistance = 0;
var xBlur = false;
var yBlur = false;
var blackout = false;
var shortBlackout = false;
waifuCanvas = {};
waifuCanvas.init = function() {
canvas = document.getElementById("waifu").getContext("2d");
window.addEventListener('resize', waifuCanvas.resize);
waifuCanvas.resize();
canvas.drawImage(waifuImgs[0], 0, 0);
}
waifuCanvas.resize = function() {
// height is constant 720px, we expand width to suit
var ratio = window.innerWidth / window.innerHeight;
canvas.canvas.width = 720 * ratio + 1;
needsRedraw = true;
}
waifuCanvas.preload = function() {
for(var waifu in waifus) {
newImg = new Image();
newImg.onload = onFileLoad;
newImg.src = 'images/' + waifus[waifu].file;
waifuImgs[waifu] = newImg;
}
}
waifuCanvas.redraw = function() {
var offset; // for centering/right/left align
var width = canvas.canvas.width;
var image = waifuImgs[nCurrentWaifu];
// white BG for the hard light filter
canvas.globalAlpha = 1;
canvas.globalCompositeOperation = "source-over";
if(blackout) {
canvas.fillStyle = "#000";
canvas.fillRect(0,0,width,720);
needsRedraw = false;
return;
} else {
canvas.fillStyle = "#FFF";
canvas.fillRect(0,0,width,720);
}
switch(waifus[nCurrentWaifu].align) {
case "left":
offset = 0;
break;
case "right":
offset = width - image.width;
break;
default:
offset = width/2 - image.width/2;
break;
}
if(xBlur || yBlur) {
canvas.globalAlpha = blurAlpha;
var delta = audio.context.currentTime - blurStart;
blurDistance = blurAmount * Math.exp(-blurDecay * delta);
}
if(xBlur) {
for(var i=blurMin; i<=blurMax; i++) {
canvas.drawImage(image, Math.floor(blurDistance * i) + offset, 0);
}
} else if(yBlur) {
for(var i=blurMin; i<=blurMax; i++) {
canvas.drawImage(image, offset, Math.floor(blurDistance * i));
}
} else {
canvas.globalAlpha = 1;
canvas.drawImage(image, offset, 0);
}
canvas.globalAlpha = 0.7;
canvas.fillStyle = waifuColour;
canvas.globalCompositeOperation = "hard-light";
canvas.fillRect(0,0,width,720);
needsRedraw = false;
}
waifuCanvas.animationLoop = function() {
if(blurStart && blurDistance < 0.3) {
blurDistance = 0;
blurStart = 0;
xBlur = yBlur = false;
waifuCanvas.redraw();
} else if(blurStart) {
waifuCanvas.redraw();
} else if(needsRedraw){
waifuCanvas.redraw();
}
}
waifuCanvas.newWaifu = function() {
GetRandomWaifu(); // increments the waifu counter
needsRedraw = true;
}
waifuCanvas.setColour = function(colour) {
waifuColour = colour;
needsRedraw = true;
}
waifuCanvas.blackout = function() {
blackout = true;
needsRedraw = true;
}
// for song changes
waifuCanvas.clearBlackout = function() {
blackout = false;
needsRedraw = true;
}
waifuCanvas.xBlur = function() {
blurStart = audio.context.currentTime;
blurDistance = blurAmount;
xBlur = true;
yBlur = false;
needsRedraw = true;
}
waifuCanvas.yBlur = function() {
blurStart = audio.context.currentTime;
blurDistance = blurAmount;
xBlur = false;
yBlur = true;
needsRedraw = true;
}