rapid-render 1.0.23 → 1.0.24

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.
@@ -240,9 +240,12 @@ 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 recycled by reset() unless retained.
244
+ * @param matrixWorld Optional world matrix ID from this store; defaults to parent * local.
245
+ * @param matrixLocal Optional local matrix ID from this store; defaults to identity.
243
246
  * @returns Matrix IDs for the saved parent, local, and world transforms.
244
247
  */
245
- save(): MatrixSaveState;
248
+ save(matrixWorld?: number, matrixLocal?: number): MatrixSaveState;
246
249
  /**
247
250
  * Restores the matrix state from the top of the stack.
248
251
  * Equivalent to context.restore().
@@ -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 t = this.curWorldM;
1260
- return this.curLocalM = this.matrix.alloc(), this.curWorldM = this.matrix.allocDirty(), this.matrix.copy(this.curWorldM, t), this.currStack.push(this.curLocalM), this.currStack.push(this.curWorldM), { parent: t, world: this.curWorldM, local: this.curLocalM };
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)), this.currStack.push(this.curLocalM), 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());
@@ -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 t=this.curWorldM;return this.curLocalM=this.matrix.alloc(),this.curWorldM=this.matrix.allocDirty(),this.matrix.copy(this.curWorldM,t),this.currStack.push(this.curLocalM),this.currStack.push(this.curWorldM),{parent:t,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);P.removeAtIndices(r,[this.currStack])}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
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)),this.currStack.push(this.curLocalM),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);P.removeAtIndices(r,[this.currStack])}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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rapid-render",
3
3
  "private": false,
4
- "version": "1.0.23",
4
+ "version": "1.0.24",
5
5
  "type": "module",
6
6
  "description": "A high-performance lightweight WebGL 2D renderer for browser games.",
7
7
  "repository": "https://github.com/Nightre/Rapid.js",