|
|
@ -4,13 +4,7 @@ var needsRedraw = false; |
|
|
|
var waifuImgs = new Array(); |
|
|
|
var waifuImgs = new Array(); |
|
|
|
var waifuColour = "#FFF"; |
|
|
|
var waifuColour = "#FFF"; |
|
|
|
|
|
|
|
|
|
|
|
// constant
|
|
|
|
var blurDecay, blurAmount, blurIterations, blurMin, blurMax, blurDelta; // set later
|
|
|
|
var blurIterations = 20; // quality
|
|
|
|
|
|
|
|
var blurMin = -blurIterations/2; |
|
|
|
|
|
|
|
var blurMax = blurIterations/2; |
|
|
|
|
|
|
|
var blurAlpha = 1/(blurIterations/2); |
|
|
|
|
|
|
|
var blurDecay = 25; |
|
|
|
|
|
|
|
var blurAmount = 15; |
|
|
|
|
|
|
|
// dynamic
|
|
|
|
// dynamic
|
|
|
|
var blurStart = 0; |
|
|
|
var blurStart = 0; |
|
|
|
var blurDistance = 0; |
|
|
|
var blurDistance = 0; |
|
|
@ -19,10 +13,16 @@ var yBlur = false; |
|
|
|
|
|
|
|
|
|
|
|
var blackout = false; |
|
|
|
var blackout = false; |
|
|
|
var shortBlackout = false; |
|
|
|
var shortBlackout = false; |
|
|
|
|
|
|
|
var blackoutColour = "#000"; // for the whiteout character
|
|
|
|
|
|
|
|
var blackoutTimeout; |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas = {}; |
|
|
|
waifuCanvas = {}; |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.init = function() { |
|
|
|
waifuCanvas.init = function() { |
|
|
|
|
|
|
|
waifuCanvas.blendMode = "hard-light"; |
|
|
|
|
|
|
|
waifuCanvas.setBlurAmount(15); |
|
|
|
|
|
|
|
waifuCanvas.setBlurIterations(31); |
|
|
|
|
|
|
|
waifuCanvas.setBlurDecay(25); |
|
|
|
canvas = document.getElementById("waifu").getContext("2d"); |
|
|
|
canvas = document.getElementById("waifu").getContext("2d"); |
|
|
|
window.addEventListener('resize', waifuCanvas.resize); |
|
|
|
window.addEventListener('resize', waifuCanvas.resize); |
|
|
|
waifuCanvas.resize(); |
|
|
|
waifuCanvas.resize(); |
|
|
@ -47,16 +47,22 @@ waifuCanvas.preload = function() { |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.redraw = function() { |
|
|
|
waifuCanvas.redraw = function() { |
|
|
|
var offset; // for centering/right/left align
|
|
|
|
var offset; // for centering/right/left align
|
|
|
|
|
|
|
|
var bOpacity; |
|
|
|
var width = canvas.canvas.width; |
|
|
|
var width = canvas.canvas.width; |
|
|
|
var image = waifuImgs[nCurrentWaifu]; |
|
|
|
var image = waifuImgs[nCurrentWaifu]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var cTime = audio.context.currentTime; |
|
|
|
// white BG for the hard light filter
|
|
|
|
// white BG for the hard light filter
|
|
|
|
canvas.globalAlpha = 1; |
|
|
|
canvas.globalAlpha = 1; |
|
|
|
canvas.globalCompositeOperation = "source-over"; |
|
|
|
canvas.globalCompositeOperation = "source-over"; |
|
|
|
if(blackout) { |
|
|
|
if(blackout) { |
|
|
|
canvas.fillStyle = "#000"; |
|
|
|
bOpacity = (cTime - blackoutStart)*10; // original is 3 frames, this is close
|
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
if(bOpacity > 1) { // optimise the draw
|
|
|
|
needsRedraw = false; |
|
|
|
canvas.fillStyle = blackoutColour; |
|
|
|
return; |
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
|
|
|
|
needsRedraw = false; |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
canvas.fillStyle = "#FFF"; |
|
|
|
canvas.fillStyle = "#FFF"; |
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
@ -75,15 +81,15 @@ waifuCanvas.redraw = function() { |
|
|
|
} |
|
|
|
} |
|
|
|
if(xBlur || yBlur) { |
|
|
|
if(xBlur || yBlur) { |
|
|
|
canvas.globalAlpha = blurAlpha; |
|
|
|
canvas.globalAlpha = blurAlpha; |
|
|
|
var delta = audio.context.currentTime - blurStart; |
|
|
|
var delta = cTime - blurStart; |
|
|
|
blurDistance = blurAmount * Math.exp(-blurDecay * delta); |
|
|
|
blurDistance = blurAmount * Math.exp(-blurDecay * delta); |
|
|
|
} |
|
|
|
} |
|
|
|
if(xBlur) { |
|
|
|
if(xBlur) { |
|
|
|
for(var i=blurMin; i<=blurMax; i++) { |
|
|
|
for(var i=blurMin; i<=blurMax; i+= blurDelta) { |
|
|
|
canvas.drawImage(image, Math.floor(blurDistance * i) + offset, 0); |
|
|
|
canvas.drawImage(image, Math.floor(blurDistance * i) + offset, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
} else if(yBlur) { |
|
|
|
} else if(yBlur) { |
|
|
|
for(var i=blurMin; i<=blurMax; i++) { |
|
|
|
for(var i=blurMin; i<=blurMax; i+= blurDelta) { |
|
|
|
canvas.drawImage(image, offset, Math.floor(blurDistance * i)); |
|
|
|
canvas.drawImage(image, offset, Math.floor(blurDistance * i)); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else { |
|
|
@ -92,13 +98,22 @@ waifuCanvas.redraw = function() { |
|
|
|
} |
|
|
|
} |
|
|
|
canvas.globalAlpha = 0.7; |
|
|
|
canvas.globalAlpha = 0.7; |
|
|
|
canvas.fillStyle = waifuColour; |
|
|
|
canvas.fillStyle = waifuColour; |
|
|
|
canvas.globalCompositeOperation = "hard-light"; |
|
|
|
canvas.globalCompositeOperation = waifuCanvas.blendMode; |
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
|
|
|
|
if(blackout) { |
|
|
|
needsRedraw = false; |
|
|
|
canvas.globalAlpha = bOpacity; |
|
|
|
|
|
|
|
canvas.fillStyle = blackoutColour; |
|
|
|
|
|
|
|
canvas.fillRect(0,0,width,720); |
|
|
|
|
|
|
|
needsRedraw = true; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
needsRedraw = false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.animationLoop = function() { |
|
|
|
waifuCanvas.animationLoop = function() { |
|
|
|
|
|
|
|
if(blackoutTimeout && audio.context.currentTime > blackoutTimeout) { |
|
|
|
|
|
|
|
waifuCanvas.clearBlackout(); |
|
|
|
|
|
|
|
} |
|
|
|
if(blurStart && blurDistance < 0.3) { |
|
|
|
if(blurStart && blurDistance < 0.3) { |
|
|
|
blurDistance = 0; |
|
|
|
blurDistance = 0; |
|
|
|
blurStart = 0; |
|
|
|
blurStart = 0; |
|
|
@ -121,7 +136,15 @@ waifuCanvas.setColour = function(colour) { |
|
|
|
needsRedraw = true; |
|
|
|
needsRedraw = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.blackout = function() { |
|
|
|
waifuCanvas.blackout = function(whiteout) { |
|
|
|
|
|
|
|
if (typeof(whiteout)==='undefined') whiteout = false; |
|
|
|
|
|
|
|
if(whiteout) { |
|
|
|
|
|
|
|
blackoutColour = "#FFF"; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
blackoutColour = "#000"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
blackoutTimeout = 0; // indefinite
|
|
|
|
|
|
|
|
blackoutStart = audio.context.currentTime; |
|
|
|
blackout = true; |
|
|
|
blackout = true; |
|
|
|
needsRedraw = true; |
|
|
|
needsRedraw = true; |
|
|
|
} |
|
|
|
} |
|
|
@ -129,9 +152,18 @@ waifuCanvas.blackout = function() { |
|
|
|
// for song changes
|
|
|
|
// for song changes
|
|
|
|
waifuCanvas.clearBlackout = function() { |
|
|
|
waifuCanvas.clearBlackout = function() { |
|
|
|
blackout = false; |
|
|
|
blackout = false; |
|
|
|
|
|
|
|
blackoutTimeout = 0; |
|
|
|
needsRedraw = true; |
|
|
|
needsRedraw = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.shortBlackout = function(beatTime) { |
|
|
|
|
|
|
|
waifuCanvas.blackout(); |
|
|
|
|
|
|
|
GetRandomWaifu(); |
|
|
|
|
|
|
|
blackoutTimeout = audio.context.currentTime + beatTime / 1.7; |
|
|
|
|
|
|
|
// looks better if we go right to black
|
|
|
|
|
|
|
|
blackoutStart = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.xBlur = function() { |
|
|
|
waifuCanvas.xBlur = function() { |
|
|
|
blurStart = audio.context.currentTime; |
|
|
|
blurStart = audio.context.currentTime; |
|
|
|
blurDistance = blurAmount; |
|
|
|
blurDistance = blurAmount; |
|
|
@ -147,3 +179,19 @@ waifuCanvas.yBlur = function() { |
|
|
|
yBlur = true; |
|
|
|
yBlur = true; |
|
|
|
needsRedraw = true; |
|
|
|
needsRedraw = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.setBlurDecay = function(decay) { |
|
|
|
|
|
|
|
blurDecay = decay; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.setBlurIterations = function(iterations) { |
|
|
|
|
|
|
|
blurIterations = iterations; |
|
|
|
|
|
|
|
blurDelta = blurAmount / blurIterations; |
|
|
|
|
|
|
|
blurAlpha = 1/(blurIterations/2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
waifuCanvas.setBlurAmount = function(amount) { |
|
|
|
|
|
|
|
blurAmount = amount; |
|
|
|
|
|
|
|
blurMin = -blurAmount/2; |
|
|
|
|
|
|
|
blurMax = blurAmount/2; |
|
|
|
|
|
|
|
} |