Skip to content

Instantly share code, notes, and snippets.

@paultreny
Created April 10, 2013 20:38
Show Gist options
  • Save paultreny/5358231 to your computer and use it in GitHub Desktop.
Save paultreny/5358231 to your computer and use it in GitHub Desktop.
A CodePen by Paul Reny. RESIST - (forked from GLITCH)
<body>
<div id="wrapper">
<canvas id="stage"></canvas>
</div>
<script src="dat.gui.min.js"></script>
<script src="resist.js"></script>
</body>
/* Based off of work on http://retromodular.com/ */
(function(){
var glitcher = {
init: function () {
setTimeout((function () {
this.canvas = document.getElementById('stage');
this.context = this.canvas.getContext('2d');
this.initOptions();
this.resize();
this.tick();
}).bind(this), 100);
},
initOptions: function () {
var gui = new dat.GUI(),
current = gui.addFolder('Current'),
controls = gui.addFolder('Controls');
this.width = document.documentElement.offsetWidth;
this.height = window.innerHeight;
this.font = '900 12vw Orbitron'; /*this.font = 'bold 12vw Helvetica';*/
this.context.font = this.font;
this.text = "RESIST"
/* .split("").join(String.fromCharCode(8201)); */
this.textWidth = (this.context.measureText(this.text)).width;
this.fps = 60;
this.channel = 0; // 0 = red, 1 = green, 2 = blue
this.compOp = 'lighter'; // CompositeOperation = lighter || darker || xor
this.phase = 0.0;
this.phaseStep = 0.05; //determines how often we will change channel and amplitude
this.amplitude = 0.0;
this.amplitudeBase = 2.0;
this.amplitudeRange = 2.0;
this.alphaMin = 0.8;
this.glitchAmplitude = 20.0;
this.glitchThreshold = 0.9;
this.scanlineBase = 40;
this.scanlineRange = 40;
this.scanlineShift = 15;
current.add(this, 'channel', 0, 2).listen();
current.add(this, 'phase', 0, 1).listen();
current.add(this, 'amplitude', 0, 5).listen();
var text = controls.add(this, 'text');
text.onChange((function (value) {
this.textWidth = (this.context.measureText(this.text)).width;
}).bind(this));
controls.add(this, 'fps', 1, 60);
controls.add(this, 'phaseStep', 0, 1);
controls.add(this, 'alphaMin', 0, 1);
controls.add(this, 'amplitudeBase', 0, 5);
controls.add(this, 'amplitudeRange', 0, 5);
controls.add(this, 'glitchAmplitude', 0, 100);
controls.add(this, 'glitchThreshold', 0, 1);
controls.open();
// gui.close();
//gui.add(fizzyText, 'noiseStrength', 0, 100).listen();
},
tick: function () {
setTimeout((function () {
this.phase += this.phaseStep;
if (this.phase > 1) {
this.phase = 0.0;
this.channel = (this.channel === 2) ? 0 : this.channel + 1;
this.amplitude = this.amplitudeBase + (this.amplitudeRange * Math.random());
}
this.render();
this.tick();
}).bind(this), 1000 / this.fps);
},
render: function () {
var x0 = this.amplitude * Math.sin((Math.PI * 2) * this.phase) >> 0,
x1, x2, x3;
if (Math.random() >= this.glitchThreshold) {
x0 *= this.glitchAmplitude;
}
x1 = this.width - this.textWidth >> 1;
x2 = x1 + x0;
x3 = x1 - x0;
this.context.clearRect(0, 0, this.width, this.height);
this.context.globalAlpha = this.alphaMin + ((1 - this.alphaMin) * Math.random());
switch (this.channel) {
case 0:
this.renderChannels(x1, x2, x3);
break;
case 1:
this.renderChannels(x2, x3, x1);
break;
case 2:
this.renderChannels(x3, x1, x2);
break;
}
// if (Math.floor(Math.random() * 2)) {
this.renderScanline();
// }
},
renderChannels: function (x1, x2, x3) {
this.context.font = this.font;
this.context.fillStyle = "rgb(255,0,0)";
this.context.fillText(this.text, x1, this.height / 2);
this.context.globalCompositeOperation = this.compOp;
this.context.fillStyle = "rgb(0,255,0)";
this.context.fillText(this.text, x2, this.height / 2);
this.context.fillStyle = "rgb(0,0,255)";
this.context.fillText(this.text, x3, this.height / 2);
},
renderScanline: function () {
var y = this.height * Math.random() >> 0,
o = this.context.getImageData(0, y, this.width, 1),
d = o.data,
i = d.length,
s = this.scanlineBase + this.scanlineRange * Math.random() >> 0,
x = -this.scanlineShift + this.scanlineShift * 2 * Math.random() >> 0;
while (i-- > 0) {
d[i] += s;
}
this.context.putImageData(o, x, y);
},
resize: function () {
if (this.canvas) {
this.canvas.width = document.documentElement.offsetWidth;
this.canvas.height = window.innerHeight;
}
}
};
document.onload = glitcher.init();
window.onresize = glitcher.resize();
})();
body {
background: black;
overflow: hidden;
margin: 0;
padding: 0;
}
#wrapper {
width: 100%;
/*max-width: 1200px;*/
padding: 0;
margin: 0;
text-align: center;
}
img {
display: none;
}
canvas {
/*box-sizing: border-box;*/
padding: 40px 100px 0 0;
margin: 10px auto 0;
text-align: center;
max-width: 100%;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment