KaoSDlanor

KaoShader library

Mar 7th, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ($ => {
  2.  
  3.   $.fn.KaoShader = function(options) {
  4.     return this
  5.       .filter('canvas:not(.KaoShader)')
  6.       .each((i,elem) => {
  7.         var default_options = {
  8.           shaderV : `
  9.             attribute vec3 aVertexPosition;
  10.             varying vec2 c_pos;
  11.             varying vec2 a_pos;
  12.  
  13.             void main(void) {
  14.                 gl_Position = vec4(aVertexPosition, 1.0);
  15.                 c_pos = vec2(gl_Position.xy);
  16.                 a_pos = vec2(gl_Position.xy) / 2. + vec2(.5,.5);
  17.             }
  18.           `,
  19.           shaderF : `
  20.  
  21.           `,
  22.           vertices : [
  23.             -1.0, -1.0,  0.0,
  24.              1.0, -1.0,  0.0,
  25.              1.0,  1.0,  0.0,
  26.             -1.0,  1.0,  0.0,
  27.             -1.0, -1.0,  0.0,
  28.           ],
  29.           resolution : [],
  30.           clear_color : [0.0, 0.0, 0.0, 1.0],
  31.           uniforms : {},
  32.         };
  33.         var data = $.extend(true,{},default_options,options);
  34.  
  35.         data.canvas = elem;
  36.         data.gl = data.canvas.getContext('webgl');
  37.  
  38.         var vertexShader = data.gl.createShader(data.gl.VERTEX_SHADER);
  39.         data.gl.shaderSource(vertexShader,data.shaderV);
  40.         data.gl.compileShader(vertexShader);
  41.         if (!data.gl.getShaderParameter(vertexShader, data.gl.COMPILE_STATUS)) {
  42.             throw new Error(`Error initializing vertex shader\n${data.gl.getShaderInfoLog(vertexShader)}`);
  43.         }
  44.  
  45.         var fragmentShader = data.gl.createShader(data.gl.FRAGMENT_SHADER);
  46.         data.gl.shaderSource(fragmentShader,data.shaderF);
  47.         data.gl.compileShader(fragmentShader);
  48.         if (!data.gl.getShaderParameter(fragmentShader, data.gl.COMPILE_STATUS)) {
  49.             throw new Error(`Error initializing fragment shader\n${data.gl.getShaderInfoLog(fragmentShader)}`);
  50.         }
  51.  
  52.         data.program = data.gl.createProgram();
  53.         data.gl.attachShader(data.program, vertexShader);
  54.         data.gl.attachShader(data.program, fragmentShader);
  55.         data.gl.linkProgram(data.program);
  56.  
  57.         if (!data.gl.getProgramParameter(data.program, data.gl.LINK_STATUS)) {
  58.             throw new Error("Could not initialise shaders");
  59.         }
  60.  
  61.         data.gl.useProgram(data.program);
  62.         data.gl.clearColor(...data.clear_color);
  63.         data.gl.enable(data.gl.DEPTH_TEST);
  64.  
  65.         var vertexPositionAttribute = data.gl.getAttribLocation(data.program, "aVertexPosition");
  66.         data.gl.enableVertexAttribArray(vertexPositionAttribute);
  67.         buffer = data.gl.createBuffer();
  68.         data.gl.bindBuffer(data.gl.ARRAY_BUFFER, buffer);
  69.  
  70.         data.gl.bufferData(data.gl.ARRAY_BUFFER, new Float32Array(data.vertices), data.gl.STATIC_DRAW);
  71.         data.gl.vertexAttribPointer(vertexPositionAttribute, 3, data.gl.FLOAT, false, 0, 0);
  72.  
  73.         data.init_uniform = name => data.uniform_locations[name] = data.gl.getUniformLocation(data.program,name);
  74.         data.uniform_locations = {};
  75.         Object.keys(data.uniforms).forEach(data.init_uniform);
  76.  
  77.         $(data.canvas).addClass('KaoShader')
  78.                       .data('KaoShader',data)
  79.                       .KaoShader_input(data.uniforms)
  80.                       .KaoShader_resize()
  81.                       .KaoShader_draw();
  82.       });
  83.   };
  84.  
  85.   $.fn.KaoShader_input = function(uniforms = {}) {
  86.     return this
  87.       .filter('canvas.KaoShader')
  88.       .each((i,elem) => {
  89.         var data = $(elem).data('KaoShader');
  90.  
  91.         data.uniforms = uniforms;
  92.         Object.keys(data.uniforms).forEach(name => {
  93.           data.gl[$.isArray(data.uniforms[name]) ? 'uniform1fv' : 'uniform1f'](data.uniform_locations[name],data.uniforms[name]);
  94.         });
  95.       });
  96.   };
  97.  
  98.   $.fn.KaoShader_resize = function() {
  99.     return this
  100.       .filter('canvas.KaoShader')
  101.       .each((i,elem) => {
  102.         var data = $(elem).data('KaoShader');
  103.  
  104.         data.canvas.width = data.resolution[0] || $(data.canvas).outerWidth();
  105.         data.canvas.height = data.resolution[1] || $(data.canvas).outerHeight();
  106.  
  107.         data.gl.viewport(0,0,data.canvas.width,data.canvas.height);
  108.       });
  109.   };
  110.  
  111.   $.fn.KaoShader_draw = function() {
  112.     return this
  113.       .filter('canvas.KaoShader')
  114.       .each((i,elem) => {
  115.         var data = $(elem).data('KaoShader');
  116.  
  117.         data.gl.clear(data.gl.COLOR_BUFFER_BIT | data.gl.DEPTH_BUFFER_BIT);
  118.         data.gl.drawArrays(data.gl.TRIANGLE_STRIP, 0, data.vertices.length  / 3);
  119.       });
  120.   };
  121.  
  122.   $(window).on('resize',() => {
  123.     $('canvas.KaoShader').KaoShader_resize().KaoShader_draw();
  124.   });
  125. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment