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 +53 -0
- package/index.cjs.js +1 -0
- package/index.develop.js +1 -0
- package/index.js +1 -0
- package/index.ts +78 -0
- package/package.json +40 -0
- package/types.ts +62 -0
- package/utils.ts +148 -0
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;
|
package/index.develop.js
ADDED
|
@@ -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
|
+
}
|