glre 0.1.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/events.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { event } from 'reev'
2
+ import { createProgram, createShader, createTexture } from './utils'
3
+ import type { GL } from './types'
4
+
5
+ export const glEvent = (self: GL) =>
6
+ event({
7
+ // run if canvas is mounted
8
+ mount(e) {
9
+ // @ts-ignore
10
+ const el = (self.el = document.getElementById(self.id)); // @ts-ignore
11
+ const gl = (self.gl = el?.getContext("webgl"));
12
+ const frag = createShader(gl, self.frag, gl?.FRAGMENT_SHADER);
13
+ const vert = createShader(gl, self.vert, gl?.VERTEX_SHADER);
14
+ self.pg = createProgram(gl, vert, frag); // !!!
15
+ window.addEventListener("resize", e.on("resize"));
16
+ window.addEventListener("mousemove", e.on("mousemove"));
17
+ e("resize");
18
+ self.frame();
19
+ },
20
+ // run if canvas is cleaned
21
+ clean(e) {
22
+ window.removeEventListener("resize", e.on("resize"));
23
+ window.removeEventListener("mousemove", e.on("mousemove"));
24
+ },
25
+ // user mousemove event
26
+ mousemove(_e, { clientX, clientY }, ...args) {
27
+ const [w, h] = self.size;
28
+ self.mouse[0] = (clientX - w / 2) / (w / 2);
29
+ self.mouse[1] = -(clientY - h / 2) / (h / 2);
30
+ self.setUniform("mouse", self.mouse);
31
+ },
32
+ // user mousemove event
33
+ resize(_e, _resizeEvent, width = 0, height = 0) {
34
+ self.size[0] = self.el.width = width || window.innerWidth;
35
+ self.size[1] = self.el.height = height || window.innerHeight;
36
+ self.setUniform("resolution", self.size);
37
+ },
38
+ // load image event
39
+ load(_e, loadEvent) {
40
+ self.setFrame(() => {
41
+ const image = loadEvent.path[0];
42
+ const activeUnit = self.activeUnit(image.alt);
43
+ const location = self.location(image.alt);
44
+ const texture = createTexture(self.gl, image);
45
+ self.setFrame(() => {
46
+ self.gl.uniform1i(location, activeUnit);
47
+ self.gl.activeTexture(self.gl["TEXTURE" + activeUnit]);
48
+ self.gl.bindTexture(self.gl.TEXTURE_2D, texture);
49
+ return true;
50
+ });
51
+ });
52
+ }
53
+ });
package/index.cjs.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("refr"),n=require("reev");function t(e,n,t){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.warn(e.getShaderInfoLog(r))}var r=function(e){return n.event({mount:function(n){var r=e.el=document.getElementById(e.id),i=e.gl=null==r?void 0:r.getContext("webgl"),o=t(i,e.frag,null==i?void 0:i.FRAGMENT_SHADER),u=t(i,e.vert,null==i?void 0:i.VERTEX_SHADER);e.pg=function(e,n,t){var r=e.createProgram();return e.attachShader(r,n),e.attachShader(r,t),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?(e.useProgram(r),r):(console.log(e.getProgramInfoLog(r)),null)}(i,u,o),window.addEventListener("resize",n.on("resize")),window.addEventListener("mousemove",n.on("mousemove")),n("resize"),e.frame()},clean:function(e){window.removeEventListener("resize",e.on("resize")),window.removeEventListener("mousemove",e.on("mousemove"))},mousemove:function(n,t){var r=t.clientX,i=t.clientY,o=e.size,u=o[0],a=o[1];e.mouse[0]=(r-u/2)/(u/2),e.mouse[1]=-(i-a/2)/(a/2),e.setUniform("mouse",e.mouse)},resize:function(n,t,r,i){void 0===r&&(r=0),void 0===i&&(i=0),e.size[0]=e.el.width=r||window.innerWidth,e.size[1]=e.el.height=i||window.innerHeight,e.setUniform("resolution",e.size)},load:function(n,t){e.setFrame((function(){var n=t.path[0],r=e.activeUnit(n.alt),i=e.location(n.alt),o=function(e,n){var t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),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}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(i,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,o),!0}))}))}})};function i(t){var i,o,u,a,l,f,c,s,v;void 0===t&&(t={});var d=function e(n){if(void 0===n&&(n=""),"function"==typeof n)return e.frame.mount(n)};return d.id=null!=(i=t.id)?i:"myCanvas",d.size=null!=(o=t.size)?o:[0,0],d.mouse=null!=(u=t.mouse)?u:[0,0],d.count=null!=(a=t.count)?a:1e3,d.frag=null!=(l=null!=(f=t.frag)?f:t.fragShader)?l:"",d.vert=null!=(c=null!=(s=t.vert)?s:t.vertShader)?c:"",d.lastActiveUnit=null!=(v=t.lastActiveUnit)?v:0,d.event=r(d),d.frame=e.frame(),d.stride=n.nested((function(e,n){return void 0===n&&(n=[]),n.length/d.count<<0})),d.activeUnit=n.nested((function(){return d.lastActiveUnit++})),d.uniformType=n.nested((function(e,n,t){return void 0===n&&(n=[]),void 0===t&&(t=!1),"number"==typeof n?"uniform1f":t?"uniformMatrix"+(Math.sqrt(n.length)<<0)+"fv":"uniform"+n.length+"fv"})),d.location=n.nested((function(e,n){var t,r;return void 0===n&&(n=!1),n?null==(t=d.gl)?void 0:t.getAttribLocation(d.pg,e):null==(r=d.gl)?void 0:r.getUniformLocation(d.pg,e)})),d.setDpr=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void d.event.apply(d,["resize"].concat(n))||d},d.setSize=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void d.event.apply(d,["resize"].concat(n))||d},d.setFrame=function(e){return void d.frame.mount(e)||d},d.setMount=function(e){return void d.event.mount({mount:e})||d},d.setClean=function(e){return void d.event.mount({clean:e})||d},d.setUniform=n.durable((function(e,n,t){void 0===t&&(t=!1);var r=d.uniformType(e,n,t);d.setFrame(t?function(){return d.gl[r](d.location(e),!1,n)}:function(){return d.gl[r](d.location(e),n)})}),d),d.setAttribute=n.durable((function(e,n,t){d.setFrame((function(){var r=d.gl,i=d.stride(e,n),o=d.location(e,!0);r.bindBuffer(r.ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array(n),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),t}}(r,n)),r.enableVertexAttribArray(o),r.vertexAttribPointer(o,i,r.FLOAT,!1,0,0),t&&r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(n),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),t}}(r,t))}))}),d),d.setTexture=n.durable((function(e,n){var t=new Image;t.addEventListener("load",d.event.on("load"),!1),Object.assign(t,{src:n,alt:e,crossOrigin:"anonymous"})}),d),d}exports.default=i,exports.gl=i;
@@ -0,0 +1 @@
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("refr"),require("reev")):"function"==typeof define&&define.amd?define(["exports","refr","reev"],n):n(((e="undefined"!=typeof globalThis?globalThis:e||self).index=e.index||{},e.index.ts={}),e.refr,e.reev)}(this,(function(e,n,t){"use strict";function r(e,n,t){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.warn(e.getShaderInfoLog(r))}var i=function(e){return t.event({mount:function(n){var t=e.el=document.getElementById(e.id),i=e.gl=null==t?void 0:t.getContext("webgl"),o=r(i,e.frag,null==i?void 0:i.FRAGMENT_SHADER),u=r(i,e.vert,null==i?void 0:i.VERTEX_SHADER);e.pg=function(e,n,t){var r=e.createProgram();return e.attachShader(r,n),e.attachShader(r,t),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?(e.useProgram(r),r):(console.log(e.getProgramInfoLog(r)),null)}(i,u,o),window.addEventListener("resize",n.on("resize")),window.addEventListener("mousemove",n.on("mousemove")),n("resize"),e.frame()},clean:function(e){window.removeEventListener("resize",e.on("resize")),window.removeEventListener("mousemove",e.on("mousemove"))},mousemove:function(n,t){var r=t.clientX,i=t.clientY,o=e.size,u=o[0],a=o[1];e.mouse[0]=(r-u/2)/(u/2),e.mouse[1]=-(i-a/2)/(a/2),e.setUniform("mouse",e.mouse)},resize:function(n,t,r,i){void 0===r&&(r=0),void 0===i&&(i=0),e.size[0]=e.el.width=r||window.innerWidth,e.size[1]=e.el.height=i||window.innerHeight,e.setUniform("resolution",e.size)},load:function(n,t){e.setFrame((function(){var n=t.path[0],r=e.activeUnit(n.alt),i=e.location(n.alt),o=function(e,n){var t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),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}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(i,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,o),!0}))}))}})};function o(e){var r,o,u,a,f,l,d,s,c;void 0===e&&(e={});var v=function e(n){if(void 0===n&&(n=""),"function"==typeof n)return e.frame.mount(n)};return v.id=null!=(r=e.id)?r:"myCanvas",v.size=null!=(o=e.size)?o:[0,0],v.mouse=null!=(u=e.mouse)?u:[0,0],v.count=null!=(a=e.count)?a:1e3,v.frag=null!=(f=null!=(l=e.frag)?l:e.fragShader)?f:"",v.vert=null!=(d=null!=(s=e.vert)?s:e.vertShader)?d:"",v.lastActiveUnit=null!=(c=e.lastActiveUnit)?c:0,v.event=i(v),v.frame=n.frame(),v.stride=t.nested((function(e,n){return void 0===n&&(n=[]),n.length/v.count<<0})),v.activeUnit=t.nested((function(){return v.lastActiveUnit++})),v.uniformType=t.nested((function(e,n,t){return void 0===n&&(n=[]),void 0===t&&(t=!1),"number"==typeof n?"uniform1f":t?"uniformMatrix"+(Math.sqrt(n.length)<<0)+"fv":"uniform"+n.length+"fv"})),v.location=t.nested((function(e,n){var t,r;return void 0===n&&(n=!1),n?null==(t=v.gl)?void 0:t.getAttribLocation(v.pg,e):null==(r=v.gl)?void 0:r.getUniformLocation(v.pg,e)})),v.setDpr=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void v.event.apply(v,["resize"].concat(n))||v},v.setSize=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void v.event.apply(v,["resize"].concat(n))||v},v.setFrame=function(e){return void v.frame.mount(e)||v},v.setMount=function(e){return void v.event.mount({mount:e})||v},v.setClean=function(e){return void v.event.mount({clean:e})||v},v.setUniform=t.durable((function(e,n,t){void 0===t&&(t=!1);var r=v.uniformType(e,n,t);v.setFrame(t?function(){return v.gl[r](v.location(e),!1,n)}:function(){return v.gl[r](v.location(e),n)})}),v),v.setAttribute=t.durable((function(e,n,t){v.setFrame((function(){var r=v.gl,i=v.stride(e,n),o=v.location(e,!0);r.bindBuffer(r.ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array(n),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),t}}(r,n)),r.enableVertexAttribArray(o),r.vertexAttribPointer(o,i,r.FLOAT,!1,0,0),t&&r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(n),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),t}}(r,t))}))}),v),v.setTexture=t.durable((function(e,n){var t=new Image;t.addEventListener("load",v.event.on("load"),!1),Object.assign(t,{src:n,alt:e,crossOrigin:"anonymous"})}),v),v}e.default=o,e.gl=o,Object.defineProperty(e,"__esModule",{value:!0})}));
package/index.js ADDED
@@ -0,0 +1 @@
1
+ import{frame as e}from"refr";import{event as n,nested as t,durable as r}from"reev";function o(e,n,t){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.warn(e.getShaderInfoLog(r))}var i=function(e){return n({mount:function(n){var t=e.el=document.getElementById(e.id),r=e.gl=null==t?void 0:t.getContext("webgl"),i=o(r,e.frag,null==r?void 0:r.FRAGMENT_SHADER),u=o(r,e.vert,null==r?void 0:r.VERTEX_SHADER);e.pg=function(e,n,t){var r=e.createProgram();return e.attachShader(r,n),e.attachShader(r,t),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)?(e.useProgram(r),r):(console.log(e.getProgramInfoLog(r)),null)}(r,u,i),window.addEventListener("resize",n.on("resize")),window.addEventListener("mousemove",n.on("mousemove")),n("resize"),e.frame()},clean:function(e){window.removeEventListener("resize",e.on("resize")),window.removeEventListener("mousemove",e.on("mousemove"))},mousemove:function(n,t){var r=t.clientX,o=t.clientY,i=e.size,u=i[0],a=i[1];e.mouse[0]=(r-u/2)/(u/2),e.mouse[1]=-(o-a/2)/(a/2),e.setUniform("mouse",e.mouse)},resize:function(n,t,r,o){void 0===r&&(r=0),void 0===o&&(o=0),e.size[0]=e.el.width=r||window.innerWidth,e.size[1]=e.el.height=o||window.innerHeight,e.setUniform("resolution",e.size)},load:function(n,t){e.setFrame((function(){var n=t.path[0],r=e.activeUnit(n.alt),o=e.location(n.alt),i=function(e,n){var t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),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}(e.gl,n);e.setFrame((function(){return e.gl.uniform1i(o,r),e.gl.activeTexture(e.gl["TEXTURE"+r]),e.gl.bindTexture(e.gl.TEXTURE_2D,i),!0}))}))}})};function u(n){var o,u,a,l,f,c,E,v,m;void 0===n&&(n={});var s=function e(n){if(void 0===n&&(n=""),"function"==typeof n)return e.frame.mount(n)};return s.id=null!=(o=n.id)?o:"myCanvas",s.size=null!=(u=n.size)?u:[0,0],s.mouse=null!=(a=n.mouse)?a:[0,0],s.count=null!=(l=n.count)?l:1e3,s.frag=null!=(f=null!=(c=n.frag)?c:n.fragShader)?f:"",s.vert=null!=(E=null!=(v=n.vert)?v:n.vertShader)?E:"",s.lastActiveUnit=null!=(m=n.lastActiveUnit)?m:0,s.event=i(s),s.frame=e(),s.stride=t((function(e,n){return void 0===n&&(n=[]),n.length/s.count<<0})),s.activeUnit=t((function(){return s.lastActiveUnit++})),s.uniformType=t((function(e,n,t){return void 0===n&&(n=[]),void 0===t&&(t=!1),"number"==typeof n?"uniform1f":t?"uniformMatrix"+(Math.sqrt(n.length)<<0)+"fv":"uniform"+n.length+"fv"})),s.location=t((function(e,n){var t,r;return void 0===n&&(n=!1),n?null==(t=s.gl)?void 0:t.getAttribLocation(s.pg,e):null==(r=s.gl)?void 0:r.getUniformLocation(s.pg,e)})),s.setDpr=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void s.event.apply(s,["resize"].concat(n))||s},s.setSize=function(){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];return void s.event.apply(s,["resize"].concat(n))||s},s.setFrame=function(e){return void s.frame.mount(e)||s},s.setMount=function(e){return void s.event.mount({mount:e})||s},s.setClean=function(e){return void s.event.mount({clean:e})||s},s.setUniform=r((function(e,n,t){void 0===t&&(t=!1);var r=s.uniformType(e,n,t);s.setFrame(t?function(){return s.gl[r](s.location(e),!1,n)}:function(){return s.gl[r](s.location(e),n)})}),s),s.setAttribute=r((function(e,n,t){s.setFrame((function(){var r=s.gl,o=s.stride(e,n),i=s.location(e,!0);r.bindBuffer(r.ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array(n),e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,null),t}}(r,n)),r.enableVertexAttribArray(i),r.vertexAttribPointer(i,o,r.FLOAT,!1,0,0),t&&r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,function(e,n){if(n){var t=e.createBuffer();return e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Int16Array(n),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null),t}}(r,t))}))}),s),s.setTexture=r((function(e,n){var t=new Image;t.addEventListener("load",s.event.on("load"),!1),Object.assign(t,{src:n,alt:e,crossOrigin:"anonymous"})}),s),s}export{u as default,u as gl};
package/index.ts ADDED
@@ -0,0 +1,78 @@
1
+ import { frame } from 'refr'
2
+ import { nested, durable } from 'reev'
3
+ import { glEvent } from './events'
4
+ import { createVbo, createIbo } from './utils'
5
+ import type { GL, GLConfig } from './types'
6
+
7
+ export * from './types'
8
+
9
+ export default gl
10
+
11
+ export function gl(config: GLConfig = {}) {
12
+ const self = ((arg = '') => {
13
+ if (typeof arg === 'function') return self.frame.mount(arg)
14
+ }) as GL
15
+
16
+ // initial value
17
+ self.id = config.id ?? 'myCanvas'
18
+ self.size = config.size ?? [0, 0]
19
+ self.mouse = config.mouse ?? [0, 0]
20
+ self.count = config.count ?? 1000
21
+ self.frag = config.frag ?? config.fragShader ?? ''
22
+ self.vert = config.vert ?? config.vertShader ?? ''
23
+ self.lastActiveUnit = config.lastActiveUnit ?? 0
24
+
25
+ // core state
26
+ self.event = glEvent(self)
27
+ self.frame = frame()
28
+ self.stride = nested((_key, value: any = []) => (value.length / self.count) << 0)
29
+ self.activeUnit = nested(() => self.lastActiveUnit++)
30
+ self.uniformType = nested((_key, value: any = [], isMatrix = false) => {
31
+ if (typeof value === 'number') return `uniform1f`
32
+ if (!isMatrix) return `uniform${value.length}fv`
33
+ else return `uniformMatrix${Math.sqrt(value.length) << 0}fv`
34
+ })
35
+ self.location = nested((key, isAttribute = false) => {
36
+ return isAttribute
37
+ ? self.gl?.getAttribLocation(self.pg, key)
38
+ : self.gl?.getUniformLocation(self.pg, key)
39
+ })
40
+
41
+ // setter
42
+ self.setDpr = (...args) => void self.event('resize', ...args) || self
43
+ self.setSize = (...args) => void self.event('resize', ...args) || self
44
+ self.setFrame = (frame) => void self.frame.mount(frame) || self
45
+ self.setMount = (mount) => void self.event.mount({ mount }) || self
46
+ self.setClean = (clean) => void self.event.mount({ clean }) || self
47
+
48
+ // uniform
49
+ self.setUniform = durable((key, value, isMatrix = false) => {
50
+ const type = self.uniformType(key, value, isMatrix)
51
+ if (isMatrix)
52
+ self.setFrame(() => self.gl[type](self.location(key), false, value))
53
+ else self.setFrame(() => self.gl[type](self.location(key), value))
54
+ }, self)
55
+
56
+ // attribute
57
+ self.setAttribute = durable((key, value, iboValue) => {
58
+ self.setFrame(() => {
59
+ const { gl } = self
60
+ const stride = self.stride(key, value)
61
+ const location = self.location(key, true)
62
+ gl.bindBuffer(gl.ARRAY_BUFFER, createVbo(gl, value))
63
+ gl.enableVertexAttribArray(location)
64
+ gl.vertexAttribPointer(location, stride, gl.FLOAT, false, 0, 0)
65
+ if (iboValue)
66
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, createIbo(gl, iboValue))
67
+ })
68
+ }, self)
69
+
70
+ // texture
71
+ self.setTexture = durable((key, src) => {
72
+ const image = new Image()
73
+ image.addEventListener('load', self.event.on('load'), false)
74
+ Object.assign(image, { src, alt: key, crossOrigin: 'anonymous' })
75
+ }, self)
76
+
77
+ return self
78
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "glre",
3
+ "author": "tseijp",
4
+ "license": "MIT",
5
+ "version": "0.1.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.3.0",
17
+ "refr": "0.2.0"
18
+ },
19
+ "keywords": [
20
+ "glsl",
21
+ "webgl",
22
+ "hooks",
23
+ "react",
24
+ "reactjs",
25
+ "reactive",
26
+ "solid",
27
+ "typescript"
28
+ ],
29
+ "files": [
30
+ "index.js",
31
+ "index.cjs.js",
32
+ "index.develop.js",
33
+ "index.product.js",
34
+ "index.ts",
35
+ "events.ts",
36
+ "helpers.ts",
37
+ "utils.ts",
38
+ "types.ts"
39
+ ]
40
+ }
package/types.ts ADDED
@@ -0,0 +1,62 @@
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'
5
+ import type { Nested, Event } from 'reev'
6
+
7
+ export type Uniform = number | number[]
8
+
9
+ export type Attribute = number[]
10
+
11
+ export type Attributes = Record<string, Attribute>
12
+
13
+ export type Uniforms = Record<string, Uniform>
14
+
15
+ export interface GL {
16
+ (shader: string): GL
17
+ /**
18
+ * initial value
19
+ */
20
+ id: string
21
+ size: [number, number]
22
+ mouse: [number, number]
23
+ count: number
24
+ frag: string
25
+ vert: string
26
+ lastActiveUnit: number
27
+ /**
28
+ * core state
29
+ */
30
+ gl: any
31
+ pg: any
32
+ el: any
33
+ event: Event
34
+ frame: Frame
35
+ stride: Nested<number>
36
+ location: Nested<any>
37
+ activeUnit: Nested<number>
38
+ uniformType: Nested<string>
39
+ /**
40
+ * setter
41
+ */
42
+ setDpr(...args: any[]): GL
43
+ setSize(...args: any[]): GL
44
+ setFrame(frame: Fun): GL
45
+ setMount(frame: Fun): GL
46
+ setClean(frame: Fun): GL
47
+ setUniform(key: string, value: Uniform): GL
48
+ setAttribute(key: string, value: Attribute, iboValue?: Attribute): GL
49
+ setTexture(key: string, value: string): GL
50
+ }
51
+
52
+ export interface GLConfig {
53
+ id?: string
54
+ size?: [number, number]
55
+ mouse?: [number, number]
56
+ count?: number
57
+ frag?: string
58
+ vert?: string
59
+ fragShader?: string
60
+ vertShader?: string
61
+ lastActiveUnit?: number
62
+ }
package/utils.ts ADDED
@@ -0,0 +1,148 @@
1
+ export function createShader(gl, source, type) {
2
+ const shader = gl.createShader(type)
3
+ gl.shaderSource(shader, source)
4
+ gl.compileShader(shader)
5
+ if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
6
+ return shader
7
+ } else console.warn(gl.getShaderInfoLog(shader))
8
+ }
9
+
10
+ export function createProgram(gl, vs, fs) {
11
+ const program = gl.createProgram()
12
+ gl.attachShader(program, vs)
13
+ gl.attachShader(program, fs)
14
+ gl.linkProgram(program)
15
+ if (gl.getProgramParameter(program, gl.LINK_STATUS)) {
16
+ gl.useProgram(program)
17
+ return program
18
+ } else {
19
+ console.log(gl.getProgramInfoLog(program))
20
+ return null
21
+ }
22
+ }
23
+
24
+ export function createVbo(gl, data) {
25
+ if (!data) return
26
+ const vbo = gl.createBuffer()
27
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo)
28
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW)
29
+ gl.bindBuffer(gl.ARRAY_BUFFER, null)
30
+ return vbo
31
+ }
32
+
33
+ export function createIbo(gl, data) {
34
+ if (!data) return
35
+ const ibo = gl.createBuffer()
36
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo)
37
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(data), gl.STATIC_DRAW)
38
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null)
39
+ return ibo
40
+ }
41
+
42
+ export function createFramebuffer(gl, width, height) {
43
+ const frameBuffer = gl.createFramebuffer()
44
+ gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer)
45
+ const renderBuffer = gl.createRenderbuffer()
46
+ gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer)
47
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height)
48
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderBuffer)
49
+ const texture = gl.createTexture()
50
+ gl.bindTexture(gl.TEXTURE_2D, texture)
51
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null)
52
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
53
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
54
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
55
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
56
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)
57
+ gl.bindTexture(gl.TEXTURE_2D, null)
58
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null)
59
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null)
60
+ return { frameBuffer, renderBuffer, texture }
61
+ }
62
+
63
+ export function createFramebufferFloat(gl, ext, width, height) {
64
+ const flg = (ext.textureFloat != null) ? gl.FLOAT : ext.textureHalfFloat.HALF_FLOAT_OES
65
+ const frameBuffer = gl.createFramebuffer()
66
+ const texture = gl.createTexture()
67
+ gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer)
68
+ gl.bindTexture(gl.TEXTURE_2D, texture)
69
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, flg, null)
70
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)
71
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)
72
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
73
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
74
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)
75
+ gl.bindTexture(gl.TEXTURE_2D, null)
76
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null)
77
+ return { frameBuffer, texture }
78
+ }
79
+
80
+ export function createTexture(gl, img) {
81
+ const texture = gl.createTexture()
82
+ gl.bindTexture(gl.TEXTURE_2D, texture)
83
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img)
84
+ gl.generateMipmap(gl.TEXTURE_2D)
85
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
86
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
87
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
88
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
89
+ gl.bindTexture(gl.TEXTURE_2D, null)
90
+ return texture
91
+ }
92
+
93
+ export function lookAt(eye = [0, 0, 3], center = [0, 0, 0], up = [0, 1, 0]) {
94
+ const ret = new Float32Array(16)
95
+ const [ex, ey, ez] = eye
96
+ const [cx, cy, cz] = center
97
+ const [ux, uy, uz] = up
98
+ let [z0, z1, z2] = [ex - cx, ey - cy, ez - cz]
99
+ let lz = 1 / Math.sqrt(z0 ** 2 + z1 ** 2 + z2 ** 2)
100
+ ;[z0, z1, z2] = !lz ? [0, 0, 0] : [z0 * lz, z1 * lz, z2 * lz]
101
+ let [x0, x1, x2] = [uy * z2 - uz * z1, uz * z0 - ux * z2, ux * z1 - uy * z0]
102
+ let lx = 1 / Math.sqrt(x0 ** 2 + x1 ** 2 + x2 ** 2)
103
+ ;[x0, x1, x2] = !lx ? [0, 0, 0] : [x0 * lx, x1 * lx, x2 * lx]
104
+ let [y0, y1, y2] = [z1 * x2 - z2 * x1, z2 * x0 - z0 * x2, z0 * x1 - z1 * x0]
105
+ let ly = 1 / Math.sqrt(y0 ** 2 + y1 ** 2 + y2 ** 2)
106
+ ;[y0, y1, y2] = !ly ? [0, 0, 0] : [y0 * ly, y1 * ly, y2 * ly]
107
+ ret[0] = x0
108
+ ret[1] = y0
109
+ ret[2] = z0
110
+ ret[3] = 0
111
+ ret[4] = x1
112
+ ret[5] = y1
113
+ ret[6] = z1
114
+ ret[7] = 0
115
+ ret[8] = x2
116
+ ret[9] = y2
117
+ ret[10] = z2
118
+ ret[11] = 0
119
+ ret[12] = -(x0 * ex + x1 * ey + x2 * ez)
120
+ ret[13] = -(y0 * ex + y1 * ey + y2 * ez)
121
+ ret[14] = -(z0 * ex + z1 * ey + z2 * ez)
122
+ ret[15] = 1
123
+ return ret
124
+ }
125
+
126
+ export function perspective(fovy = 60, aspect = 1, near = 0.1, far = 10) {
127
+ const ret = new Float32Array(16)
128
+ const r = 1 / Math.tan((fovy * Math.PI) / 360)
129
+ const d = far - near
130
+ ret[0] = r / aspect
131
+ ret[1] = ret[2] = ret[3] = ret[4] = 0
132
+ ret[6] = ret[7] = ret[8] = ret[9] = 0
133
+ ret[12] = ret[13] = ret[15] = 0
134
+ ret[5] = r
135
+ ret[10] = -(far + near) / d
136
+ ret[11] = -1
137
+ ret[14] = -(far * near * 2) / d
138
+ return ret
139
+ }
140
+
141
+ export function identity() {
142
+ const ret = new Float32Array(16)
143
+ ret[1] = ret[2] = ret[3] = ret[4] = 0
144
+ ret[6] = ret[7] = ret[8] = ret[9] = 0
145
+ ret[11] = ret[12] = ret[13] = ret[14] = 0
146
+ ret[0] = ret[5] = ret[10] = ret[15] = 1
147
+ return ret
148
+ }