glre 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("refr"),r=require("reev");function n(e,r){for(var n=e[0],t=0,i=r.length;t<i;t+=1)n+=r[t]+e[t+1];return n}function t(e){return Array.isArray(e)&&"string"==typeof e[0]}function i(e,r,n){return void 0===n&&(n=""),""!==n&&!e.includes(n)||function(e,r){return e=e.replace(/\s+/g,""),r=r.replace(/\s+/g,""),e.includes(r)}(e,r)?e:r+e}function o(e,r){void 0===r&&(r=!1);var n="number"==typeof e?0:e.length;return n?r?["uniformMatrix"+(n=Math.sqrt(n)<<0)+"fv","mat"+n]:["uniform"+n+"fv","vec"+n]:["uniform1f","float"]}function a(e,r,n){var t=e.createShader(n);if(e.shaderSource(t,r),e.compileShader(t),e.getShaderParameter(t,e.COMPILE_STATUS))return t;console.warn(e.getShaderInfoLog(t))}function u(e,r,n,t,i){e.bindBuffer(e.ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array(r),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),n}}(e,t)),e.enableVertexAttribArray(n),e.vertexAttribPointer(n,r,e.FLOAT,!1,0,0),i&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(r),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),n}}(e,i))}var f=function(e){var n=r.event();return n({mount:function(){e.int&&(e.frag=i(e.frag,"precision "+e.int+" int;")),e.float&&(e.frag=i(e.frag,"precision "+e.float+" float;")),e.sampler2D&&(e.frag=i(e.frag,"precision "+e.sampler2D+" sampler2D;")),e.samplerCube&&(e.frag=i(e.frag,"precision "+e.samplerCube+" samplerCube;"));var r=e.el=document.getElementById(e.id),t=e.gl=null==r?void 0:r.getContext("webgl"),o=a(t,e.frag,t.FRAGMENT_SHADER),u=a(t,e.vert,t.VERTEX_SHADER);e.pg=function(e,r,n){var t=e.createProgram();return e.attachShader(t,r),e.attachShader(t,n),e.linkProgram(t),e.getProgramParameter(t,e.LINK_STATUS)?(e.useProgram(t),t):(console.log(e.getProgramInfoLog(t)),null)}(t,u,o),window.addEventListener("resize",n.resize),window.addEventListener("mousemove",n.mousemove),n.resize();var f=performance.now(),l=0,c=0;e.setFrame((function(){return l=f,f=performance.now()/1e3,c=f-l,e.setUniform({iTime:f,iPrevTime:l,iDeltaTime:c}),!0})),e.frame()},clean:function(){window.removeEventListener("resize",n.resize),window.removeEventListener("mousemove",n.mousemove),e.frame.cancel()},mousemove:function(r){var n=r.clientX,t=r.clientY,i=e.size,o=i[0],a=i[1];e.mouse[0]=(n-o/2)/(o/2),e.mouse[1]=-(t-a/2)/(a/2),e.setUniform("iMouse",e.mouse)},resize:function(r,n,t){void 0===n&&(n=window.innerWidth),void 0===t&&(t=window.innerHeight),e.size[0]=e.el.width=n,e.size[1]=e.el.height=t,e.setUniform("iResolution",e.size)},load:function(r,n){e.setFrame((function(){var r=e.activeUnit(n.alt),t=e.location(n.alt),i=function(e,r){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(t,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,i),!0}))}))}})},l=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],c="\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",s="\n uniform vec2 resolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / resolution), 0, 1);\n }\n",m=function(i){var a=function e(r){for(var i=arguments.length,o=new Array(i>1?i-1:0),a=1;a<i;a++)o[a-1]=arguments[a];return t(r)&&(r=n(r,o)),"string"==typeof r&&(e.frag=r),"function"==typeof r&&e.frame.mount(r),e};a.id="myCanvas",a.frag=s,a.vert=c,a.size=[0,0],a.mouse=[0,0],a.count=6,a.uniformHeader=[],a.attributeHeader=[];var m=a.event=f(a),v=a.frame=e.frame();a.lastActiveUnit=0,a.activeUnit=r.nested((function(){return a.lastActiveUnit++})),a.vertexStride=r.nested((function(e,r,n){var t=n?Math.max.apply(Math,n)+1:a.count,i=r.length/t<<0;return a.attributeHeader.push([e,"vertex vec"+i+" "+e+";"]),i})),a.uniformType=r.nested((function(e,r,n){var t=o(r,n),i=t[0],u=t[1];return a.uniformHeader.push([e,"uniform "+u+" "+e+";"]),i})),a.location=r.nested((function(e,r){var n,t;return void 0===r&&(r=!1),r?null==(n=a.gl)?void 0:n.getAttribLocation(a.pg,e):null==(t=a.gl)?void 0:t.getUniformLocation(a.pg,e)})),a.setDpr=function(){return void m.resize()||a},a.setSize=function(){return void m.resize()||a},a.setFrame=function(e){return void v.mount(e)||a},a.setMount=function(e){return void m({mount:e})||a},a.setClean=function(e){return void m({clean:e})||a},a.setConfig=r.durable((function(e,r){a[e]=r}),a),a.setUniform=r.durable((function(e,r,n){void 0===n&&(n=!1);var t=a.uniformType(e,r,n);a.setFrame((function(){n?a.gl[t](a.location(e),!1,r):a.gl[t](a.location(e),r)}))}),a),a.setAttribute=r.durable((function(e,r,n){var t=a.vertexStride(e,r,n);a.setFrame((function(){u(a.gl,t,a.location(e,!0),r,n)}))}),a),a.setTexture=r.durable((function(e,r){var n=new Image;n.addEventListener("load",(function(e){return m.load(e,n)}),!1),Object.assign(n,{src:r,alt:e,crossOrigin:"anonymous"})}),a),a.mount=function(){return m.mount.apply(m,arguments)},a.clean=function(){return m.clean.apply(m,arguments)},a.clear=function(e){return a.gl.clear(a.gl[e||"COLOR_BUFFER_BIT"])},a.viewport=function(e){var r;return(r=a.gl).viewport.apply(r,[0,0].concat(e||a.size))},a.drawArrays=function(e){return void 0===e&&(e="TRIANGLES"),a.gl.drawArrays(a.gl[e],0,a.count)},a.drawElements=function(e,r){return void 0===e&&(e="TRIANGLES"),void 0===r&&(r="UNSIGNED_SHORT"),a.gl.drawElements(a.gl[e],a.count,a.gl[r],0)};for(var d=arguments.length,g=new Array(d>1?d-1:0),E=1;E<d;E++)g[E-1]=arguments[E];return t(i)&&(i=n(i,g)),"string"==typeof i&&(a.frag=i),"object"==typeof i&&a.setConfig(i),6===a.count&&a.setAttribute({a_position:l}),a};m.default=null,exports.default=m,exports.gl=m;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("reev"),r=require("refr");function t(e,r,t){var n=e.createShader(t);if(e.shaderSource(n,r),e.compileShader(n),e.getShaderParameter(n,e.COMPILE_STATUS))return n;console.warn(e.getShaderInfoLog(n))}var n=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],i=performance.now(),o=0,a=0,u=e.event({vertex:"\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",fragment:"\n precision mediump float;\n uniform vec2 iResolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);\n }\n",size:[0,0],mouse:[0,0],count:6,counter:0,init:function(i){var o=u.gl,a=u.vs||u.vert||u.vertex,f=u.fs||u.frag||u.fragment,c=t(o,a,o.VERTEX_SHADER),l=t(o,f,o.FRAGMENT_SHADER);6===u.count&&u.attribute({a_position:n}),r.frame((function(){return void u.render()||1})),u.pg=i?function(e,r,t,n){var i=e.createProgram();return e.attachShader(i,r),e.attachShader(i,t),e.transformFeedbackVaryings(i,n,e.SEPARATE_ATTRIBS),e.linkProgram(i),e.getProgramParameter(i,e.LINK_STATUS)?(e.useProgram(i),i):(console.warn(e.getProgramInfoLog(i)),null)}(o,c,l,i):function(e,r,t){var n=e.createProgram();return e.attachShader(n,r),e.attachShader(n,t),e.linkProgram(n),e.getProgramParameter(n,e.LINK_STATUS)?(e.useProgram(n),n):(console.log(e.getProgramInfoLog(n)),null)}(o,c,l),u.lastActiveUnit=0,u.activeUnit=e.nested((function(){return u.lastActiveUnit++})),u.location=e.nested((function(e,r){return void 0===r&&(r=!1),r?null==o?void 0:o.getAttribLocation(u.pg,e):null==o?void 0:o.getUniformLocation(u.pg,e)}))},render:function(){u.gl.useProgram(u.pg),u.frame.flush(),o=i,i=performance.now()/1e3,a=i-o,u.uniform({iTime:i,iPrevTime:o,iDeltaTime:a})},_uniform:function(e,r,t){void 0===r&&(r=0),void 0===t&&(t=!1);var n=function(e,r){void 0===r&&(r=!1);var t="number"==typeof e?0:null==e?void 0:e.length;return t?r?"uniformMatrix"+(t=Math.sqrt(t)<<0)+"fv":"uniform"+t+"fv":"uniform1f"}(r,t);u.frame((function(){var i=u.location(e);t?u.gl[n](i,!1,r):u.gl[n](i,r)}))},_attribute:function(e,r,t){u.frame((function(){var n=u.location(e,!0),i=function(e,r){if(r){var t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array(r),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),t}}(u.gl,r),o=function(e,r){if(r){var t=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(r),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),t}}(u.gl,t),a=function(e,r,t){t&&(e=Math.max.apply(Math,t)+1);var n=r.length/e;return n!==n<<0&&console.warn("Vertex Stride Error: count "+e+" is mismatch"),n<<0}(u.count,r,t);!function(e,r,t,n,i){e.bindBuffer(e.ARRAY_BUFFER,n),e.enableVertexAttribArray(t),e.vertexAttribPointer(t,r,e.FLOAT,!1,0,0),i&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,i)}(u.gl,a,n,i,o)}))},_texture:function(e,r){if("undefined"!=typeof window){var t=new Image;t.addEventListener("load",(function(e){return u.load(e,t)}),!1),Object.assign(t,{src:r,alt:e,crossOrigin:"anonymous"})}},resize:function(e,r,t){void 0===r&&(r=window.innerWidth),void 0===t&&(t=window.innerHeight),u.size[0]=u.el.width=r,u.size[1]=u.el.height=t,u.uniform("iResolution",u.size)},mousemove:function(e,r,t){void 0===r&&(r=e.clientX),void 0===t&&(t=e.clientY);var n=u.size,i=n[0],o=n[1];u.mouse[0]=(r-i/2)/(i/2),u.mouse[1]=-(t-o/2)/(o/2),u.uniform("iMouse",u.mouse)},load:function(e,r){u.frame((function(){var e=u.location(r.alt),t=u.activeUnit(r.alt),n=function(e,r){var t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),t}(u.gl,r);u.frame((function(){return function(e,r,t,n){e.uniform1i(r,t),e.activeTexture(e["TEXTURE"+t]),e.bindTexture(e.TEXTURE_2D,n)}(u.gl,e,t,n),!0}))}))},clear:function(e){void 0===e&&(e="COLOR_BUFFER_BIT"),u.gl.clear(u.gl[e])},viewport:function(e){var r;void 0===e&&(e=u.size),(r=u.gl).viewport.apply(r,[0,0].concat(e))},drawArrays:function(e){void 0===e&&(e="TRIANGLES"),u.gl.drawArrays(u.gl[e],0,u.count)},drawElements:function(e,r){void 0===e&&(e="TRIANGLES"),void 0===r&&(r="UNSIGNED_SHORT"),u.gl.drawElements(u.gl[e],u.count,u.gl[r],0)}});u.frame=r.queue(),u.texture=e.durable(u._texture),u.uniform=e.durable(u._uniform),u.attribute=e.durable(u._attribute),exports.default=u,exports.gl=u;
package/index.develop.js CHANGED
@@ -1 +1 @@
1
- !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("refr"),require("reev")):"function"==typeof define&&define.amd?define(["exports","refr","reev"],r):r(((e="undefined"!=typeof globalThis?globalThis:e||self).index=e.index||{},e.index.ts={}),e.refr,e.reev)}(this,(function(e,r,n){"use strict";function t(e,r){for(var n=e[0],t=0,i=r.length;t<i;t+=1)n+=r[t]+e[t+1];return n}function i(e){return Array.isArray(e)&&"string"==typeof e[0]}function o(e,r,n){return void 0===n&&(n=""),""!==n&&!e.includes(n)||function(e,r){return e=e.replace(/\s+/g,""),r=r.replace(/\s+/g,""),e.includes(r)}(e,r)?e:r+e}function a(e,r){void 0===r&&(r=!1);var n="number"==typeof e?0:e.length;return n?r?["uniformMatrix"+(n=Math.sqrt(n)<<0)+"fv","mat"+n]:["uniform"+n+"fv","vec"+n]:["uniform1f","float"]}function u(e,r,n){var t=e.createShader(n);if(e.shaderSource(t,r),e.compileShader(t),e.getShaderParameter(t,e.COMPILE_STATUS))return t;console.warn(e.getShaderInfoLog(t))}function f(e,r,n,t,i){e.bindBuffer(e.ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array(r),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),n}}(e,t)),e.enableVertexAttribArray(n),e.vertexAttribPointer(n,r,e.FLOAT,!1,0,0),i&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(r),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),n}}(e,i))}var l=function(e){var r=n.event();return r({mount:function(){e.int&&(e.frag=o(e.frag,"precision "+e.int+" int;")),e.float&&(e.frag=o(e.frag,"precision "+e.float+" float;")),e.sampler2D&&(e.frag=o(e.frag,"precision "+e.sampler2D+" sampler2D;")),e.samplerCube&&(e.frag=o(e.frag,"precision "+e.samplerCube+" samplerCube;"));var n=e.el=document.getElementById(e.id),t=e.gl=null==n?void 0:n.getContext("webgl"),i=u(t,e.frag,t.FRAGMENT_SHADER),a=u(t,e.vert,t.VERTEX_SHADER);e.pg=function(e,r,n){var t=e.createProgram();return e.attachShader(t,r),e.attachShader(t,n),e.linkProgram(t),e.getProgramParameter(t,e.LINK_STATUS)?(e.useProgram(t),t):(console.log(e.getProgramInfoLog(t)),null)}(t,a,i),window.addEventListener("resize",r.resize),window.addEventListener("mousemove",r.mousemove),r.resize();var f=performance.now(),l=0,c=0;e.setFrame((function(){return l=f,f=performance.now()/1e3,c=f-l,e.setUniform({iTime:f,iPrevTime:l,iDeltaTime:c}),!0})),e.frame()},clean:function(){window.removeEventListener("resize",r.resize),window.removeEventListener("mousemove",r.mousemove),e.frame.cancel()},mousemove:function(r){var n=r.clientX,t=r.clientY,i=e.size,o=i[0],a=i[1];e.mouse[0]=(n-o/2)/(o/2),e.mouse[1]=-(t-a/2)/(a/2),e.setUniform("iMouse",e.mouse)},resize:function(r,n,t){void 0===n&&(n=window.innerWidth),void 0===t&&(t=window.innerHeight),e.size[0]=e.el.width=n,e.size[1]=e.el.height=t,e.setUniform("iResolution",e.size)},load:function(r,n){e.setFrame((function(){var r=e.activeUnit(n.alt),t=e.location(n.alt),i=function(e,r){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(t,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,i),!0}))}))}})},c=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],s="\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",d="\n uniform vec2 resolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / resolution), 0, 1);\n }\n",m=function(e){var o=function e(r){for(var n=arguments.length,o=new Array(n>1?n-1:0),a=1;a<n;a++)o[a-1]=arguments[a];return i(r)&&(r=t(r,o)),"string"==typeof r&&(e.frag=r),"function"==typeof r&&e.frame.mount(r),e};o.id="myCanvas",o.frag=d,o.vert=s,o.size=[0,0],o.mouse=[0,0],o.count=6,o.uniformHeader=[],o.attributeHeader=[];var u=o.event=l(o),m=o.frame=r.frame();o.lastActiveUnit=0,o.activeUnit=n.nested((function(){return o.lastActiveUnit++})),o.vertexStride=n.nested((function(e,r,n){var t=n?Math.max.apply(Math,n)+1:o.count,i=r.length/t<<0;return o.attributeHeader.push([e,"vertex vec"+i+" "+e+";"]),i})),o.uniformType=n.nested((function(e,r,n){var t=a(r,n),i=t[0],u=t[1];return o.uniformHeader.push([e,"uniform "+u+" "+e+";"]),i})),o.location=n.nested((function(e,r){var n,t;return void 0===r&&(r=!1),r?null==(n=o.gl)?void 0:n.getAttribLocation(o.pg,e):null==(t=o.gl)?void 0:t.getUniformLocation(o.pg,e)})),o.setDpr=function(){return void u.resize()||o},o.setSize=function(){return void u.resize()||o},o.setFrame=function(e){return void m.mount(e)||o},o.setMount=function(e){return void u({mount:e})||o},o.setClean=function(e){return void u({clean:e})||o},o.setConfig=n.durable((function(e,r){o[e]=r}),o),o.setUniform=n.durable((function(e,r,n){void 0===n&&(n=!1);var t=o.uniformType(e,r,n);o.setFrame((function(){n?o.gl[t](o.location(e),!1,r):o.gl[t](o.location(e),r)}))}),o),o.setAttribute=n.durable((function(e,r,n){var t=o.vertexStride(e,r,n);o.setFrame((function(){f(o.gl,t,o.location(e,!0),r,n)}))}),o),o.setTexture=n.durable((function(e,r){var n=new Image;n.addEventListener("load",(function(e){return u.load(e,n)}),!1),Object.assign(n,{src:r,alt:e,crossOrigin:"anonymous"})}),o),o.mount=function(){return u.mount.apply(u,arguments)},o.clean=function(){return u.clean.apply(u,arguments)},o.clear=function(e){return o.gl.clear(o.gl[e||"COLOR_BUFFER_BIT"])},o.viewport=function(e){var r;return(r=o.gl).viewport.apply(r,[0,0].concat(e||o.size))},o.drawArrays=function(e){return void 0===e&&(e="TRIANGLES"),o.gl.drawArrays(o.gl[e],0,o.count)},o.drawElements=function(e,r){return void 0===e&&(e="TRIANGLES"),void 0===r&&(r="UNSIGNED_SHORT"),o.gl.drawElements(o.gl[e],o.count,o.gl[r],0)};for(var v=arguments.length,g=new Array(v>1?v-1:0),E=1;E<v;E++)g[E-1]=arguments[E];return i(e)&&(e=t(e,g)),"string"==typeof e&&(o.frag=e),"object"==typeof e&&o.setConfig(e),6===o.count&&o.setAttribute({a_position:c}),o};m.default=null,e.default=m,e.gl=m,Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("reev"),require("refr")):"function"==typeof define&&define.amd?define(["exports","reev","refr"],r):r(((e="undefined"!=typeof globalThis?globalThis:e||self).index=e.index||{},e.index.ts={}),e.reev,e.refr)}(this,(function(e,r,n){"use strict";function t(e,r,n){var t=e.createShader(n);if(e.shaderSource(t,r),e.compileShader(t),e.getShaderParameter(t,e.COMPILE_STATUS))return t;console.warn(e.getShaderInfoLog(t))}var i=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],o=performance.now(),a=0,u=0,f=r.event({vertex:"\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",fragment:"\n precision mediump float;\n uniform vec2 iResolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);\n }\n",size:[0,0],mouse:[0,0],count:6,counter:0,init:function(e){var o=f.gl,a=f.vs||f.vert||f.vertex,u=f.fs||f.frag||f.fragment,l=t(o,a,o.VERTEX_SHADER),c=t(o,u,o.FRAGMENT_SHADER);6===f.count&&f.attribute({a_position:i}),n.frame((function(){return void f.render()||1})),f.pg=e?function(e,r,n,t){var i=e.createProgram();return e.attachShader(i,r),e.attachShader(i,n),e.transformFeedbackVaryings(i,t,e.SEPARATE_ATTRIBS),e.linkProgram(i),e.getProgramParameter(i,e.LINK_STATUS)?(e.useProgram(i),i):(console.warn(e.getProgramInfoLog(i)),null)}(o,l,c,e):function(e,r,n){var t=e.createProgram();return e.attachShader(t,r),e.attachShader(t,n),e.linkProgram(t),e.getProgramParameter(t,e.LINK_STATUS)?(e.useProgram(t),t):(console.log(e.getProgramInfoLog(t)),null)}(o,l,c),f.lastActiveUnit=0,f.activeUnit=r.nested((function(){return f.lastActiveUnit++})),f.location=r.nested((function(e,r){return void 0===r&&(r=!1),r?null==o?void 0:o.getAttribLocation(f.pg,e):null==o?void 0:o.getUniformLocation(f.pg,e)}))},render:function(){f.gl.useProgram(f.pg),f.frame.flush(),a=o,o=performance.now()/1e3,u=o-a,f.uniform({iTime:o,iPrevTime:a,iDeltaTime:u})},_uniform:function(e,r,n){void 0===r&&(r=0),void 0===n&&(n=!1);var t=function(e,r){void 0===r&&(r=!1);var n="number"==typeof e?0:null==e?void 0:e.length;return n?r?"uniformMatrix"+(n=Math.sqrt(n)<<0)+"fv":"uniform"+n+"fv":"uniform1f"}(r,n);f.frame((function(){var i=f.location(e);n?f.gl[t](i,!1,r):f.gl[t](i,r)}))},_attribute:function(e,r,n){f.frame((function(){var t=f.location(e,!0),i=function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array(r),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),n}}(f.gl,r),o=function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(r),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),n}}(f.gl,n),a=function(e,r,n){n&&(e=Math.max.apply(Math,n)+1);var t=r.length/e;return t!==t<<0&&console.warn("Vertex Stride Error: count "+e+" is mismatch"),t<<0}(f.count,r,n);!function(e,r,n,t,i){e.bindBuffer(e.ARRAY_BUFFER,t),e.enableVertexAttribArray(n),e.vertexAttribPointer(n,r,e.FLOAT,!1,0,0),i&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,i)}(f.gl,a,t,i,o)}))},_texture:function(e,r){if("undefined"!=typeof window){var n=new Image;n.addEventListener("load",(function(e){return f.load(e,n)}),!1),Object.assign(n,{src:r,alt:e,crossOrigin:"anonymous"})}},resize:function(e,r,n){void 0===r&&(r=window.innerWidth),void 0===n&&(n=window.innerHeight),f.size[0]=f.el.width=r,f.size[1]=f.el.height=n,f.uniform("iResolution",f.size)},mousemove:function(e,r,n){void 0===r&&(r=e.clientX),void 0===n&&(n=e.clientY);var t=f.size,i=t[0],o=t[1];f.mouse[0]=(r-i/2)/(i/2),f.mouse[1]=-(n-o/2)/(o/2),f.uniform("iMouse",f.mouse)},load:function(e,r){f.frame((function(){var e=f.location(r.alt),n=f.activeUnit(r.alt),t=function(e,r){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n}(f.gl,r);f.frame((function(){return function(e,r,n,t){e.uniform1i(r,n),e.activeTexture(e["TEXTURE"+n]),e.bindTexture(e.TEXTURE_2D,t)}(f.gl,e,n,t),!0}))}))},clear:function(e){void 0===e&&(e="COLOR_BUFFER_BIT"),f.gl.clear(f.gl[e])},viewport:function(e){var r;void 0===e&&(e=f.size),(r=f.gl).viewport.apply(r,[0,0].concat(e))},drawArrays:function(e){void 0===e&&(e="TRIANGLES"),f.gl.drawArrays(f.gl[e],0,f.count)},drawElements:function(e,r){void 0===e&&(e="TRIANGLES"),void 0===r&&(r="UNSIGNED_SHORT"),f.gl.drawElements(f.gl[e],f.count,f.gl[r],0)}});f.frame=n.queue(),f.texture=r.durable(f._texture),f.uniform=r.durable(f._uniform),f.attribute=r.durable(f._attribute),e.default=f,e.gl=f,Object.defineProperty(e,"__esModule",{value:!0})}));
package/index.js CHANGED
@@ -1 +1 @@
1
- import{frame as e}from"refr";import{event as r,nested as n,durable as t}from"reev";function i(e,r){for(var n=e[0],t=0,i=r.length;t<i;t+=1)n+=r[t]+e[t+1];return n}function o(e){return Array.isArray(e)&&"string"==typeof e[0]}function a(e,r,n){return void 0===n&&(n=""),""!==n&&!e.includes(n)||function(e,r){return e=e.replace(/\s+/g,""),r=r.replace(/\s+/g,""),e.includes(r)}(e,r)?e:r+e}function u(e,r){void 0===r&&(r=!1);var n="number"==typeof e?0:e.length;return n?r?["uniformMatrix"+(n=Math.sqrt(n)<<0)+"fv","mat"+n]:["uniform"+n+"fv","vec"+n]:["uniform1f","float"]}function f(e,r,n){var t=e.createShader(n);if(e.shaderSource(t,r),e.compileShader(t),e.getShaderParameter(t,e.COMPILE_STATUS))return t;console.warn(e.getShaderInfoLog(t))}function c(e,r,n,t,i){e.bindBuffer(e.ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,n),e.bufferData(e.ARRAY_BUFFER,new Float32Array(r),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),n}}(e,t)),e.enableVertexAttribArray(n),e.vertexAttribPointer(n,r,e.FLOAT,!1,0,0),i&&e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,function(e,r){if(r){var n=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(r),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),n}}(e,i))}var l=function(e){var n=r();return n({mount:function(){e.int&&(e.frag=a(e.frag,"precision "+e.int+" int;")),e.float&&(e.frag=a(e.frag,"precision "+e.float+" float;")),e.sampler2D&&(e.frag=a(e.frag,"precision "+e.sampler2D+" sampler2D;")),e.samplerCube&&(e.frag=a(e.frag,"precision "+e.samplerCube+" samplerCube;"));var r=e.el=document.getElementById(e.id),t=e.gl=null==r?void 0:r.getContext("webgl"),i=f(t,e.frag,t.FRAGMENT_SHADER),o=f(t,e.vert,t.VERTEX_SHADER);e.pg=function(e,r,n){var t=e.createProgram();return e.attachShader(t,r),e.attachShader(t,n),e.linkProgram(t),e.getProgramParameter(t,e.LINK_STATUS)?(e.useProgram(t),t):(console.log(e.getProgramInfoLog(t)),null)}(t,o,i),window.addEventListener("resize",n.resize),window.addEventListener("mousemove",n.mousemove),n.resize();var u=performance.now(),c=0,l=0;e.setFrame((function(){return c=u,u=performance.now()/1e3,l=u-c,e.setUniform({iTime:u,iPrevTime:c,iDeltaTime:l}),!0})),e.frame()},clean:function(){window.removeEventListener("resize",n.resize),window.removeEventListener("mousemove",n.mousemove),e.frame.cancel()},mousemove:function(r){var n=r.clientX,t=r.clientY,i=e.size,o=i[0],a=i[1];e.mouse[0]=(n-o/2)/(o/2),e.mouse[1]=-(t-a/2)/(a/2),e.setUniform("iMouse",e.mouse)},resize:function(r,n,t){void 0===n&&(n=window.innerWidth),void 0===t&&(t=window.innerHeight),e.size[0]=e.el.width=n,e.size[1]=e.el.height=t,e.setUniform("iResolution",e.size)},load:function(r,n){e.setFrame((function(){var r=e.activeUnit(n.alt),t=e.location(n.alt),i=function(e,r){var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,r),e.generateMipmap(e.TEXTURE_2D),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(t,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,i),!0}))}))}})},s=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],m="\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",v="\n uniform vec2 resolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / resolution), 0, 1);\n }\n",g=function(r){var a=function e(r){for(var n=arguments.length,t=new Array(n>1?n-1:0),a=1;a<n;a++)t[a-1]=arguments[a];return o(r)&&(r=i(r,t)),"string"==typeof r&&(e.frag=r),"function"==typeof r&&e.frame.mount(r),e};a.id="myCanvas",a.frag=v,a.vert=m,a.size=[0,0],a.mouse=[0,0],a.count=6,a.uniformHeader=[],a.attributeHeader=[];var f=a.event=l(a),g=a.frame=e();a.lastActiveUnit=0,a.activeUnit=n((function(){return a.lastActiveUnit++})),a.vertexStride=n((function(e,r,n){var t=n?Math.max.apply(Math,n)+1:a.count,i=r.length/t<<0;return a.attributeHeader.push([e,"vertex vec"+i+" "+e+";"]),i})),a.uniformType=n((function(e,r,n){var t=u(r,n),i=t[0],o=t[1];return a.uniformHeader.push([e,"uniform "+o+" "+e+";"]),i})),a.location=n((function(e,r){var n,t;return void 0===r&&(r=!1),r?null==(n=a.gl)?void 0:n.getAttribLocation(a.pg,e):null==(t=a.gl)?void 0:t.getUniformLocation(a.pg,e)})),a.setDpr=function(){return void f.resize()||a},a.setSize=function(){return void f.resize()||a},a.setFrame=function(e){return void g.mount(e)||a},a.setMount=function(e){return void f({mount:e})||a},a.setClean=function(e){return void f({clean:e})||a},a.setConfig=t((function(e,r){a[e]=r}),a),a.setUniform=t((function(e,r,n){void 0===n&&(n=!1);var t=a.uniformType(e,r,n);a.setFrame((function(){n?a.gl[t](a.location(e),!1,r):a.gl[t](a.location(e),r)}))}),a),a.setAttribute=t((function(e,r,n){var t=a.vertexStride(e,r,n);a.setFrame((function(){c(a.gl,t,a.location(e,!0),r,n)}))}),a),a.setTexture=t((function(e,r){var n=new Image;n.addEventListener("load",(function(e){return f.load(e,n)}),!1),Object.assign(n,{src:r,alt:e,crossOrigin:"anonymous"})}),a),a.mount=function(){return f.mount.apply(f,arguments)},a.clean=function(){return f.clean.apply(f,arguments)},a.clear=function(e){return a.gl.clear(a.gl[e||"COLOR_BUFFER_BIT"])},a.viewport=function(e){var r;return(r=a.gl).viewport.apply(r,[0,0].concat(e||a.size))},a.drawArrays=function(e){return void 0===e&&(e="TRIANGLES"),a.gl.drawArrays(a.gl[e],0,a.count)},a.drawElements=function(e,r){return void 0===e&&(e="TRIANGLES"),void 0===r&&(r="UNSIGNED_SHORT"),a.gl.drawElements(a.gl[e],a.count,a.gl[r],0)};for(var E=arguments.length,d=new Array(E>1?E-1:0),T=1;T<E;T++)d[T-1]=arguments[T];return o(r)&&(r=i(r,d)),"string"==typeof r&&(a.frag=r),"object"==typeof r&&a.setConfig(r),6===a.count&&a.setAttribute({a_position:s}),a};g.default=null;export{g as default,g as gl};
1
+ import{event as r,nested as e,durable as n}from"reev";import{frame as t,queue as i}from"refr";function o(r,e,n){var t=r.createShader(n);if(r.shaderSource(t,e),r.compileShader(t),r.getShaderParameter(t,r.COMPILE_STATUS))return t;console.warn(r.getShaderInfoLog(t))}var a=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1],u=performance.now(),f=0,c=0,l=r({vertex:"\n attribute vec4 a_position;\n void main() {\n gl_Position = a_position;\n }\n",fragment:"\n precision mediump float;\n uniform vec2 iResolution;\n void main() {\n gl_FragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);\n }\n",size:[0,0],mouse:[0,0],count:6,counter:0,init:function(r){var n=l.gl,i=l.vs||l.vert||l.vertex,u=l.fs||l.frag||l.fragment,f=o(n,i,n.VERTEX_SHADER),c=o(n,u,n.FRAGMENT_SHADER);6===l.count&&l.attribute({a_position:a}),t((function(){return void l.render()||1})),l.pg=r?function(r,e,n,t){var i=r.createProgram();return r.attachShader(i,e),r.attachShader(i,n),r.transformFeedbackVaryings(i,t,r.SEPARATE_ATTRIBS),r.linkProgram(i),r.getProgramParameter(i,r.LINK_STATUS)?(r.useProgram(i),i):(console.warn(r.getProgramInfoLog(i)),null)}(n,f,c,r):function(r,e,n){var t=r.createProgram();return r.attachShader(t,e),r.attachShader(t,n),r.linkProgram(t),r.getProgramParameter(t,r.LINK_STATUS)?(r.useProgram(t),t):(console.log(r.getProgramInfoLog(t)),null)}(n,f,c),l.lastActiveUnit=0,l.activeUnit=e((function(){return l.lastActiveUnit++})),l.location=e((function(r,e){return void 0===e&&(e=!1),e?null==n?void 0:n.getAttribLocation(l.pg,r):null==n?void 0:n.getUniformLocation(l.pg,r)}))},render:function(){l.gl.useProgram(l.pg),l.frame.flush(),f=u,u=performance.now()/1e3,c=u-f,l.uniform({iTime:u,iPrevTime:f,iDeltaTime:c})},_uniform:function(r,e,n){void 0===e&&(e=0),void 0===n&&(n=!1);var t=function(r,e){void 0===e&&(e=!1);var n="number"==typeof r?0:null==r?void 0:r.length;return n?e?"uniformMatrix"+(n=Math.sqrt(n)<<0)+"fv":"uniform"+n+"fv":"uniform1f"}(e,n);l.frame((function(){var i=l.location(r);n?l.gl[t](i,!1,e):l.gl[t](i,e)}))},_attribute:function(r,e,n){l.frame((function(){var t=l.location(r,!0),i=function(r,e){if(e){var n=r.createBuffer();return r.bindBuffer(r.ARRAY_BUFFER,n),r.bufferData(r.ARRAY_BUFFER,new Float32Array(e),r.STATIC_DRAW),r.bindBuffer(r.ARRAY_BUFFER,null),n}}(l.gl,e),o=function(r,e){if(e){var n=r.createBuffer();return r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,n),r.bufferData(r.ELEMENT_ARRAY_BUFFER,new Int16Array(e),r.STATIC_DRAW),r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,null),n}}(l.gl,n),a=function(r,e,n){n&&(r=Math.max.apply(Math,n)+1);var t=e.length/r;return t!==t<<0&&console.warn("Vertex Stride Error: count "+r+" is mismatch"),t<<0}(l.count,e,n);!function(r,e,n,t,i){r.bindBuffer(r.ARRAY_BUFFER,t),r.enableVertexAttribArray(n),r.vertexAttribPointer(n,e,r.FLOAT,!1,0,0),i&&r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,i)}(l.gl,a,t,i,o)}))},_texture:function(r,e){if("undefined"!=typeof window){var n=new Image;n.addEventListener("load",(function(r){return l.load(r,n)}),!1),Object.assign(n,{src:e,alt:r,crossOrigin:"anonymous"})}},resize:function(r,e,n){void 0===e&&(e=window.innerWidth),void 0===n&&(n=window.innerHeight),l.size[0]=l.el.width=e,l.size[1]=l.el.height=n,l.uniform("iResolution",l.size)},mousemove:function(r,e,n){void 0===e&&(e=r.clientX),void 0===n&&(n=r.clientY);var t=l.size,i=t[0],o=t[1];l.mouse[0]=(e-i/2)/(i/2),l.mouse[1]=-(n-o/2)/(o/2),l.uniform("iMouse",l.mouse)},load:function(r,e){l.frame((function(){var r=l.location(e.alt),n=l.activeUnit(e.alt),t=function(r,e){var n=r.createTexture();return r.bindTexture(r.TEXTURE_2D,n),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,e),r.generateMipmap(r.TEXTURE_2D),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.LINEAR),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE),r.bindTexture(r.TEXTURE_2D,null),n}(l.gl,e);l.frame((function(){return function(r,e,n,t){r.uniform1i(e,n),r.activeTexture(r["TEXTURE"+n]),r.bindTexture(r.TEXTURE_2D,t)}(l.gl,r,n,t),!0}))}))},clear:function(r){void 0===r&&(r="COLOR_BUFFER_BIT"),l.gl.clear(l.gl[r])},viewport:function(r){var e;void 0===r&&(r=l.size),(e=l.gl).viewport.apply(e,[0,0].concat(r))},drawArrays:function(r){void 0===r&&(r="TRIANGLES"),l.gl.drawArrays(l.gl[r],0,l.count)},drawElements:function(r,e){void 0===r&&(r="TRIANGLES"),void 0===e&&(e="UNSIGNED_SHORT"),l.gl.drawElements(l.gl[r],l.count,l.gl[e],0)}});l.frame=i(),l.texture=n(l._texture),l.uniform=n(l._uniform),l.attribute=n(l._attribute);export{l as default,l as gl};
package/index.ts CHANGED
@@ -1,136 +1,158 @@
1
- import { frame } from 'refr'
2
- import { glEvent } from './events'
3
- import { durable, nested } from 'reev'
1
+ import { event, durable, nested } from 'reev'
2
+ import { queue, frame } from 'refr'
4
3
  import {
4
+ uniformType,
5
+ vertexStride,
6
+ createProgram,
7
+ createTfProgram,
8
+ createShader,
5
9
  createAttribute,
6
- interleave,
7
- isTemplateLiteral,
8
- switchUniformType,
10
+ createTexture,
11
+ createVbo,
12
+ createIbo,
13
+ activeTexture,
9
14
  } from './utils'
