rapid-render 1.0.23 → 1.0.26
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/README.md +43 -1
- package/dist/matrix-engine.d.ts +8 -3
- package/dist/rapid-render.js +4 -4
- package/dist/rapid-render.umd.cjs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -129,7 +129,49 @@ rapid.drawSprite({
|
|
|
129
129
|
rapid.flush();
|
|
130
130
|
```
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
## Cache MatrixStack Transforms
|
|
133
|
+
|
|
134
|
+
Use `retainMatrix()` to keep a matrix from the current stack across `rapid.clear()` / `stack.reset()`. It returns the supplied matrix ID or save state. Pass cached IDs to `save(world, local)` to reuse them directly:
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
const stack = rapid.matrixStack;
|
|
138
|
+
|
|
139
|
+
// Calculate and retain the transform once.
|
|
140
|
+
stack.save();
|
|
141
|
+
stack.translate(100, 80);
|
|
142
|
+
const world = stack.retainMatrix(stack.curWorldM);
|
|
143
|
+
const local = stack.retainMatrix(stack.curLocalM);
|
|
144
|
+
stack.restore();
|
|
145
|
+
|
|
146
|
+
function drawFrame() {
|
|
147
|
+
rapid.clear();
|
|
148
|
+
stack.save(world, local);
|
|
149
|
+
rapid.drawSprite({ texture });
|
|
150
|
+
stack.restore();
|
|
151
|
+
rapid.flush();
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Alternatively, `const cached = stack.retainMatrix(stack.save())` retains both matrices; reuse them with `stack.save(cached.world, cached.local)`.
|
|
156
|
+
|
|
157
|
+
`save()` accepts either or both IDs:
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
stack.save(); // Identity local; world inherits the parent.
|
|
161
|
+
stack.save(world, local); // Use both IDs directly without allocating matrices.
|
|
162
|
+
stack.save(world); // Use world; create an identity local.
|
|
163
|
+
stack.save(undefined, local); // Use local; calculate world = parent world * local.
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Matrices retained with `stack.retainMatrix()` or created with `rapid.matrix.alloc()` are managed by you. Release them when no longer needed:
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
rapid.matrix.free(world);
|
|
170
|
+
rapid.matrix.free(local);
|
|
171
|
+
|
|
172
|
+
const m = rapid.matrix.alloc();
|
|
173
|
+
rapid.matrix.free(m);
|
|
174
|
+
```
|
|
133
175
|
|
|
134
176
|
With this flexible matrix stack, you can build your own architecture with minimal friction. It doesn't care how you organize your game logic. You can use ECS, scene graphs, components, or any hybrid approach you prefer.
|
|
135
177
|
|
package/dist/matrix-engine.d.ts
CHANGED
|
@@ -240,9 +240,13 @@ export declare class MatrixStack {
|
|
|
240
240
|
/**
|
|
241
241
|
* Saves the current matrix state and pushes it onto the stack.
|
|
242
242
|
* Equivalent to context.save().
|
|
243
|
+
* Provided matrix IDs are used directly and remain caller-owned; only matrices
|
|
244
|
+
* created by this call are queued for recycling by reset().
|
|
245
|
+
* @param matrixWorld Optional world matrix ID from this store; defaults to parent * local.
|
|
246
|
+
* @param matrixLocal Optional local matrix ID from this store; defaults to identity.
|
|
243
247
|
* @returns Matrix IDs for the saved parent, local, and world transforms.
|
|
244
248
|
*/
|
|
245
|
-
save(): MatrixSaveState;
|
|
249
|
+
save(matrixWorld?: number, matrixLocal?: number): MatrixSaveState;
|
|
246
250
|
/**
|
|
247
251
|
* Restores the matrix state from the top of the stack.
|
|
248
252
|
* Equivalent to context.restore().
|
|
@@ -250,7 +254,7 @@ export declare class MatrixStack {
|
|
|
250
254
|
restore(): void;
|
|
251
255
|
restoreAll(): void;
|
|
252
256
|
/**
|
|
253
|
-
* Removes a matrix from the
|
|
257
|
+
* Removes a matrix from the frame recycle queue so
|
|
254
258
|
* it remains valid across `reset()` calls.
|
|
255
259
|
*
|
|
256
260
|
* Passing a `MatrixSaveState` retains its `local` and `world` matrices;
|
|
@@ -258,8 +262,9 @@ export declare class MatrixStack {
|
|
|
258
262
|
* Retained matrices must eventually be released with `matrix.free()`.
|
|
259
263
|
*
|
|
260
264
|
* @param matrix A matrix ID or the state returned by `save()`.
|
|
265
|
+
* @returns The supplied ID or state, preserving its input type.
|
|
261
266
|
*/
|
|
262
|
-
retainMatrix
|
|
267
|
+
retainMatrix<T extends number | MatrixSaveState>(matrix: T): T;
|
|
263
268
|
/**
|
|
264
269
|
* Translates the current local and world matrices by x and y.
|
|
265
270
|
* @param x - Translation along the x-axis.
|
package/dist/rapid-render.js
CHANGED
|
@@ -1254,10 +1254,10 @@ class Ht {
|
|
|
1254
1254
|
constructor(t) {
|
|
1255
1255
|
this.reset(), this.rapid = t;
|
|
1256
1256
|
}
|
|
1257
|
-
save() {
|
|
1257
|
+
save(t, e) {
|
|
1258
1258
|
this.stack.push(this.curLocalM), this.stack.push(this.curWorldM);
|
|
1259
|
-
const
|
|
1260
|
-
return this.curLocalM = this.matrix.alloc(), this.curWorldM = this.matrix.allocDirty(), this.matrix.copy(this.curWorldM,
|
|
1259
|
+
const r = this.curWorldM;
|
|
1260
|
+
return this.curLocalM = e ?? this.matrix.alloc(), this.curWorldM = t ?? this.matrix.allocDirty(), t === void 0 && (e === void 0 ? this.matrix.copy(this.curWorldM, r) : this.matrix.multiplyOut(this.curWorldM, r, this.curLocalM)), e === void 0 && this.currStack.push(this.curLocalM), t === void 0 && this.currStack.push(this.curWorldM), { parent: r, world: this.curWorldM, local: this.curLocalM };
|
|
1261
1261
|
}
|
|
1262
1262
|
restore() {
|
|
1263
1263
|
this.stack.length != 0 && (this.curWorldM = this.stack.pop(), this.curLocalM = this.stack.pop());
|
|
@@ -1272,7 +1272,7 @@ class Ht {
|
|
|
1272
1272
|
), r = [];
|
|
1273
1273
|
for (let i = 0; i < this.currStack.length; i++)
|
|
1274
1274
|
e.has(this.currStack.get(i)) && r.push(i);
|
|
1275
|
-
_.removeAtIndices(r, [this.currStack]);
|
|
1275
|
+
return _.removeAtIndices(r, [this.currStack]), t;
|
|
1276
1276
|
}
|
|
1277
1277
|
translate(t, e) {
|
|
1278
1278
|
this.matrix.translate(this.curLocalM, t, e), this.matrix.translate(this.curWorldM, t, e);
|
|
@@ -84,7 +84,7 @@ void main(void) {\r
|
|
|
84
84
|
\r
|
|
85
85
|
// CUSTOM_CODE_CALL\r
|
|
86
86
|
}\r
|
|
87
|
-
`,Q=48,re=new Float32Array([0,0,1,0,0,1,1,1]);class ft extends Rt{instanceBuffer;quadBuffer;instanceCount=0;localSpriteMatrix=new Float32Array(6);worldSpriteMatrix=new Float32Array(6);KEY="Sprite";constructor(t){super(t),this.createBuffer(),this.createDefaultShader()}createBuffer(){const t=this.gl;this.quadBuffer=new dt(t,_.Float32,t.ARRAY_BUFFER,t.STATIC_DRAW),this.quadBuffer.bindBuffer();for(const e of re)this.quadBuffer.pushFloat32(e);this.quadBuffer.makeDirty(),this.quadBuffer.bufferData(),this.instanceBuffer=new dt(t,_.Uint32,t.ARRAY_BUFFER,t.DYNAMIC_DRAW)}createDefaultShader(){return this.vs=at,this.fs=Mt,this.defaultShader=this.createShader(at,Mt),this.defaultShader}createShader(t,e){const r=super.createShader(t,e);return r.use(),r.bindVAO(),this.instanceBuffer.bindBuffer(),r.setAttributes([{name:"aMatrixRow0",size:3,stride:Q,offset:0,divisor:1},{name:"aMatrixRow1",size:3,stride:Q,offset:12,divisor:1},{name:"aUVRect",size:4,stride:Q,offset:24,divisor:1},{name:"aColor",size:4,type:ut,normalized:!0,stride:Q,offset:40,divisor:1},{name:"aTextureId",size:1,type:ut,stride:Q,offset:44,divisor:1}]),this.quadBuffer.bindBuffer(),r.setAttributes([{name:"aVertex",size:2,stride:8,offset:0,divisor:0}]),r.unbindVAO(),this.currentShader&&this.currentShader.use(),r}drawSprite(t,e,r=0,i=0,s=1,a=1,o=4294967295,h=0,c=0,u=!1,l=!1,d=!1){const f=e*6,m=this.matrixStore.data;this.drawSpriteAffine(t,m[f],m[f+1],m[f+2],m[f+3],m[f+4],m[f+5],r,i,s,a,o,h,c,u,l,d)}drawSpriteAffine(t,e,r,i,s,a,o,h=0,c=0,u=1,l=1,d=4294967295,f=0,m=0,x=!1,T=!1,y=!1){const w=t.base,R=t.rawWidth,C=t.rawHeight,L=t.offsetX,B=t.offsetY,N=this.useTexture(t.glTexture,f/w.width,m/w.height),A=this.instanceBuffer,M=A.usedElemNum;A.resize(12);const U=A.float32,F=A.uint32,G=y?C:R,H=y?R:C,I=G+2*f,O=H+2*m,Y=L-f,V=B-m,S=this.localSpriteMatrix;y?(S[0]=0,S[1]=T?O:-O,S[2]=x?-I:I,S[3]=0,S[4]=Y+(x?I:0),S[5]=V+(T?0:O)):(S[0]=x?-I:I,S[1]=0,S[2]=0,S[3]=T?-O:O,S[4]=Y+(x?I:0),S[5]=V+(T?O:0));const b=this.worldSpriteMatrix;b[0]=e*S[0]+i*S[1],b[1]=r*S[0]+s*S[1],b[2]=e*S[2]+i*S[3],b[3]=r*S[2]+s*S[3],b[4]=a+e*S[4]+i*S[5],b[5]=o+r*S[4]+s*S[5],U[M+6]=h,U[M+7]=c,U[M+8]=u,U[M+9]=l,F[M+10]=d,F[M+11]=N,this.rapid.roundPixels&&(b[4]=Math.round(b[4]),b[5]=Math.round(b[5])),U[M]=b[0],U[M+1]=b[2],U[M+2]=b[4],U[M+3]=b[1],U[M+4]=b[3],U[M+5]=b[5],A.usedElemNum+=12,A.makeDirty(),this.instanceCount++}render(){if(this.instanceCount===0)return;this.prepareRender();const t=this.gl,e=this.currentShader;this.instanceBuffer.bindBuffer(),this.instanceBuffer.bufferData(),e.bindVAO(),Et(t,t.TRIANGLE_STRIP,0,4,this.instanceCount),this.rapid.drawcallCount++}resetRender(){super.resetRender(),this.instanceBuffer.clear(),this.instanceCount=0}hasPendingContent(){return this.instanceCount>0}}const E=6;class ie{matrixCount=0;buffer;data;freeFlag;freeMatrixStack;temporary=-1;identityMatrix=-1;constructor(t=10){this.buffer=new P(_.Float32),this.buffer.resize(t*E),this.data=this.buffer.getArray(),this.freeFlag=new P(_.Uint32),this.freeMatrixStack=new P(_.Uint32),this.reset()}alloc(){const t=this.allocDirty();return this.identity(t),t}allocDirty(){if(this.freeMatrixStack.length>0){const e=this.freeMatrixStack.pop();return this.freeFlag.typedArray[e]=1,e}this.buffer.resize(E)&&(this.data=this.buffer.getArray()),this.buffer.usedElemNum+=E,this.freeFlag.resize(1);const t=this.matrixCount++;return this.freeFlag.typedArray[this.freeFlag.usedElemNum++]=1,t}free(t){!Number.isInteger(t)||t<0||t>=this.matrixCount||this.freeFlag.typedArray[t]!==0&&(this.freeFlag.typedArray[t]=0,this.freeMatrixStack.push(t))}reset(){this.matrixCount=0,this.buffer.usedElemNum=0,this.freeFlag.clear(),this.freeMatrixStack.clear(),this.temporary=this.alloc(),this.identityMatrix=this.alloc()}identity(t){const e=t*E,r=this.data;r[e]=1,r[e+1]=0,r[e+2]=0,r[e+3]=1,r[e+4]=0,r[e+5]=0}translate(t,e,r){const i=t*E,s=this.data;s[i+4]=s[i]*e+s[i+2]*r+s[i+4],s[i+5]=s[i+1]*e+s[i+3]*r+s[i+5]}scale(t,e,r){const i=t*E,s=this.data;s[i]*=e,s[i+1]*=e,s[i+2]*=r,s[i+3]*=r}rotate(t,e){const r=t*E,i=this.data,s=Math.cos(e),a=Math.sin(e),o=i[r],h=i[r+1],c=i[r+2],u=i[r+3];i[r]=o*s+c*a,i[r+1]=h*s+u*a,i[r+2]=o*-a+c*s,i[r+3]=h*-a+u*s}rotateWithOffset(t,e,r,i){this.translate(t,r,i),this.rotate(t,e),this.translate(t,-r,-i)}copy(t,e){const r=t*E,i=e*E,s=this.data;s[r]=s[i],s[r+1]=s[i+1],s[r+2]=s[i+2],s[r+3]=s[i+3],s[r+4]=s[i+4],s[r+5]=s[i+5]}multiply(t,e){this.multiplyOut(t,t,e)}multiplyOut(t,e,r){const i=t*E,s=e*E,a=r*E,o=this.data,h=o[s],c=o[s+1],u=o[s+2],l=o[s+3],d=o[s+4],f=o[s+5],m=o[a],x=o[a+1],T=o[a+2],y=o[a+3],w=o[a+4],R=o[a+5];o[i]=h*m+u*x,o[i+1]=c*m+l*x,o[i+2]=h*T+u*y,o[i+3]=c*T+l*y,o[i+4]=h*w+u*R+d,o[i+5]=c*w+l*R+f}invert(t){const e=t*E,r=this.data,i=r[e],s=r[e+1],a=r[e+2],o=r[e+3],h=r[e+4],c=r[e+5];let u=i*o-s*a;if(!u){this.identity(t);return}u=1/u,r[e]=o*u,r[e+1]=-s*u,r[e+2]=-a*u,r[e+3]=i*u,r[e+4]=(a*c-o*h)*u,r[e+5]=(s*h-i*c)*u}transformPoint(t,e,r){const i=t*E,s=this.data;return{x:e*s[i]+r*s[i+2]+s[i+4],y:e*s[i+1]+r*s[i+3]+s[i+5]}}worldToLocal(t,e,r){const i=this.allocDirty();this.copy(i,t),this.invert(i);const s=this.transformPoint(i,e,r);return this.free(i),s}localToWorld(t,e,r){return this.transformPoint(t,e,r)}getPosition(t){const e=t*E,r=this.data;return{x:r[e+4],y:r[e+5]}}getScale(t){const e=t*E,r=this.data,i=Math.sqrt(r[e]*r[e]+r[e+1]*r[e+1]),s=Math.sqrt(r[e+2]*r[e+2]+r[e+3]*r[e+3]);return{x:i,y:s}}getRotation(t){const e=t*E,r=this.data;return Math.atan2(r[e+1],r[e])}toCSSMatrix(t,e=1,r=1){const i=t*E,s=this.data;return`matrix(${s[i]*e}, ${s[i+1]*r}, ${s[i+2]*e}, ${s[i+3]*r}, ${s[i+4]*e}, ${s[i+5]*r})`}getMatrix(t){const e=t*E;return this.data.slice(e,e+E)}getMatrixRef(t){const e=t*E;return this.data.subarray(e,e+E)}setMatrix(t,e){const r=t*E,i=this.data;i[r]=e[0],i[r+1]=e[1],i[r+2]=e[2],i[r+3]=e[3],i[r+4]=e[4],i[r+5]=e[5]}multiplyAffineInPlace(t,e,r,i,s,a,o){const h=t*6,c=this.data,u=c[h],l=c[h+1],d=c[h+2],f=c[h+3],m=c[h+4],x=c[h+5];c[h]=u*e+d*r,c[h+1]=l*e+f*r,c[h+2]=u*i+d*s,c[h+3]=l*i+f*s,c[h+4]=u*a+d*o+m,c[h+5]=l*a+f*o+x}multiplyAffine(t,e,r,i,s,a,o,h){const c=t*6,u=e*6,l=this.data,d=l[c],f=l[c+1],m=l[c+2],x=l[c+3],T=l[c+4],y=l[c+5];l[u]=d*r+m*i,l[u+1]=f*r+x*i,l[u+2]=d*s+m*a,l[u+3]=f*s+x*a,l[u+4]=d*o+m*h+T,l[u+5]=f*o+x*h+y}clampBounds(t,e,r,i,s,a,o){if(i===void 0&&s===void 0&&a===void 0&&o===void 0)return;const h=t*E,c=this.data,u=Math.sqrt(c[h]*c[h]+c[h+1]*c[h+1])||1,l=Math.sqrt(c[h+2]*c[h+2]+c[h+3]*c[h+3])||1,d=e*.5*u,f=r*.5*l;let m=c[h+4],x=c[h+5];i!==void 0&&s!==void 0?m=s-i<d*2?(i+s)*.5:Math.max(i+d,Math.min(m,s-d)):i!==void 0?m=Math.max(m,i+d):s!==void 0&&(m=Math.min(m,s-d)),a!==void 0&&o!==void 0?x=o-a<f*2?(a+o)*.5:Math.max(a+f,Math.min(x,o-f)):a!==void 0?x=Math.max(x,a+f):o!==void 0&&(x=Math.min(x,o-f)),c[h+4]=m,c[h+5]=x}applyTransform(t,e=0,r=0){let i=t.x??0,s=t.y??0;t.position&&(i+=t.position.x,s+=t.position.y);let a=1,o=1;const h=t.scale;h!==void 0&&(typeof h=="number"?(a=h,o=h):(a=h.x,o=h.y));const c=t.rotation??0;let u=t.offsetX??0,l=t.offsetY??0;t.offset&&(u+=t.offset.x,l+=t.offset.y);const d=t.origin;d!==void 0&&(typeof d=="number"?(u-=d*e,l-=d*r):(u-=d.x*e,l-=d.y*r));const f=c?Math.cos(c):1,m=c?Math.sin(c):0,x=f*a,T=m*a,y=-m*o,w=f*o,R=i+x*u+y*l,C=s+T*u+w*l;return[x,T,y,w,R,C]}}class se{matrix=new ie;stack=new P(_.Uint32);currStack=new P(_.Uint32);curLocalM=-1;curWorldM=-1;rapid;constructor(t){this.reset(),this.rapid=t}save(){this.stack.push(this.curLocalM),this.stack.push(this.curWorldM);const
|
|
87
|
+
`,Q=48,re=new Float32Array([0,0,1,0,0,1,1,1]);class ft extends Rt{instanceBuffer;quadBuffer;instanceCount=0;localSpriteMatrix=new Float32Array(6);worldSpriteMatrix=new Float32Array(6);KEY="Sprite";constructor(t){super(t),this.createBuffer(),this.createDefaultShader()}createBuffer(){const t=this.gl;this.quadBuffer=new dt(t,_.Float32,t.ARRAY_BUFFER,t.STATIC_DRAW),this.quadBuffer.bindBuffer();for(const e of re)this.quadBuffer.pushFloat32(e);this.quadBuffer.makeDirty(),this.quadBuffer.bufferData(),this.instanceBuffer=new dt(t,_.Uint32,t.ARRAY_BUFFER,t.DYNAMIC_DRAW)}createDefaultShader(){return this.vs=at,this.fs=Mt,this.defaultShader=this.createShader(at,Mt),this.defaultShader}createShader(t,e){const r=super.createShader(t,e);return r.use(),r.bindVAO(),this.instanceBuffer.bindBuffer(),r.setAttributes([{name:"aMatrixRow0",size:3,stride:Q,offset:0,divisor:1},{name:"aMatrixRow1",size:3,stride:Q,offset:12,divisor:1},{name:"aUVRect",size:4,stride:Q,offset:24,divisor:1},{name:"aColor",size:4,type:ut,normalized:!0,stride:Q,offset:40,divisor:1},{name:"aTextureId",size:1,type:ut,stride:Q,offset:44,divisor:1}]),this.quadBuffer.bindBuffer(),r.setAttributes([{name:"aVertex",size:2,stride:8,offset:0,divisor:0}]),r.unbindVAO(),this.currentShader&&this.currentShader.use(),r}drawSprite(t,e,r=0,i=0,s=1,a=1,o=4294967295,h=0,c=0,u=!1,l=!1,d=!1){const f=e*6,m=this.matrixStore.data;this.drawSpriteAffine(t,m[f],m[f+1],m[f+2],m[f+3],m[f+4],m[f+5],r,i,s,a,o,h,c,u,l,d)}drawSpriteAffine(t,e,r,i,s,a,o,h=0,c=0,u=1,l=1,d=4294967295,f=0,m=0,x=!1,T=!1,y=!1){const w=t.base,R=t.rawWidth,C=t.rawHeight,L=t.offsetX,B=t.offsetY,N=this.useTexture(t.glTexture,f/w.width,m/w.height),A=this.instanceBuffer,M=A.usedElemNum;A.resize(12);const U=A.float32,F=A.uint32,G=y?C:R,H=y?R:C,I=G+2*f,O=H+2*m,Y=L-f,V=B-m,S=this.localSpriteMatrix;y?(S[0]=0,S[1]=T?O:-O,S[2]=x?-I:I,S[3]=0,S[4]=Y+(x?I:0),S[5]=V+(T?0:O)):(S[0]=x?-I:I,S[1]=0,S[2]=0,S[3]=T?-O:O,S[4]=Y+(x?I:0),S[5]=V+(T?O:0));const b=this.worldSpriteMatrix;b[0]=e*S[0]+i*S[1],b[1]=r*S[0]+s*S[1],b[2]=e*S[2]+i*S[3],b[3]=r*S[2]+s*S[3],b[4]=a+e*S[4]+i*S[5],b[5]=o+r*S[4]+s*S[5],U[M+6]=h,U[M+7]=c,U[M+8]=u,U[M+9]=l,F[M+10]=d,F[M+11]=N,this.rapid.roundPixels&&(b[4]=Math.round(b[4]),b[5]=Math.round(b[5])),U[M]=b[0],U[M+1]=b[2],U[M+2]=b[4],U[M+3]=b[1],U[M+4]=b[3],U[M+5]=b[5],A.usedElemNum+=12,A.makeDirty(),this.instanceCount++}render(){if(this.instanceCount===0)return;this.prepareRender();const t=this.gl,e=this.currentShader;this.instanceBuffer.bindBuffer(),this.instanceBuffer.bufferData(),e.bindVAO(),Et(t,t.TRIANGLE_STRIP,0,4,this.instanceCount),this.rapid.drawcallCount++}resetRender(){super.resetRender(),this.instanceBuffer.clear(),this.instanceCount=0}hasPendingContent(){return this.instanceCount>0}}const E=6;class ie{matrixCount=0;buffer;data;freeFlag;freeMatrixStack;temporary=-1;identityMatrix=-1;constructor(t=10){this.buffer=new P(_.Float32),this.buffer.resize(t*E),this.data=this.buffer.getArray(),this.freeFlag=new P(_.Uint32),this.freeMatrixStack=new P(_.Uint32),this.reset()}alloc(){const t=this.allocDirty();return this.identity(t),t}allocDirty(){if(this.freeMatrixStack.length>0){const e=this.freeMatrixStack.pop();return this.freeFlag.typedArray[e]=1,e}this.buffer.resize(E)&&(this.data=this.buffer.getArray()),this.buffer.usedElemNum+=E,this.freeFlag.resize(1);const t=this.matrixCount++;return this.freeFlag.typedArray[this.freeFlag.usedElemNum++]=1,t}free(t){!Number.isInteger(t)||t<0||t>=this.matrixCount||this.freeFlag.typedArray[t]!==0&&(this.freeFlag.typedArray[t]=0,this.freeMatrixStack.push(t))}reset(){this.matrixCount=0,this.buffer.usedElemNum=0,this.freeFlag.clear(),this.freeMatrixStack.clear(),this.temporary=this.alloc(),this.identityMatrix=this.alloc()}identity(t){const e=t*E,r=this.data;r[e]=1,r[e+1]=0,r[e+2]=0,r[e+3]=1,r[e+4]=0,r[e+5]=0}translate(t,e,r){const i=t*E,s=this.data;s[i+4]=s[i]*e+s[i+2]*r+s[i+4],s[i+5]=s[i+1]*e+s[i+3]*r+s[i+5]}scale(t,e,r){const i=t*E,s=this.data;s[i]*=e,s[i+1]*=e,s[i+2]*=r,s[i+3]*=r}rotate(t,e){const r=t*E,i=this.data,s=Math.cos(e),a=Math.sin(e),o=i[r],h=i[r+1],c=i[r+2],u=i[r+3];i[r]=o*s+c*a,i[r+1]=h*s+u*a,i[r+2]=o*-a+c*s,i[r+3]=h*-a+u*s}rotateWithOffset(t,e,r,i){this.translate(t,r,i),this.rotate(t,e),this.translate(t,-r,-i)}copy(t,e){const r=t*E,i=e*E,s=this.data;s[r]=s[i],s[r+1]=s[i+1],s[r+2]=s[i+2],s[r+3]=s[i+3],s[r+4]=s[i+4],s[r+5]=s[i+5]}multiply(t,e){this.multiplyOut(t,t,e)}multiplyOut(t,e,r){const i=t*E,s=e*E,a=r*E,o=this.data,h=o[s],c=o[s+1],u=o[s+2],l=o[s+3],d=o[s+4],f=o[s+5],m=o[a],x=o[a+1],T=o[a+2],y=o[a+3],w=o[a+4],R=o[a+5];o[i]=h*m+u*x,o[i+1]=c*m+l*x,o[i+2]=h*T+u*y,o[i+3]=c*T+l*y,o[i+4]=h*w+u*R+d,o[i+5]=c*w+l*R+f}invert(t){const e=t*E,r=this.data,i=r[e],s=r[e+1],a=r[e+2],o=r[e+3],h=r[e+4],c=r[e+5];let u=i*o-s*a;if(!u){this.identity(t);return}u=1/u,r[e]=o*u,r[e+1]=-s*u,r[e+2]=-a*u,r[e+3]=i*u,r[e+4]=(a*c-o*h)*u,r[e+5]=(s*h-i*c)*u}transformPoint(t,e,r){const i=t*E,s=this.data;return{x:e*s[i]+r*s[i+2]+s[i+4],y:e*s[i+1]+r*s[i+3]+s[i+5]}}worldToLocal(t,e,r){const i=this.allocDirty();this.copy(i,t),this.invert(i);const s=this.transformPoint(i,e,r);return this.free(i),s}localToWorld(t,e,r){return this.transformPoint(t,e,r)}getPosition(t){const e=t*E,r=this.data;return{x:r[e+4],y:r[e+5]}}getScale(t){const e=t*E,r=this.data,i=Math.sqrt(r[e]*r[e]+r[e+1]*r[e+1]),s=Math.sqrt(r[e+2]*r[e+2]+r[e+3]*r[e+3]);return{x:i,y:s}}getRotation(t){const e=t*E,r=this.data;return Math.atan2(r[e+1],r[e])}toCSSMatrix(t,e=1,r=1){const i=t*E,s=this.data;return`matrix(${s[i]*e}, ${s[i+1]*r}, ${s[i+2]*e}, ${s[i+3]*r}, ${s[i+4]*e}, ${s[i+5]*r})`}getMatrix(t){const e=t*E;return this.data.slice(e,e+E)}getMatrixRef(t){const e=t*E;return this.data.subarray(e,e+E)}setMatrix(t,e){const r=t*E,i=this.data;i[r]=e[0],i[r+1]=e[1],i[r+2]=e[2],i[r+3]=e[3],i[r+4]=e[4],i[r+5]=e[5]}multiplyAffineInPlace(t,e,r,i,s,a,o){const h=t*6,c=this.data,u=c[h],l=c[h+1],d=c[h+2],f=c[h+3],m=c[h+4],x=c[h+5];c[h]=u*e+d*r,c[h+1]=l*e+f*r,c[h+2]=u*i+d*s,c[h+3]=l*i+f*s,c[h+4]=u*a+d*o+m,c[h+5]=l*a+f*o+x}multiplyAffine(t,e,r,i,s,a,o,h){const c=t*6,u=e*6,l=this.data,d=l[c],f=l[c+1],m=l[c+2],x=l[c+3],T=l[c+4],y=l[c+5];l[u]=d*r+m*i,l[u+1]=f*r+x*i,l[u+2]=d*s+m*a,l[u+3]=f*s+x*a,l[u+4]=d*o+m*h+T,l[u+5]=f*o+x*h+y}clampBounds(t,e,r,i,s,a,o){if(i===void 0&&s===void 0&&a===void 0&&o===void 0)return;const h=t*E,c=this.data,u=Math.sqrt(c[h]*c[h]+c[h+1]*c[h+1])||1,l=Math.sqrt(c[h+2]*c[h+2]+c[h+3]*c[h+3])||1,d=e*.5*u,f=r*.5*l;let m=c[h+4],x=c[h+5];i!==void 0&&s!==void 0?m=s-i<d*2?(i+s)*.5:Math.max(i+d,Math.min(m,s-d)):i!==void 0?m=Math.max(m,i+d):s!==void 0&&(m=Math.min(m,s-d)),a!==void 0&&o!==void 0?x=o-a<f*2?(a+o)*.5:Math.max(a+f,Math.min(x,o-f)):a!==void 0?x=Math.max(x,a+f):o!==void 0&&(x=Math.min(x,o-f)),c[h+4]=m,c[h+5]=x}applyTransform(t,e=0,r=0){let i=t.x??0,s=t.y??0;t.position&&(i+=t.position.x,s+=t.position.y);let a=1,o=1;const h=t.scale;h!==void 0&&(typeof h=="number"?(a=h,o=h):(a=h.x,o=h.y));const c=t.rotation??0;let u=t.offsetX??0,l=t.offsetY??0;t.offset&&(u+=t.offset.x,l+=t.offset.y);const d=t.origin;d!==void 0&&(typeof d=="number"?(u-=d*e,l-=d*r):(u-=d.x*e,l-=d.y*r));const f=c?Math.cos(c):1,m=c?Math.sin(c):0,x=f*a,T=m*a,y=-m*o,w=f*o,R=i+x*u+y*l,C=s+T*u+w*l;return[x,T,y,w,R,C]}}class se{matrix=new ie;stack=new P(_.Uint32);currStack=new P(_.Uint32);curLocalM=-1;curWorldM=-1;rapid;constructor(t){this.reset(),this.rapid=t}save(t,e){this.stack.push(this.curLocalM),this.stack.push(this.curWorldM);const r=this.curWorldM;return this.curLocalM=e??this.matrix.alloc(),this.curWorldM=t??this.matrix.allocDirty(),t===void 0&&(e===void 0?this.matrix.copy(this.curWorldM,r):this.matrix.multiplyOut(this.curWorldM,r,this.curLocalM)),e===void 0&&this.currStack.push(this.curLocalM),t===void 0&&this.currStack.push(this.curWorldM),{parent:r,world:this.curWorldM,local:this.curLocalM}}restore(){this.stack.length!=0&&(this.curWorldM=this.stack.pop(),this.curLocalM=this.stack.pop())}restoreAll(){for(;this.stack.length>0;)this.restore()}retainMatrix(t){const e=new Set(typeof t=="number"?[t]:[t.local,t.world]),r=[];for(let i=0;i<this.currStack.length;i++)e.has(this.currStack.get(i))&&r.push(i);return P.removeAtIndices(r,[this.currStack]),t}translate(t,e){this.matrix.translate(this.curLocalM,t,e),this.matrix.translate(this.curWorldM,t,e)}scale(t,e=t){this.matrix.scale(this.curLocalM,t,e),this.matrix.scale(this.curWorldM,t,e)}rotate(t){this.matrix.rotate(this.curLocalM,t),this.matrix.rotate(this.curWorldM,t)}rotateWithOffset(t,e,r){this.matrix.rotateWithOffset(this.curLocalM,t,e,r),this.matrix.rotateWithOffset(this.curWorldM,t,e,r)}identity(){this.matrix.identity(this.curLocalM),this.matrix.identity(this.curWorldM)}reset(){for(let t=0;t<this.currStack.length;t++)this.matrix.free(this.currStack.typedArray[t]);this.currStack.clear(),this.stack.clear(),this.curLocalM=this.matrix.alloc(),this.curWorldM=this.matrix.alloc(),this.currStack.push(this.curLocalM),this.currStack.push(this.curWorldM)}localToWorld(t,e){return this.matrix.localToWorld(this.curWorldM,t,e)}worldToLocal(t,e){return this.matrix.worldToLocal(this.curWorldM,t,e)}getGlobalPosition(){return this.matrix.getPosition(this.curWorldM)}getGlobalScale(){return this.matrix.getScale(this.curWorldM)}getGlobalRotation(){return this.matrix.getRotation(this.curWorldM)}toCSSMatrix(){return this.matrix.toCSSMatrix(this.curWorldM)}getTransform(){const t=this.curWorldM*E;return this.matrix.data.slice(t,t+E)}setTransform(t){const e=this.curWorldM*E,r=this.matrix.data;r[e]=t[0],r[e+1]=t[1],r[e+2]=t[2],r[e+3]=t[3],r[e+4]=t[4],r[e+5]=t[5]}transformPoint(t,e){return this.matrix.transformPoint(this.curLocalM,t,e)}applyTransform(t,e=0,r=0,i,s=this.curWorldM,a=this.curLocalM){const[o,h,c,u,l,d]=this.matrix.applyTransform(t,e,r);i!=null?this.matrix.multiplyAffine(s,i,o,h,c,u,l,d):(this.matrix.multiplyAffineInPlace(a,o,h,c,u,l,d),this.matrix.multiplyAffineInPlace(s,o,h,c,u,l,d))}}const ne=`#version 300 es\r
|
|
88
88
|
precision highp float;\r
|
|
89
89
|
\r
|
|
90
90
|
in vec2 aPosition;\r
|
package/package.json
CHANGED