10
15
  import type { GL } from './types'
11
16
 
12
17
  const a_position = [-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]
13
18
 
14
- const _defaultVertexShader = `
19
+ const _defaultVertex = `
15
20
  attribute vec4 a_position;
16
21
  void main() {
17
22
  gl_Position = a_position;
18
23
  }
19
24
  `
20
25
 
21
- const _defaultFragmentShader = `
22
- uniform vec2 resolution;
26
+ const _defaultFragment = `
27
+ precision mediump float;
28
+ uniform vec2 iResolution;
23
29
  void main() {
24
- gl_FragColor = vec4(fract(gl_FragCoord.xy / resolution), 0, 1);
30
+ gl_FragColor = vec4(fract(gl_FragCoord.xy / iResolution), 0, 1);
25
31
  }
26
32
  `
27
33
 
28
- export const gl = (initArg?: string | Partial<GL>, ...initArgs: any[]) => {
29
- const self = ((arg: any, ...args: any[]) => {
30
- if (isTemplateLiteral(arg)) arg = interleave(arg, args)
31
- if (typeof arg === 'string') self.frag = arg
32
- if (typeof arg === 'function') self.frame.mount(arg)
33
- return self
34
- }) as GL
34
+ let iTime = performance.now(),
35
+ iPrevTime = 0,
36
+ iDeltaTime = 0
35
37
 
36
- // default state
37
- self.id = 'myCanvas' // @TODO feat: create hashid
38
- self.frag = _defaultFragmentShader
39
- self.vert = _defaultVertexShader
40
- // self.float = "mediump" // @TODO check bugs
41
- self.size = [0, 0]
42
- self.mouse = [0, 0]
43
- self.count = 6
44
- self.uniformHeader = []
45
- self.attributeHeader = []
46
-
47
- // core state
48
- const e = (self.event = glEvent(self))
49
- const f = (self.frame = frame())
50
- self.lastActiveUnit = 0
51
- self.activeUnit = nested(() => self.lastActiveUnit++)
52
- self.vertexStride = nested((key, value, iboValue) => {
53
- const count = iboValue ? Math.max(...iboValue) + 1 : self.count
54
- const stride = (value.length / count) << 0
55
- self.attributeHeader.push([key, `vertex vec${stride} ${key};`])
56
- return stride
57
- })
58
-
59
- self.uniformType = nested((key, value, isMatrix) => {
60
- const [type, code] = switchUniformType(value, isMatrix)
61
- self.uniformHeader.push([key, `uniform ${code} ${key};`])
62
- return type
63
- })
64
-
65
- self.location = nested((key, isAttribute = false) => {
66
- return isAttribute
67
- ? self.gl?.getAttribLocation(self.pg, key)
68
- : self.gl?.getUniformLocation(self.pg, key)
69
- })
70
-
71
- // setter
72
- self.setDpr = () => void e.resize() || self
73
- self.setSize = () => void e.resize() || self
74
- self.setFrame = (frame) => void f.mount(frame) || self
75
- self.setMount = (mount) => void e({ mount }) || self
76
- self.setClean = (clean) => void e({ clean }) || self
77
- self.setConfig = durable((key, value) => void (self[key] = value), self)
78
- self.setUniform = durable((key, value, isMatrix = false) => {
79
- const type = self.uniformType(key, value, isMatrix)
80
- self.setFrame(() => {
81
- if (isMatrix)
82
- self.gl[type](self.location(key), false, value)
83
- else self.gl[type](self.location(key), value)
38
+ const self = event<Partial<GL>>({
39
+ vertex: _defaultVertex,
40
+ fragment: _defaultFragment,
41
+ size: [0, 0],
42
+ mouse: [0, 0],
43
+ count: 6,
44
+ counter: 0,
45
+ init(varying?: string[]) {
46
+ const gl = self.gl
47
+ const _v = self.vs || self.vert || self.vertex
48
+ const _f = self.fs || self.frag || self.fragment
49
+ const vs = createShader(gl, _v, gl.VERTEX_SHADER)
50
+ const fs = createShader(gl, _f, gl.FRAGMENT_SHADER)
51
+ if (self.count === 6) self.attribute({ a_position })
52
+ frame(() => void self.render() || 1)
53
+ self.pg = varying
54
+ ? createTfProgram(gl, vs, fs, varying)
55
+ : createProgram(gl, vs, fs)
56
+ self.lastActiveUnit = 0
57
+ self.activeUnit = nested(() => self.lastActiveUnit++)
58
+ self.location = nested((key, isAttribute = false) => {
59
+ return isAttribute
60
+ ? gl?.getAttribLocation(self.pg, key)
61
+ : gl?.getUniformLocation(self.pg, key)
84
62
  })
85
- }, self)
86
- self.setAttribute = durable((key, value, iboValue) => {
87
- const stride = self.vertexStride(key, value, iboValue)
88
- self.setFrame(() => {
89
- createAttribute(
90
- self.gl,
91
- stride,
92
- self.location(key, true),
93
- value,
94
- iboValue
95
- )
63
+ },
64
+ render() {
65
+ self.gl.useProgram(self.pg)
66
+ self.frame.flush()
67
+ iPrevTime = iTime
68
+ iTime = performance.now() / 1000
69
+ iDeltaTime = iTime - iPrevTime
70
+ self.uniform({ iTime, iPrevTime, iDeltaTime })
71
+ },
72
+ _uniform(key: string, value = 0, isMatrix = false) {
73
+ const type = uniformType(value, isMatrix)
74
+ self.frame(() => {
75
+ const loc = self.location(key)
76
+ if (isMatrix) self.gl[type](loc, false, value)
77
+ else self.gl[type](loc, value)
96
78
  })
97
- }, self)
98
-
99
- // texture
100
- self.setTexture = durable((key, src) => {
79
+ },
80
+ _attribute(key: string, value: number[], iboValue?: number[]) {
81
+ self.frame(() => {
82
+ const loc = self.location(key, true)
83
+ const vbo = createVbo(self.gl, value)
84
+ const ibo = createIbo(self.gl, iboValue)
85
+ const stride = vertexStride(self.count, value, iboValue)
86
+ createAttribute(self.gl, stride, loc, vbo, ibo)
87
+ })
88
+ },
89
+ _texture(key: string, src: string) {
90
+ if (typeof window === 'undefined') return
101
91
  const image = new Image()
102
- image.addEventListener('load', (_) => e.load(_, image), false)
92
+ image.addEventListener(
93
+ 'load',
94
+ (_) => self.load(_, image),
95
+ false
96
+ )
103
97
  Object.assign(image, {
104
98
  src,
105
99
  alt: key,
106
100
  crossOrigin: 'anonymous',
107
101
  })
108
- }, self)
109
-
110
- // shorthands
111
- self.mount = (...args) => e.mount(...args)
112
- self.clean = (...args) => e.clean(...args)
113
- self.clear = (key) => self.gl.clear(self.gl[key || 'COLOR_BUFFER_BIT'])
114
- self.viewport = (size) => self.gl.viewport(0, 0, ...(size || self.size))
115
- self.drawArrays = (mode = 'TRIANGLES') =>
102
+ },
103
+ resize(
104
+ _e: any,
105
+ width = window.innerWidth,
106
+ height = window.innerHeight
107
+ ) {
108
+ self.size[0] = self.el.width = width
109
+ self.size[1] = self.el.height = height
110
+ self.uniform('iResolution', self.size)
111
+ },
112
+ mousemove(_e: any, x = _e.clientX, y = _e.clientY) {
113
+ const [w, h] = self.size
114
+ self.mouse[0] = (x - w / 2) / (w / 2)
115
+ self.mouse[1] = -(y - h / 2) / (h / 2)
116
+ self.uniform('iMouse', self.mouse)
117
+ },
118
+ load(_: any, image: any) {
119
+ self.frame(() => {
120
+ const loc = self.location(image.alt)
121
+ const unit = self.activeUnit(image.alt)
122
+ const texture = createTexture(self.gl, image)
123
+ self.frame(() => {
124
+ activeTexture(self.gl, loc, unit, texture)
125
+ return true
126
+ })
127
+ })
128
+ },
129
+ clear(key = 'COLOR_BUFFER_BIT') {
130
+ self.gl.clear(self.gl[key])
131
+ },
132
+ viewport(size: number[] = self.size) {
133
+ self.gl.viewport(0, 0, ...size)
134
+ },
135
+ drawArrays(mode = 'TRIANGLES') {
116
136
  self.gl.drawArrays(self.gl[mode], 0, self.count)
117
- self.drawElements = (mode = 'TRIANGLES', type = 'UNSIGNED_SHORT') =>
137
+ },
138
+ drawElements(mode = 'TRIANGLES', type = 'UNSIGNED_SHORT') {
118
139
  self.gl.drawElements(
119
140
  self.gl[mode],
120
141
  self.count,
121
142
  self.gl[type],
122
143
  0
123
144
  )
145
+ },
146
+ }) as GL
124
147
 
125
- // init config
126
- if (isTemplateLiteral(initArg)) initArg = interleave(initArg, initArgs)
127
- if (typeof initArg === 'string') self.frag = initArg
128
- if (typeof initArg === 'object') self.setConfig(initArg)
129
- if (self.count === 6) self.setAttribute({ a_position })
148
+ self.frame = queue()
149
+ self.texture = durable(self._texture)
150
+ self.uniform = durable(self._uniform)
151
+ self.attribute = durable(self._attribute)
130
152
 
131
- return self
132
- }
153
+ // @TODO
154
+ // export const clone = gl.clone()
133
155
 
134
- gl.default = null as unknown as GL
156
+ export { self as gl }
135
157
 
136
- export default gl
158
+ export default self
package/native.ts ADDED
@@ -0,0 +1,64 @@
1
+ import { useEffect, useMemo } from 'react'
2
+ import { Dimensions } from 'react-native'
3
+ import { useMutable } from 'reev/react'
4
+ import { gl } from './index'
5
+ import { frame } from 'refr'
6
+ import type { GL } from './types'
7
+ import type { Fun } from 'refr'
8
+
9
+ export const useGLEvent = <T>(props: Partial<GL & T> = {}, self = gl) => {
10
+ const memo = useMutable(props) as Partial<GL>
11
+ return useMemo(() => self(memo), [])
12
+ }
13
+
14
+ export const useGL = (props: Partial<GL> = {}, self = gl) => {
15
+ const memo = useMutable(props) as Partial<GL>
16
+ return useGLEvent({
17
+ ref(gl: any) {
18
+ self(memo)
19
+ self.el = {}
20
+ self.gl = gl
21
+ self.mount()
22
+ },
23
+ mount() {
24
+ const {
25
+ drawingBufferWidth: width,
26
+ drawingBufferHeight: height,
27
+ } = self.gl
28
+ self.size = [width, height]
29
+ self.init()
30
+ self.resize(void 0, width, height)
31
+ Dimensions.addEventListener('change', self.change)
32
+ frame.start()
33
+ },
34
+ clean() {
35
+ frame.cancel()
36
+ },
37
+ change() {
38
+ const {
39
+ drawingBufferWidth: width,
40
+ drawingBufferHeight: height,
41
+ } = self.gl
42
+ self.resize(void 0, width, height)
43
+ },
44
+ })
45
+ }
46
+
47
+ export function useTexture(props: any, self = gl) {
48
+ return self.texture(props)
49
+ }
50
+
51
+ export function useAttribute(props: any, self = gl) {
52
+ return self.attribute(props)
53
+ }
54
+
55
+ export function useUniform(props: any, self = gl) {
56
+ return self.uniform(props)
57
+ }
58
+
59
+ export function useFrame(fun: Fun, self = gl) {
60
+ const ref = useMutable(fun)
61
+ useEffect(() => self.frame(fun), [])
62
+ useEffect(() => () => self.frame(ref), [])
63
+ return self
64
+ }
package/package.json CHANGED
@@ -1,43 +1,67 @@
1
1
  {
2
- "name": "glre",
3
- "author": "tseijp",
4
- "license": "MIT",
5
- "version": "0.13.1",
6
- "module": "index.js",
7
- "types": "index.ts",
8
- "main": "index.cjs.js",
9
- "umd": "index.develop.js",
10
- "private": false,
11
- "sideEffect": false,
12
- "publishConfig": {
13
- "access": "public"
14
- },
15
- "dependencies": {
16
- "reev": "0.9.0",
17
- "refr": "0.2.0"
18
- },
19
- "keywords": [
20
- "glsl",
21
- "webgl",
22
- "hooks",
23
- "react",
24
- "reactjs",
25
- "reactive",
26
- "solid",
27
- "solidjs",
28
- "typescript"
29
- ],
30
- "files": [
31
- "index.js",
32
- "index.cjs.js",
33
- "index.develop.js",
34
- "index.product.js",
35
- "index.ts",
36
- "events.ts",
37
- "helpers.ts",
38
- "react.ts",
39
- "solid.ts",
40
- "types.ts",
41
- "utils.ts"
42
- ]
2
+ "name": "glre",
3
+ "author": "tseijp",
4
+ "license": "MIT",
5
+ "version": "0.14.0",
6
+ "module": "index.js",
7
+ "types": "index.ts",
8
+ "main": "index.cjs.js",
9
+ "umd": "index.develop.js",
10
+ "private": false,
11
+ "sideEffect": false,
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "dependencies": {
16
+ "reev": "0.10.0",
17
+ "refr": "0.3.0"
18
+ },
19
+ "keywords": [
20
+ "glsl",
21
+ "webgl",
22
+ "hooks",
23
+ "react",
24
+ "reactjs",
25
+ "reactive",
26
+ "solid",
27
+ "solidjs",
28
+ "typescript"
29
+ ],
30
+ "peerDependencies": {
31
+ "expo": "*",
32
+ "expo-gl": "*",
33
+ "react": ">=16.8",
34
+ "react-dom": ">=16.8",
35
+ "solid-js": "*"
36
+ },
37
+ "peerDependenciesMeta": {
38
+ "expo": {
39
+ "optional": true
40
+ },
41
+ "expo-gl": {
42
+ "optional": true
43
+ },
44
+ "react": {
45
+ "optional": true
46
+ },
47
+ "react-dom": {
48
+ "optional": true
49
+ },
50
+ "solid-js": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "files": [
55
+ "index.js",
56
+ "index.cjs.js",
57
+ "index.develop.js",
58
+ "index.product.js",
59
+ "index.ts",
60
+ "native.ts",
61
+ "qwik.ts",
62
+ "react.ts",
63
+ "solid.ts",
64
+ "types.ts",
65
+ "utils.ts"
66
+ ]
43
67
  }
package/qwik.ts ADDED
@@ -0,0 +1,42 @@
1
+ import { useSignal, useVisibleTask$, $ } from '@builder.io/qwik'
2
+ import { gl } from './index'
3
+ import { frame } from 'refr'
4
+ import type { GL } from './types'
5
+ import type { Fun } from 'reev/types'
6
+
7
+ export function useGL(props?: any, self = $(gl) as unknown as GL) {
8
+ const ref = useSignal<Element>()
9
+ useVisibleTask$(({ cleanup }) => {
10
+ self(props)
11
+ self.el = self.target = ref.value
12
+ self.gl = self.target.getContext('webgl2')
13
+ self.init()
14
+ self.resize()
15
+ frame.start()
16
+ window.addEventListener('resize', self.resize)
17
+ window.addEventListener('mousemove', self.mousemove)
18
+ cleanup(() => {
19
+ self.clean()
20
+ window.removeEventListener('resize', self.resize)
21
+ window.removeEventListener('mousemove', self.mousemove)
22
+ })
23
+ })
24
+ return self
25
+ }
26
+
27
+ export function useTexture(props: any, self = gl) {
28
+ return self?.texture(props)
29
+ }
30
+
31
+ export function useAttribute(props: any, self = gl) {
32
+ return self.attribute(props)
33
+ }
34
+
35
+ export function useUniform(props: any, self = gl) {
36
+ return self.uniform(props)
37
+ }
38
+
39
+ export function useFrame(fun: Fun, self = gl) {
40
+ useTask$(() => self.frame(fun))
41
+ return self
42
+ }
package/react.ts CHANGED
@@ -1,40 +1,59 @@
1
+ import { useState, useEffect, useMemo } from 'react'
1
2
  import { gl } from './index'
3
+ import { frame } from 'refr'
4
+ import { mutable } from 'reev'
2
5
  import type { GL } from './types'
3
- import { useRef, useMemo, useEffect, useCallback } from 'react'
6
+ import type { Fun } from 'refr'
7
+ import type { MutableArgs } from 'reev/types'
4
8
 
5
- export function useGL(config?: Partial<GL>, target?: GL) {
6
- const self = useMemo(() => {
7
- if (target) return target
8
- return (gl.default = gl(target))
9
- }, [target])
10
- useEffect(() => void self.setConfig(config), [self, config])
11
- useEffect(() => void self.event.mount(), [self])
12
- useEffect(() => () => self.event.clean(), [self])
13
- return self
9
+ export const useMutable = <T extends object>(...args: MutableArgs<T>) => {
10
+ const [memo] = useState(() => mutable<T>())
11
+ return memo(...args)
14
12
  }
15
13
 
16
- export function useTexture(props, self?: GL) {
17
- if (!self) self = gl.default
18
- useEffect(() => void self?.setTexture(props), [props, self])
14
+ export const useGL = (props: Partial<GL> = {}, self = gl) => {
15
+ const memo1 = useMutable(props) as Partial<GL>
16
+ const memo2 = useMutable({
17
+ ref(target: unknown) {
18
+ if (target) {
19
+ self.target = target
20
+ self.mount()
21
+ } else self.clean()
22
+ },
23
+ mount() {
24
+ self.el = self.target
25
+ self.gl = self.target.getContext('webgl2')
26
+ self.init()
27
+ self.resize()
28
+ frame.start()
29
+ window.addEventListener('resize', self.resize)
30
+ window.addEventListener('mousemove', self.mousemove)
31
+ },
32
+ clean() {
33
+ frame.cancel()
34
+ window.removeEventListener('resize', self.resize)
35
+ window.removeEventListener('mousemove', self.mousemove)
36
+ },
37
+ }) as Partial<GL>
38
+
39
+ return useMemo(() => self(memo2)(memo1), [self, memo1, memo2])
19
40
  }
20
41
 
21
- export function useAttribute(props, self?: GL) {
22
- if (!self) self = gl.default
23
- return self.setAttribute(props)
42
+ export function useTexture(props: any, self = gl) {
43
+ return self.texture(props)
24
44
  }
25
45
 
26
- export function useUniform(props, self?: GL) {
27
- if (!self) self = gl.default
28
- return self.setUniform(props)
46
+ export function useAttribute(props: any, self = gl) {
47
+ return self.attribute(props)
29
48
  }
30
49
 
31
- export function useFrame(fun, self?: GL) {
32
- if (!self) self = gl.default
33
- const ref = useMutable(fun)
34
- useEffect(() => void self?.setFrame(ref), [ref, self])
50
+ export function useUniform(props: any, self = gl) {
51
+ return self.uniform(props)
35
52
  }
36
53
 
37
- export function useMutable(fun) {
38
- const ref = useRef(fun)
39
- return useCallback(() => ref.current(), [])
54
+ export function useFrame(fun: Fun, self = gl) {
55
+ const ref = useMutable(fun)
56
+ useEffect(() => self.frame(fun), [])
57
+ useEffect(() => () => self.frame(ref), [])
58
+ return self
40
59
  }
package/solid.ts CHANGED
@@ -1,25 +1,45 @@
1
- import { gl } from './index'
2
- import type { GL } from './types'
3
1
  import { onMount, onCleanup } from 'solid-js'
2
+ import { frame } from 'refr'
3
+ import { gl } from './index'
4
+ import type { Fun } from 'reev/types'
5
+
6
+ export function createGL(props?: any, self = gl) {
7
+ onCleanup(self.clean)
4
8
 
5
- export function createGL(config: Partial<GL>, _gl?: GL) {
6
- const self = _gl || (gl.default = gl(config))
7
- onMount(() => self.event('mount'))
8
- onCleanup(() => self.event('clean'))
9
- return self
9
+ return self({
10
+ ref(target: unknown) {
11
+ if (target) {
12
+ self.target = target
13
+ self.mount()
14
+ }
15
+ },
16
+ mount() {
17
+ self(props)
18
+ self.el = self.target
19
+ self.gl = self.target.getContext('webgl2')
20
+ self.init()
21
+ self.resize()
22
+ frame.start()
23
+ window.addEventListener('resize', self.resize)
24
+ window.addEventListener('mousemove', self.mousemove)
25
+ },
26
+ clean() {
27
+ self(props)
28
+ frame.cancel()
29
+ window.removeEventListener('resize', self.resize)
30
+ window.removeEventListener('mousemove', self.mousemove)
31
+ },
32
+ })
10
33
  }
11
34
 
12
- export function onFrame(fun: any, self: GL) {
13
- if (!self) self = gl.default
14
- onMount(() => self.setFrame(fun))
35
+ export function onFrame(fun: Fun, self = gl) {
36
+ onMount(() => self('render', fun))
15
37
  }
16
38
 
17
- export function setTexture(props, self?: GL) {
18
- if (!self) self = gl.default
19
- return self.setTexture(props)
39
+ export function setTexture(props: any, self = gl) {
40
+ return self.texture(props)
20
41
  }
21
42
 
22
- export function setAttribute(props, self?: GL) {
23
- if (!self) self = gl.default
24
- return self.setAttribute(props)
43
+ export function setAttribute(props: any, self = gl) {
44
+ return self.attribute(props)
25
45
  }
package/types.ts CHANGED
@@ -1,7 +1,4 @@
1
- /**
2
- * ref: https://stackoverflow.com/questions/52489261/typescript-can-i-define-an-n-length-tuple-type
3
- */
4
- import type { Frame, Fun } from 'refr'
1
+ import type { Queue } from 'refr/types'
5
2
  import type { Nested, EventState } from 'reev/types'
6
3
 
7
4
  export type Uniform = number | number[]
@@ -12,18 +9,7 @@ export type Attributes = Record<string, Attribute>
12
9
 
13
10
  export type Uniforms = Record<string, Uniform>
14
11
 
15
- export interface GLEvent {
16
- mount(): void
17
- clean(): void
18
- mousemove(e: Event): void
19
- resize(e?: Event): void
20
- load(e?: Event, image?: HTMLImageElement): void
21
- }
22
-
23
- export interface GL {
24
- (fun: Fun): GL
25
- (shader: string): GL
26
- (strings: TemplateStringsArray, ...args: any[]): GL
12
+ export type GL = EventState<{
27
13
  /**
28
14
  * initial value
29
15
  */
@@ -31,52 +17,67 @@ export interface GL {
31
17
  size: [number, number]
32
18
  mouse: [number, number]
33
19
  count: number
34
- frag: string
20
+ vs: string
21
+ fs: string
35
22
  vert: string
23
+ frag: string
24
+ vertex: string
25
+ fragment: string
36
26
  int: PrecisionMode
37
27
  float: PrecisionMode
38
28
  sampler2D: PrecisionMode
39
29
  samplerCube: PrecisionMode
40
30
  lastActiveUnit: number
41
- uniformHeader: [string, string][]
42
- attributeHeader: [string, string][]
31
+
43
32
  /**
44
33
  * core state
45
34
  */
46
35
  gl: any
47
36
  pg: any
48
37
  el: any
49
- event: EventState<GLEvent>
50
- frame: Frame
51
- stride: Nested<number> // @TODO Nested<(key: string, value: number: number[], ibo: number[]) => number>
38
+ frame: Queue
39
+ target: any
40
+ stride: Nested<number>
41
+ // @TODO Nested<(key: string, value: number: number[], ibo: number[]) => number>
52
42
  location: Nested<any>
53
43
  activeUnit: Nested<number>
54
- uniformType: Nested<string>
55
- vertexStride: Nested<number>
56
- default: GL
44
+ default: any
45
+
57
46
  /**
58
- * setter
47
+ * events
59
48
  */
60
- setDpr(...args: any[]): GL
61
- setSize(...args: any[]): GL
62
- setFrame(frame: Fun): GL
63
- setMount(frame: Fun): GL
64
- setClean(frame: Fun): GL
65
- setUniform(key: string, value: Uniform): GL
66
- setUniform(target: { [key: string]: Uniform }): GL
67
- setTexture(key: string, value: string): GL
68
- setTexture(target: { [key: string]: string }): GL
69
- setAttribute(key: string, value: Attribute, iboValue?: Attribute): GL
70
- setAttribute(target: { [key: string]: Attribute }): GL
71
- setConfig(key?: keyof GL, value?: GL[keyof GL]): GL
72
- setConfig(target?: Partial<GL>): GL
49
+ ref?: any
50
+ init(varying?: string[]): void
73
51
  mount(): void
74
52
  clean(): void
53
+ render(): void
54
+ mousemove(e: Event): void
55
+ resize(e?: Event, width?: number, height?: number): void
56
+ load(e?: Event, image?: HTMLImageElement): void
57
+
58
+ /**
59
+ * setter
60
+ */
61
+ _uniform(key: string, value: Uniform): GL
62
+ uniform(key: string, value: Uniform): GL
63
+ uniform(target: { [key: string]: Uniform }): GL
64
+ _texture(key: string, value: string): GL
65
+ texture(key: string, value: string): GL
66
+ texture(target: { [key: string]: string }): GL
67
+ _attribute(key: string, value: Attribute, iboValue?: Attribute): GL
68
+ attribute(key: string, value: Attribute, iboValue?: Attribute): GL
69
+ attribute(target: { [key: string]: Attribute }): GL
70
+ // config(key?: keyof GL, value?: GL[keyof GL]): GL
71
+ // config(target?: Partial<GL>): GL
72
+
73
+ /**
74
+ * short hands
75
+ */
75
76
  clear(key?: GLClearMode): void
76
77
  viewport(size?: [number, number]): void
77
78
  drawArrays(key?: GLDrawMode): void
78
79
  drawElements(key?: GLDrawMode): void
79
- }
80
+ }>
80
81
 
81
82
  export type PrecisionMode = 'highp' | 'mediump' | 'lowp'
82
83
 
package/utils.ts CHANGED
@@ -1,42 +1,30 @@
1
1
  /**
2
2
  * utils
3
3
  */
4
- export function interleave(strings: readonly string[], args: any[]) {
5
- let result = strings[0]
6
- for (let i = 0, len = args.length; i < len; i += 1)
7
- result += args[i] + strings[i + 1]
8
- return result
4
+ export function uniformType(value: number | number[], isMatrix = false) {
5
+ let length = typeof value === 'number' ? 0 : value?.length
6
+ if (!length) return `uniform1f`
7
+ if (!isMatrix) return `uniform${length}fv`
8
+ length = Math.sqrt(length) << 0
9
+ return `uniformMatrix${length}fv`
9
10
  }
10
11
 
11
- export function isTemplateLiteral(strings: unknown): strings is string[] {
12
- return Array.isArray(strings) && typeof strings[0] === "string"
13
- }
14
-
15
- export function includes(source: string, target: string) {
16
- source = source.replace(/\s+/g, '')
17
- target = target.replace(/\s+/g, '')
18
- return source.includes(target)
19
- }
20
-
21
- export function concat(source: string, target: string, key = "") {
22
- if (key === "" || source.includes(key))
23
- if (!includes(source, target))
24
- return target + source
25
- return source
26
- }
27
-
28
- export function switchUniformType(value: unknown, isMatrix = false) {
29
- let length = typeof value === "number" ? 0 : (value as any[]).length
30
- if (!length) return [`uniform1f`, `float`]
31
- if (!isMatrix) return [`uniform${length}fv`, `vec${length}`]
32
- length = Math.sqrt(length) << 0;
33
- return [`uniformMatrix${length}fv`, `mat${length}`]
12
+ export function vertexStride(
13
+ count: number,
14
+ value: number[],
15
+ iboValue?: number[]
16
+ ) {
17
+ if (iboValue) count = Math.max(...iboValue) + 1
18
+ const stride = value.length / count
19
+ if (stride !== stride << 0)
20
+ console.warn(`Vertex Stride Error: count ${count} is mismatch`)
21
+ return stride << 0
34
22
  }
35
23
 
36
24
  /**
37
25
  * graphics
38
26
  */
39
- export function createShader(gl, source, type) {
27
+ export function createShader(gl: any, source: string, type: unknown) {
40
28
  const shader = gl.createShader(type)
41
29
  gl.shaderSource(shader, source)
42
30
  gl.compileShader(shader)
@@ -45,7 +33,7 @@ export function createShader(gl, source, type) {
45
33
  } else console.warn(gl.getShaderInfoLog(shader))
46
34
  }
47
35
 
48
- export function createProgram(gl, vs, fs) {
36
+ export function createProgram(gl: any, vs: any, fs: any) {
49
37
  const program = gl.createProgram()
50
38
  gl.attachShader(program, vs)
51
39
  gl.attachShader(program, fs)
@@ -59,7 +47,22 @@ export function createProgram(gl, vs, fs) {
59
47
  }
60
48
  }
61
49
 
62
- export function createVbo(gl, data) {
50
+ export function createTfProgram(gl: any, vs: any, fs: any, varyings?: any) {
51
+ const pg = gl.createProgram()
52
+ gl.attachShader(pg, vs)
53
+ gl.attachShader(pg, fs)
54
+ gl.transformFeedbackVaryings(pg, varyings, gl.SEPARATE_ATTRIBS)
55
+ gl.linkProgram(pg)
56
+ if (gl.getProgramParameter(pg, gl.LINK_STATUS)) {
57
+ gl.useProgram(pg)
58
+ return pg
59
+ } else {
60
+ console.warn(gl.getProgramInfoLog(pg))
61
+ return null
62
+ }
63
+ }
64
+
65
+ export function createVbo(gl: any, data: number[]) {
63
66
  if (!data) return
64
67
  const vbo = gl.createBuffer()
65
68
  gl.bindBuffer(gl.ARRAY_BUFFER, vbo)
@@ -68,62 +71,121 @@ export function createVbo(gl, data) {
68
71
  return vbo
69
72
  }
70
73
 
71
- export function createIbo(gl, data) {
74
+ export function createIbo(gl: any, data?: number[]) {
72
75
  if (!data) return
73
76
  const ibo = gl.createBuffer()
74
77
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)
75
- gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(data), gl.STATIC_DRAW)
78
+ gl.bufferData(
79
+ gl.ELEMENT_ARRAY_BUFFER,
80
+ new Int16Array(data),
81
+ gl.STATIC_DRAW
82
+ )
76
83
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)
77
84
  return ibo
78
85
  }
79
86
 
80
- export function createAttribute(gl, stride, location, value, iboValue) {
81
- gl.bindBuffer(gl.ARRAY_BUFFER, createVbo(gl, value))
87
+ export function createAttribute(
88
+ gl: any,
89
+ stride: number,
90
+ location: any,
91
+ vbo: any,
92
+ ibo: any
93
+ ) {
94
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo)
82
95
  gl.enableVertexAttribArray(location)
83
96
  gl.vertexAttribPointer(location, stride, gl.FLOAT, false, 0, 0)
84
- if (iboValue)
85
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, createIbo(gl, iboValue))
97
+ if (ibo) gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)
86
98
  }
87
99
 
88
- export function createFramebuffer(gl, width, height) {
100
+ export function createFramebuffer(gl: any, width: number, height: number) {
89
101
  const frameBuffer = gl.createFramebuffer()
90
102
  gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer)
91
103
  const renderBuffer = gl.createRenderbuffer()
92
104
  gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer)
93
- gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height)
94
- gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderBuffer)
105
+ gl.renderbufferStorage(
106
+ gl.RENDERBUFFER,
107
+ gl.DEPTH_COMPONENT16,
108
+ width,
109
+ height
110
+ )
111
+ gl.framebufferRenderbuffer(
112
+ gl.FRAMEBUFFER,
113
+ gl.DEPTH_ATTACHMENT,
114
+ gl.RENDERBUFFER,
115
+ renderBuffer
116
+ )
95
117
  const texture = gl.createTexture()
96
118
  gl.bindTexture(gl.TEXTURE_2D, texture)
97
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)
119
+ gl.texImage2D(
120
+ gl.TEXTURE_2D,
121
+ 0,
122
+ gl.RGBA,
123
+ width,
124
+ height,
125
+ 0,
126
+ gl.RGBA,
127
+ gl.UNSIGNED_BYTE,
128
+ null
129
+ )
98
130
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
99
131
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
100
132
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
101
133
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
102
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)
134
+ gl.framebufferTexture2D(
135
+ gl.FRAMEBUFFER,
136
+ gl.COLOR_ATTACHMENT0,
137
+ gl.TEXTURE_2D,
138
+ texture,
139
+ 0
140
+ )
103
141
  gl.bindTexture(gl.TEXTURE_2D, null)
104
142
  gl.bindRenderbuffer(gl.RENDERBUFFER, null)
105
143
  gl.bindFramebuffer(gl.FRAMEBUFFER, null)
106
144
  return { frameBuffer, renderBuffer, texture }
107
145
  }
108
146
 
109
- export function createFramebufferFloat(gl, ext, width, height) {
110
- const flg = (ext.textureFloat != null) ? gl.FLOAT : ext.textureHalfFloat.HALF_FLOAT_OES
147
+ export function createFramebufferFloat(
148
+ gl: any,
149
+ ext: any,
150
+ width: number,
151
+ height: number
152
+ ) {
153
+ const flg =
154
+ ext.textureFloat != null
155
+ ? gl.FLOAT
156
+ : ext.textureHalfFloat.HALF_FLOAT_OES
111
157
  const frameBuffer = gl.createFramebuffer()
112
158
  const texture = gl.createTexture()
113
159
  gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer)
114
160
  gl.bindTexture(gl.TEXTURE_2D, texture)
115
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, flg, null)
161
+ gl.texImage2D(
162
+ gl.TEXTURE_2D,
163
+ 0,
164
+ gl.RGBA,
165
+ width,
166
+ height,
167
+ 0,
168
+ gl.RGBA,
169
+ flg,
170
+ null
171
+ )
116
172
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)
117
173
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)
118
174
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
119
175
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
120
- gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)
176
+ gl.framebufferTexture2D(
177
+ gl.FRAMEBUFFER,
178
+ gl.COLOR_ATTACHMENT0,
179
+ gl.TEXTURE_2D,
180
+ texture,
181
+ 0
182
+ )
121
183
  gl.bindTexture(gl.TEXTURE_2D, null)
122
184
  gl.bindFramebuffer(gl.FRAMEBUFFER, null)
123
185
  return { frameBuffer, texture }
124
186
  }
125
187
 
126
- export function createTexture(gl, img) {
188
+ export function createTexture(gl: any, img: any) {
127
189
  const texture = gl.createTexture()
128
190
  gl.bindTexture(gl.TEXTURE_2D, texture)
129
191
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img)
@@ -134,4 +196,15 @@ export function createTexture(gl, img) {
134
196
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
135
197
  gl.bindTexture(gl.TEXTURE_2D, null)
136
198
  return texture
137
- }
199
+ }
200
+
201
+ export function activeTexture(
202
+ gl: any,
203
+ location: any,
204
+ activeUnit: any,
205
+ texture: any
206
+ ) {
207
+ gl.uniform1i(location, activeUnit)
208
+ gl.activeTexture(gl['TEXTURE' + activeUnit])
209
+ gl.bindTexture(gl.TEXTURE_2D, texture)
210
+ }
package/events.ts DELETED
@@ -1,105 +0,0 @@
1
- import { event } from 'reev'
2
- import { createProgram, createShader, createTexture, concat } from './utils'
3
- import type { GL, GLEvent } from './types'
4
-
5
- export const glEvent = (self: GL) => {
6
- const e = event<GLEvent>()
7
- return e({
8
- // run if canvas is mounted
9
- mount() {
10
- if (self.int)
11
- self.frag = concat(
12
- self.frag,
13
- `precision ${self.int} int;`
14
- )
15
- if (self.float)
16
- self.frag = concat(
17
- self.frag,
18
- `precision ${self.float} float;`
19
- )
20
- if (self.sampler2D)
21
- self.frag = concat(
22
- self.frag,
23
- `precision ${self.sampler2D} sampler2D;`
24
- )
25
- if (self.samplerCube)
26
- self.frag = concat(
27
- self.frag,
28
- `precision ${self.samplerCube} samplerCube;`
29
- )
30
- const el = (self.el = document.getElementById(self.id))
31
- const gl = (self.gl = (el as any)?.getContext('webgl'))
32
- const frag = createShader(
33
- gl,
34
- self.frag,
35
- gl.FRAGMENT_SHADER
36
- )
37
- const vert = createShader(
38
- gl,
39
- self.vert,
40
- gl.VERTEX_SHADER
41
- )
42
- self.pg = createProgram(gl, vert, frag)
43
- window.addEventListener('resize', e.resize)
44
- window.addEventListener('mousemove', e.mousemove)
45
- e.resize()
46
- let iTime = performance.now(),
47
- iPrevTime = 0,
48
- iDeltaTime = 0
49
- self.setFrame(() => {
50
- iPrevTime = iTime
51
- iTime = performance.now() / 1000
52
- iDeltaTime = iTime - iPrevTime
53
- self.setUniform({
54
- iTime,
55
- iPrevTime,
56
- iDeltaTime,
57
- })
58
- return true
59
- })
60
- self.frame()
61
- },
62
- // run if canvas is cleaned
63
- clean() {
64
- window.removeEventListener('resize', e.resize)
65
- window.removeEventListener('mousemove', e.mousemove)
66
- self.frame.cancel()
67
- },
68
- // user mousemove event
69
- mousemove({ clientX, clientY }) {
70
- const [w, h] = self.size
71
- self.mouse[0] = (clientX - w / 2) / (w / 2)
72
- self.mouse[1] = -(clientY - h / 2) / (h / 2)
73
- self.setUniform('iMouse', self.mouse)
74
- },
75
- // user mousemove event
76
- resize(
77
- _resizeEvent,
78
- width = window.innerWidth,
79
- height = window.innerHeight
80
- ) {
81
- self.size[0] = self.el.width = width
82
- self.size[1] = self.el.height = height
83
- self.setUniform('iResolution', self.size)
84
- },
85
- // load image event
86
- load(_loadEvent, image) {
87
- self.setFrame(() => {
88
- const activeUnit = self.activeUnit(image.alt)
89
- const location = self.location(image.alt)
90
- const texture = createTexture(self.gl, image)
91
- self.setFrame(() => {
92
- self.gl.uniform1i(location, activeUnit)
93
- self.gl.activeTexture(
94
- self.gl['TEXTURE' + activeUnit]
95
- )
96
- self.gl.bindTexture(
97
- self.gl.TEXTURE_2D,
98
- texture
99
- )
100
- return true
101
- })
102
- })
103
- },
104
- } as any)
105
- }