tscratch 0.8.5 → 0.8.7

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.
@@ -68,6 +68,7 @@ declare abstract class Sprite {
68
68
  changeSize(dS: number): void;
69
69
  goToLayer(layer: number): void;
70
70
  changeLayer(dL: number): void;
71
+ static getSpriteByTagName(tag: string): Sprite[];
71
72
  protected getDrawOffset(): [number, number];
72
73
  }
73
74
 
@@ -91,7 +92,7 @@ declare class Engine {
91
92
  mouseDown: boolean;
92
93
  mouseClicked: boolean;
93
94
  private keysPressed;
94
- private currentScene;
95
+ currentScene: string;
95
96
  sceneMap: SceneMap;
96
97
  private variableMap;
97
98
  static init(): Engine;
@@ -186,6 +187,23 @@ declare class Perlin2D extends Perlin {
186
187
  get(x: number, y: number): number;
187
188
  }
188
189
 
190
+ declare class InverseKinematics {
191
+ links: [number, number, ...number[]];
192
+ angles: [number, number, ...number[]];
193
+ target: Vec2;
194
+ constructor(links: [number, number, ...number[]], target: Vec2);
195
+ getAngles(): number[];
196
+ getPoints(): Vec2[];
197
+ private static dot;
198
+ computeApproximateAngles(iterations: number, error: number, adjustmentRate?: number): void;
199
+ private forwardKinematicsPass;
200
+ private computeError;
201
+ private computeJacobian;
202
+ private computePseudoinverse;
203
+ private computeJointUpdate;
204
+ private updateAngles;
205
+ }
206
+
189
207
  declare class Multiplayer {
190
208
  private static instance;
191
209
  private socket;
@@ -196,6 +214,33 @@ declare class Multiplayer {
196
214
  on<T = unknown>(eventName: string, callback: (data: T) => void): void;
197
215
  }
198
216
 
217
+ interface LineOptions extends SpriteOptions {
218
+ color?: string;
219
+ length?: number;
220
+ width?: number;
221
+ }
222
+ declare class Line extends Sprite {
223
+ discriminant: string;
224
+ tags: Set<string>;
225
+ color: string;
226
+ length: number;
227
+ width: number;
228
+ getBoundingBox(): {
229
+ x: number;
230
+ y: number;
231
+ width: number;
232
+ height: number;
233
+ };
234
+ getPath(): Path2D;
235
+ draw(stamping?: true): void;
236
+ create(options?: LineOptions): this;
237
+ protected getCreateOptions(): LineOptions;
238
+ setColor(color: string): void;
239
+ setLength(length: number): void;
240
+ setWidth(width: number): void;
241
+ constructor(options?: LineOptions);
242
+ }
243
+
199
244
  interface RectangleOptions extends SpriteOptions {
200
245
  width?: number;
201
246
  height?: number;
@@ -215,21 +260,7 @@ declare class Rectangle extends Sprite {
215
260
  getPath(): Path2D;
216
261
  draw(stamping?: true): void;
217
262
  create(options?: RectangleOptions): this;
218
- protected getCreateOptions(): {
219
- width: number;
220
- height: number;
221
- color: string;
222
- outlineColor: string;
223
- outlineWidth: number;
224
- x?: number;
225
- y?: number;
226
- dir?: number;
227
- size?: number;
228
- pivot?: Vec2;
229
- scene?: string;
230
- hidden?: boolean;
231
- layer?: number;
232
- };
263
+ protected getCreateOptions(): RectangleOptions;
233
264
  setWidth(width: number): void;
234
265
  setHeight(height: number): void;
235
266
  setColor(color: string): void;
@@ -876,7 +907,9 @@ declare const TScratch: {
876
907
  TSCMath: typeof TSCMath;
877
908
  Perlin1D: typeof Perlin1D;
878
909
  Perlin2D: typeof Perlin2D;
910
+ InverseKinematics: typeof InverseKinematics;
879
911
  Multiplayer: typeof Multiplayer;
912
+ Line: typeof Line;
880
913
  Rectangle: typeof Rectangle;
881
914
  Square: typeof Square;
882
915
  Oval: typeof Oval;
@@ -910,4 +943,4 @@ declare const TScratch: {
910
943
  ctx: CanvasRenderingContext2D;
911
944
  };
912
945
 
913
- export { Arc, type ArcOptions, Button, type ButtonOptions, Camera3D, type Camera3DOptions, Circle, type CircleOptions, Cube, Cuboid, type CuboidOptions, CustomPolygon, type CustomPolygonOptions, Engine, Icosahedron, Icosphere, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Monkey, Multiplayer, Object3D, type Object3DOptions, Octahedron, Oval, type OvalOptions, Pen, type PenOptions, Perlin1D, Perlin2D, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Renderer3D, type Renderer3DOptions, type RigidBody, type RigidBodyOptions, RigidRectangle, type RigidRectangleOptions, SolidRenderer3D, Sprite, type SpriteOptions, Square, type SquareOptions, TSCMath, Tetrahedron, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
946
+ export { Arc, type ArcOptions, Button, type ButtonOptions, Camera3D, type Camera3DOptions, Circle, type CircleOptions, Cube, Cuboid, type CuboidOptions, CustomPolygon, type CustomPolygonOptions, Engine, Icosahedron, Icosphere, ImageSprite, type ImageSpriteOptions, InverseKinematics, Line, type LineOptions, type Mat2, type Mat3, type Mat4, Monkey, Multiplayer, Object3D, type Object3DOptions, Octahedron, Oval, type OvalOptions, Pen, type PenOptions, Perlin1D, Perlin2D, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Renderer3D, type Renderer3DOptions, type RigidBody, type RigidBodyOptions, RigidRectangle, type RigidRectangleOptions, SolidRenderer3D, Sprite, type SpriteOptions, Square, type SquareOptions, TSCMath, Tetrahedron, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
@@ -68,6 +68,7 @@ declare abstract class Sprite {
68
68
  changeSize(dS: number): void;
69
69
  goToLayer(layer: number): void;
70
70
  changeLayer(dL: number): void;
71
+ static getSpriteByTagName(tag: string): Sprite[];
71
72
  protected getDrawOffset(): [number, number];
72
73
  }
73
74
 
@@ -91,7 +92,7 @@ declare class Engine {
91
92
  mouseDown: boolean;
92
93
  mouseClicked: boolean;
93
94
  private keysPressed;
94
- private currentScene;
95
+ currentScene: string;
95
96
  sceneMap: SceneMap;
96
97
  private variableMap;
97
98
  static init(): Engine;
@@ -186,6 +187,23 @@ declare class Perlin2D extends Perlin {
186
187
  get(x: number, y: number): number;
187
188
  }
188
189
 
190
+ declare class InverseKinematics {
191
+ links: [number, number, ...number[]];
192
+ angles: [number, number, ...number[]];
193
+ target: Vec2;
194
+ constructor(links: [number, number, ...number[]], target: Vec2);
195
+ getAngles(): number[];
196
+ getPoints(): Vec2[];
197
+ private static dot;
198
+ computeApproximateAngles(iterations: number, error: number, adjustmentRate?: number): void;
199
+ private forwardKinematicsPass;
200
+ private computeError;
201
+ private computeJacobian;
202
+ private computePseudoinverse;
203
+ private computeJointUpdate;
204
+ private updateAngles;
205
+ }
206
+
189
207
  declare class Multiplayer {
190
208
  private static instance;
191
209
  private socket;
@@ -196,6 +214,33 @@ declare class Multiplayer {
196
214
  on<T = unknown>(eventName: string, callback: (data: T) => void): void;
197
215
  }
198
216
 
217
+ interface LineOptions extends SpriteOptions {
218
+ color?: string;
219
+ length?: number;
220
+ width?: number;
221
+ }
222
+ declare class Line extends Sprite {
223
+ discriminant: string;
224
+ tags: Set<string>;
225
+ color: string;
226
+ length: number;
227
+ width: number;
228
+ getBoundingBox(): {
229
+ x: number;
230
+ y: number;
231
+ width: number;
232
+ height: number;
233
+ };
234
+ getPath(): Path2D;
235
+ draw(stamping?: true): void;
236
+ create(options?: LineOptions): this;
237
+ protected getCreateOptions(): LineOptions;
238
+ setColor(color: string): void;
239
+ setLength(length: number): void;
240
+ setWidth(width: number): void;
241
+ constructor(options?: LineOptions);
242
+ }
243
+
199
244
  interface RectangleOptions extends SpriteOptions {
200
245
  width?: number;
201
246
  height?: number;
@@ -215,21 +260,7 @@ declare class Rectangle extends Sprite {
215
260
  getPath(): Path2D;
216
261
  draw(stamping?: true): void;
217
262
  create(options?: RectangleOptions): this;
218
- protected getCreateOptions(): {
219
- width: number;
220
- height: number;
221
- color: string;
222
- outlineColor: string;
223
- outlineWidth: number;
224
- x?: number;
225
- y?: number;
226
- dir?: number;
227
- size?: number;
228
- pivot?: Vec2;
229
- scene?: string;
230
- hidden?: boolean;
231
- layer?: number;
232
- };
263
+ protected getCreateOptions(): RectangleOptions;
233
264
  setWidth(width: number): void;
234
265
  setHeight(height: number): void;
235
266
  setColor(color: string): void;
@@ -876,7 +907,9 @@ declare const TScratch: {
876
907
  TSCMath: typeof TSCMath;
877
908
  Perlin1D: typeof Perlin1D;
878
909
  Perlin2D: typeof Perlin2D;
910
+ InverseKinematics: typeof InverseKinematics;
879
911
  Multiplayer: typeof Multiplayer;
912
+ Line: typeof Line;
880
913
  Rectangle: typeof Rectangle;
881
914
  Square: typeof Square;
882
915
  Oval: typeof Oval;
@@ -910,4 +943,4 @@ declare const TScratch: {
910
943
  ctx: CanvasRenderingContext2D;
911
944
  };
912
945
 
913
- export { Arc, type ArcOptions, Button, type ButtonOptions, Camera3D, type Camera3DOptions, Circle, type CircleOptions, Cube, Cuboid, type CuboidOptions, CustomPolygon, type CustomPolygonOptions, Engine, Icosahedron, Icosphere, ImageSprite, type ImageSpriteOptions, type Mat2, type Mat3, type Mat4, Monkey, Multiplayer, Object3D, type Object3DOptions, Octahedron, Oval, type OvalOptions, Pen, type PenOptions, Perlin1D, Perlin2D, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Renderer3D, type Renderer3DOptions, type RigidBody, type RigidBodyOptions, RigidRectangle, type RigidRectangleOptions, SolidRenderer3D, Sprite, type SpriteOptions, Square, type SquareOptions, TSCMath, Tetrahedron, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
946
+ export { Arc, type ArcOptions, Button, type ButtonOptions, Camera3D, type Camera3DOptions, Circle, type CircleOptions, Cube, Cuboid, type CuboidOptions, CustomPolygon, type CustomPolygonOptions, Engine, Icosahedron, Icosphere, ImageSprite, type ImageSpriteOptions, InverseKinematics, Line, type LineOptions, type Mat2, type Mat3, type Mat4, Monkey, Multiplayer, Object3D, type Object3DOptions, Octahedron, Oval, type OvalOptions, Pen, type PenOptions, Perlin1D, Perlin2D, Rectangle, type RectangleOptions, RegularPolygon, type RegularPolygonOptions, Renderer3D, type Renderer3DOptions, type RigidBody, type RigidBodyOptions, RigidRectangle, type RigidRectangleOptions, SolidRenderer3D, Sprite, type SpriteOptions, Square, type SquareOptions, TSCMath, Tetrahedron, Text, type TextOptions, type Vec2, type Vec3, type Vec4, Watermark, type TextOptions as WatermarkOptions, WireframeRenderer3D, aspectRatio, canvas, ctx, TScratch as default, scale, setAspectRatio, setScale };
@@ -1,3 +1,3 @@
1
- var h=document.getElementById("game-window")||document.createElement("canvas"),u=h.getContext("2d"),B=document.createElement("canvas"),d=B.getContext("2d");B.id="pen-canvas";var ot=16/9,tt;function Rt(){h.width=ot*tt,h.height=tt,B.width=ot*tt,B.height=tt}function Bt(n){tt=n,Rt()}function kt(n){ot=n,Rt()}h.parentElement?.insertBefore(B,h);Bt(500);var o=class n{constructor(){}static pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}static magnitude(t){return Math.hypot(...t)}static normalize(t){let i=Math.hypot(...t);return i===0?[...t]:t.map(e=>e/i)}static add(t,i){return t.map((e,s)=>e+i[s])}static subtract(t,i){return t.map((e,s)=>e-i[s])}static multiply(t,i){return t.map((e,s)=>e*i[s])}static dot(t,i){return t.reduce((e,s,r)=>e+s*i[r],0)}static cross(t,i){return[t[1]*i[2]-t[2]*i[1],t[2]*i[0]-t[0]*i[2],t[0]*i[1]-t[1]*i[0]]}static toRadians(t){return t*Math.PI/180}static toDegrees(t){return t*180/Math.PI}static sin(t){return Math.sin(n.toRadians(t))}static cos(t){return Math.cos(n.toRadians(t))}static tan(t){return Math.tan(n.toRadians(t))}static csc(t){return 1/Math.sin(n.toRadians(t))}static sec(t){return 1/Math.cos(n.toRadians(t))}static cot(t){return 1/Math.tan(n.toRadians(t))}static asin(t){return n.toDegrees(Math.asin(t))}static acos(t){return n.toDegrees(Math.acos(t))}static acsc(t){return n.toDegrees(Math.asin(1/t))}static asec(t){return n.toDegrees(Math.acos(1/t))}};var b=class n{x=0;y=0;dir=0;size=1;pivot=[0,0];scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){X.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),X.init().addSprite(this)}getCreateOptions(){return{x:this.x,y:this.y,dir:this.dir,size:this.size,scene:this.scene,layer:this.layer,hidden:this.hidden}}clone(t){return this.create({...this.getCreateOptions(),...t})}touching(t){if(this.hidden||t.hidden||this.scene!=="*"&&t.scene!=="*"&&this.scene!==t.scene)return null;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return null;let r=i.x-i.width/2,c=i.y+i.height/2,a=i.x+i.width/2,l=i.y-i.height/2,m=e.x-e.width/2,g=e.y+e.height/2,v=e.x+e.width/2,p=e.y-e.height/2,f=Math.max(r,m),V=Math.min(l,p),z=Math.min(a,v),w=Math.max(c,g),y=z-f,P=w-V;if(y<1||P<1)return null;n.collisionCanvas||(n.collisionCanvas=new OffscreenCanvas(1,1),n.collisionCtx=n.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let S=n.collisionCtx;n.collisionCanvas.width<y&&(n.collisionCanvas.width=y),n.collisionCanvas.height<P&&(n.collisionCanvas.height=P),S.clearRect(0,0,y,P);let U=(x,W)=>{S.save();let Y=x.x-f,Z=w-x.y;S.translate(Y,Z),S.rotate(x.toRadians(x.dir)),S.translate(-x.pivot[0]*x.size,x.pivot[1]*x.size),S.fillStyle=W,S.fill(x.getCachedPath()),S.restore()};U(this,"red");let R=S.getImageData(0,0,y,P).data;S.clearRect(0,0,y,P),U(t,"blue");let q=S.getImageData(0,0,y,P).data,J=0,O=0,D=0,L=[];for(let x=3;x<R.length;x+=4)if(R[x]>0&&q[x]>0){let W=x/4;L.push(W);let Y=W%y,Z=Math.floor(W/y);J+=Y,O+=Z,D++}if(D===0)return null;let K=J/D,Q=O/D,A=[f+K,w-Q],M=0,G=0;for(let x of L){let W=x%y,Y=Math.floor(x/y);M+=W-K,G+=Y-Q}Math.abs(M)<.01&&Math.abs(G)<.01&&(M=this.x-A[0],G=this.y-A[1]);let _=[M,-G],k=o.magnitude(_)>0?o.normalize(_):_,j=this.x-t.x,N=this.y-t.y;j*k[0]+N*k[1]<0&&(k[0]*=-1,k[1]*=-1);let I=-1/0;for(let x of L){let W=x%y,Y=Math.floor(x/y),Z=f+W,Zt=w-Y,qt=(Z-A[0])*k[0]+(Zt-A[1])*k[1];I=Math.max(I,qt)}return{contact:A,normal:k,displacement:I}}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}setPivot(t,i){this.pivot=[t,i],this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}setSize(t){this.size=t>0?t:0,this.invalidatePath(),this.refresh()}changeSize(t){this.size=this.size+t>0?this.size+t:0,this.invalidatePath(),this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}getDrawOffset(){let[t,i]=this.pivot,e=o.sin(this.dir),s=o.cos(this.dir),r=-t*s-i*e,c=-t*e+i*s;return[r*this.size,c*this.size]}};var X=class n{static instance;loopRunning=!1;gameLoop=null;maxFPS=30;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new n),this.instance}constructor(){this.setMaxFPS(30),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),B.addEventListener("mousemove",t=>{this.mouseX=t.clientX-B.offsetLeft-B.width/2,this.mouseY=-(t.clientY-B.offsetTop-B.height/2)}),B.addEventListener("mousedown",()=>{this.mouseDown=!0}),B.addEventListener("mouseup",()=>{this.mouseDown=!1}),B.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}setScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFPS(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.setScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.setScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFPS(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(r=>r.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFPS(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,r=async c=>{if(!this.loopRunning)return;let a=c-this.lastFrame;this.lastFrame=c,s+=a,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(r)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(r)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,u.clearRect(0,0,h.width,h.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+h.width/2,r=h.height/2-e,c=s-(t.x+h.width/2),a=r-(h.height/2-t.y),l=-o.toRadians(t.dir),m=c*Math.cos(l)-a*Math.sin(l),g=c*Math.sin(l)+a*Math.cos(l);return u.isPointInPath(t.getCachedPath(),m,g)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}};function Tt(n,t){if(!n)throw new Error(t)}var it=class{amplitude=1;gradientCount=100;fade(t){return 6*t**5-15*t**4+10*t**3}lerp(t,i,e){return t*(1-e)+i*e}mod(t,i){return Tt(i>0,"Modulus must be greater than 0"),(t%i+i)%i}};var ct=class extends it{amplitude=1;gradientCount=100;gradients=[];constructor(){super(),this.regen()}regen(){this.gradients=[];for(let t=0;t<this.gradientCount;t++)this.gradients.push(Math.random()*2-1)}get(t){let i=Math.floor(t),e=i+1,s=this.gradients[this.mod(i,this.gradientCount)],r=this.gradients[this.mod(e,this.gradientCount)],c=t-i,a=t-e,l=s*c,m=r*a,g=this.fade(c);return this.lerp(l,m,g)*this.amplitude*2}};var ht=class extends it{amplitude=1;gradientCount=100;gradients=[];constructor(){super(),this.regen()}regen(){this.gradients=[];for(let t=0;t<this.gradientCount;t++){let i=[];for(let e=0;e<this.gradientCount;e++){let s=Math.random()*2-1,r=Math.random()*2-1,c=(s*s+r*r)**.5;c!==0?i.push([s/c,r/c]):i.push([1,0])}this.gradients.push(i)}}get(t,i){let e=Math.floor(t),s=Math.floor(i),r=e+1,c=s+1,a=this.gradients[this.mod(s,this.gradientCount)][this.mod(e,this.gradientCount)],l=this.gradients[this.mod(s,this.gradientCount)][this.mod(r,this.gradientCount)],m=this.gradients[this.mod(c,this.gradientCount)][this.mod(e,this.gradientCount)],g=this.gradients[this.mod(c,this.gradientCount)][this.mod(r,this.gradientCount)],v=t-e,p=i-s,f=t-r,V=i-c,z=a[0]*v+a[1]*p,w=l[0]*f+l[1]*p,y=m[0]*v+m[1]*V,P=g[0]*f+g[1]*V,S=this.fade(v),U=this.fade(p),R=this.lerp(z,w,S),q=this.lerp(y,P,S);return this.lerp(R,q,U)*this.amplitude*2}};import{io as Ht}from"socket.io-client";var at=class n{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new n(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=Ht(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var et=class n extends b{discriminant="rectangle";tags=new Set(["rectangle"]);width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.width/2,i=this.height/2,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),width:this.width,height:this.height,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var lt=class n extends b{discriminant="square";tags=new Set(["square"]);sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.sideLength/2,i=o.cos(this.dir),e=o.sin(this.dir),s=2*(Math.abs(t*i)+Math.abs(t*e))*this.size,r=this.getDrawOffset();return{x:this.x+r[0],y:this.y+r[1],width:s,height:s}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2*this.size,-this.sideLength/2*this.size,this.sideLength*this.size,this.sideLength*this.size),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),sideLength:this.sideLength,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var ut=class n extends b{discriminant="oval";tags=new Set(["oval"]);radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.radX,i=this.radY,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX*this.size,this.radY*this.size,0,0,Math.PI*2),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radX:this.radX,radY:this.radY,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var pt=class n extends b{discriminant="circle";tags=new Set(["circle"]);radius;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius*this.size,this.radius*this.size,0,0,Math.PI*2),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var dt=class n extends b{discriminant="arc";tags=new Set(["arc"]);radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius*this.size,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,angle:this.angle,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var mt=class n extends b{discriminant="regularpolygon";tags=new Set(["regularpolygon"]);sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius*this.size,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e)*this.size,this.radius*Math.sin(i*e)*this.size);return t.closePath(),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(o.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),sides:this.sides,radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var st=class n extends b{discriminant="custompolygon";tags=new Set(["custompolygon"]);vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=o.cos(this.dir),i=o.sin(this.dir),e=1/0,s=-1/0,r=1/0,c=-1/0;if(this.vertices.length===0)return{x:this.x,y:this.y,width:0,height:0};for(let p of this.vertices){let f=p[0]*t-p[1]*i,V=p[0]*i+p[1]*t,z=this.x+f,w=this.y+V;z<e&&(e=z),z>s&&(s=z),w<r&&(r=w),w>c&&(c=w)}let a=s-e,l=c-r,m=e+a/2,g=r+l/2,v=this.getDrawOffset();return{x:m*this.size+v[0],y:g*this.size+v[1],width:a*this.size,height:l*this.size}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...s]=i;t.moveTo(e[0]*this.size,-e[1]*this.size);for(let r of s)t.lineTo(r[0]*this.size,-r[1]*this.size);return t.closePath(),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),vertices:this.vertices,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var H=class n extends b{discriminant="pen";tags=new Set(["pen"]);drawing;penSize;color;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.penSize*this.size*2,height:this.penSize*this.size*2}}getPath(){return new Path2D}draw(){}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),drawing:this.drawing,penSize:this.penSize,color:this.color}}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){d.clearRect(0,0,h.width,h.height)}dot(){d.fillStyle=this.color,d.fillRect(this.x-this.penSize/2+h.width/2,-this.y-this.penSize/2+h.height/2,this.penSize,this.penSize)}static drawSprite(t,i){let e=new t(i??{});e.draw(!0),X.init().removeSprite(e)}drawLine(t,i){d.beginPath(),d.moveTo(t+h.width/2,-i+h.height/2),d.lineTo(this.x+h.width/2,-this.y+h.height/2),d.lineWidth=this.penSize,d.strokeStyle=this.color,d.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(o.toRadians(this.dir)),this.y+=t*Math.cos(o.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,s=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,s),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.penSize=t?.penSize??5,this.color=t?.color??"black"}};var rt=class n extends b{discriminant="text";tags=new Set(["text"]);content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=u.measureText(String(this.content)),i=t.width/2,e=t.actualBoundingBoxAscent+t.actualBoundingBoxDescent/2,s=o.cos(this.dir),r=o.sin(this.dir),c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size,a=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,l=this.getDrawOffset();return{x:this.x+l[0],y:this.y+l[1],width:c,height:a}}getPath(){let t=new Path2D;u.save(),u.font=this.font;let i=u.measureText(String(this.content)),e=i.width*this.size,s=(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent)*this.size;return u.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(String(this.content),0,0),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions,content:this.content,color:this.color,fontFamily:this.fontFamily,fontSize:this.fontSize,align:this.align,baseline:this.baseline}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var bt=class n extends b{discriminant="button";tags=new Set(["button"]);content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){u.save(),u.font=this.font;let t=u.measureText(String(this.content)),i=Math.max(t.width,this.width)/2,e=Math.max(t.actualBoundingBoxAscent+t.actualBoundingBoxDescent,this.height)/2;u.restore();let s=o.cos(this.dir),r=o.sin(this.dir),c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size,a=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,l=this.getDrawOffset();return{x:this.x+l[0],y:this.y+l[1],width:c,height:a}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let r=this.getCachedPath();i.fill(r),this.outlineWidth&&i.stroke(r),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(String(this.content),0,0),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),content:this.content,fontColor:this.fontColor,fontFamily:this.fontFamily,fontSize:this.fontSize,width:this.width,height:this.height,backgroundColor:this.backgroundColor,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??String(this.content).length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var gt=class n extends rt{tags=new Set(["text","watermark"]);create(t){return new n(t)}constructor(t){super(t),this.content=t?.content??"Made with TScratch",this.x=t?.x??-h.width/2+5,this.y=t?.y??h.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.invalidatePath()}};var ft=class n extends b{discriminant="imagesprite";tags=new Set(["imagesprite"]);costumes;costumeNumber;width;height;outlineColor;outlineWidth;imgBitmap=null;img;getBoundingBox(){let t=this.width/2,i=this.height/2,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?d:u;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.imgBitmap??this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),costumes:this.costumes,costumeNumber:this.costumeNumber,width:this.width,height:this.height,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setCostume(t){this.costumeNumber=t<this.costumes.length&&t>=0?t:0,this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}nextCostume(){this.costumeNumber=(this.costumeNumber+1)%this.costumes.length,this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}previousCostume(){this.costumeNumber--,this.costumeNumber<0&&(this.costumeNumber=this.costumes.length-1),this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}loadImageBitmap(){this.img.onload=()=>{this.imgBitmap=null,createImageBitmap(this.img).then(t=>{this.imgBitmap=t}),this.refresh()}}constructor(t){super(t),this.costumes=t?.costumes??[],this.costumeNumber=t?.costumeNumber&&t.costumeNumber<this.costumes.length&&t.costumeNumber>=0?t.costumeNumber:0,this.img=new Image,this.img.src=this.costumes[this.costumeNumber]??"",this.width=t?.width??0,this.height=t?.height??0,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.img.onload=()=>{t?.width||(this.width=this.img.width),t?.height||(this.height=this.img.height),createImageBitmap(this.img).then(i=>{this.imgBitmap=i}),this.draw()}}};var yt=class extends et{tags=new Set(["rectangle","rigidbody"]);obstacles;isStatic;gravity;drag;bounceLoss;velocity;angularVelocity;inertia;addObstacles(...t){this.obstacles.push(...t)}update(t=1){if(!this.isStatic){this.velocity[1]+=this.gravity*t,this.velocity[0]*=this.drag,this.velocity[1]*=this.drag,this.changeX(this.velocity[0]*t),this.changeY(this.velocity[1]*t),this.turn(-o.toDegrees(this.angularVelocity)*t);for(let i of this.obstacles){let e=this.touching(i);if(e){let{contact:s,normal:r,displacement:c}=e,l=Math.max(c-.05,0),m=i.isStatic?1:.5,g=r[0]*l*m,v=r[1]*l*m;this.changeX(g),this.changeY(v),i.isStatic||(i.changeX(-g),i.changeY(-v));let p=[s[0]-this.x,s[1]-this.y],f=[s[0]-i.x,s[1]-i.y],V=[this.velocity[0]-this.angularVelocity*p[1],this.velocity[1]+this.angularVelocity*p[0]],z=i.velocity,w=i.angularVelocity,y=[z[0]-w*f[1],z[1]+w*f[0]],P=[V[0]-y[0],V[1]-y[1]],S=P[0]*r[0]+P[1]*r[1];if(S<0){let R=p[0]*r[1]-p[1]*r[0],q=f[0]*r[1]-f[1]*r[0],J=1,O=i.isStatic?0:1,D=R*R,L=q*q,K=J+O+D/this.inertia+(i.isStatic?0:L/i.inertia),Q=-(1+this.bounceLoss)*S/K,A=[r[0]*Q,r[1]*Q],M=[-r[1],r[0]],G=P[0]*M[0]+P[1]*M[1],_=p[0]*M[1]-p[1]*M[0],k=f[0]*M[1]-f[1]*M[0],j=_*_,N=k*k,I=J+O+j/this.inertia+(i.isStatic?0:N/i.inertia),x=-G*.3/I,W=[M[0]*x,M[1]*x],Y=A[0]+W[0],Z=A[1]+W[1];this.velocity[0]+=Y,this.velocity[1]+=Z,this.angularVelocity+=(p[0]*Z-p[1]*Y)/this.inertia,i.isStatic||(i.velocity[0]-=Y,i.velocity[1]-=Z,i.angularVelocity-=(f[0]*Z-f[1]*Y)/i.inertia)}}}this.velocity[0]*=this.drag,this.velocity[1]*=this.drag,this.angularVelocity*=this.drag}}constructor(t){super(t),this.obstacles=t?.obstacles??[],this.isStatic=t?.isStatic??!1,this.gravity=t?.gravity??-1.8,this.drag=t?.drag??.96,this.bounceLoss=t?.bounceLoss??.92,this.velocity=t?.velocity??[0,0],this.angularVelocity=t?.angularVelocity??0,this.inertia=t?.inertia??700,this.invalidatePath()}};var xt=class{x=0;y=0;z=0;dirX=0;dirY=0;dirZ=0;constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.z=t?.z??0,this.dirX=t?.dirX??0,this.dirY=t?.dirY??0,this.dirZ=t?.dirZ??0}};var $=class extends H{FOV=60;ASPECT=h.width/h.height;Z_NEAR=.01;SPEED=2;SENSITIVITY=225;camera;objects;constructor(t){super(t),this.objects=t.objects,this.camera=t.camera}registerControls(){let t=X.init(),i=t.deltaTime,e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY);t.keyPressed("w")&&(this.camera.x+=this.SPEED*e*i,this.camera.z+=this.SPEED*s*i),t.keyPressed("a")&&(this.camera.x-=this.SPEED*s*i,this.camera.z+=this.SPEED*e*i),t.keyPressed("s")&&(this.camera.x-=this.SPEED*e*i,this.camera.z-=this.SPEED*s*i),t.keyPressed("d")&&(this.camera.x+=this.SPEED*s*i,this.camera.z-=this.SPEED*e*i),t.keyPressed("e")&&(this.camera.y+=this.SPEED*i),t.keyPressed("q")&&(this.camera.y-=this.SPEED*i),t.keyPressed("up")&&(this.camera.dirX+=this.SENSITIVITY*i),t.keyPressed("down")&&(this.camera.dirX-=this.SENSITIVITY*i),t.keyPressed("left")&&(this.camera.dirY-=this.SENSITIVITY*i),t.keyPressed("right")&&(this.camera.dirY+=this.SENSITIVITY*i);let r=89;this.camera.dirX=Math.max(-r,Math.min(r,this.camera.dirX))}project(t){let i=1/o.tan(this.FOV/2);return t.map(e=>{let s=e[0],r=e[1],c=e[2]<this.Z_NEAR?this.Z_NEAR:e[2],a=h.width/2*(s*i)/(c*this.ASPECT),l=h.height/2*(r*i)/c;return[a,l]})}getRelativeVertices(t){let i=o.sin(this.camera.dirX),e=o.cos(this.camera.dirX),s=o.sin(this.camera.dirY),r=o.cos(this.camera.dirY),c=o.sin(this.camera.dirZ),a=o.cos(this.camera.dirZ);return t.vertices.map(l=>{let m=l[0]*t.size+t.x-this.camera.x,g=l[1]*t.size+t.y-this.camera.y,v=l[2]*t.size+t.z-this.camera.z,p=m*r-v*s,f=m*s+v*r,V=g*e-f*i,z=g*i+f*e,w=p*a-V*c,y=p*c+V*a;return[w,y,z]})}};var vt=class extends ${render(){let t=o.sin(this.camera.dirX),i=o.cos(this.camera.dirX),e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY),r=o.sin(this.camera.dirZ),c=o.cos(this.camera.dirZ);for(let a of this.objects){let l=this.project(this.getRelativeVertices(a));this.color=a.color||"black";for(let m of a.faces){let[g,v]=l[m[0]];this.goTo(g,v),this.down();for(let p of m){let[f,V]=l[p];this.goTo(f,V)}this.goTo(g,v),this.up()}}}};var St=class n extends ${AMBIENT_LIGHT_INTENSITY=.25;DIRECTED_LIGHT_INTENSITY=.75;DIRECTED_LIGHT_DIR=[0,1,0];render(){let t=o.sin(this.camera.dirX),i=o.cos(this.camera.dirX),e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY),r=o.sin(this.camera.dirZ),c=o.cos(this.camera.dirZ),a=this.DIRECTED_LIGHT_DIR[0],l=this.DIRECTED_LIGHT_DIR[1],m=this.DIRECTED_LIGHT_DIR[2],g=a*s-m*e,v=a*e+m*s,p=l*i-v*t,f=l*t+v*i,V=g*c-p*r,z=g*r+p*c,w=o.normalize([V,z,f]);for(let y of this.objects){let{h:P,s:S,l:U}=n.stringToHSL(y.color||"black"),R=this.getRelativeVertices(y),q=y.faces.map(O=>{let D=0;for(let L of O)D+=R[L][2];return{face:O,depth:D/O.length}});q.sort((O,D)=>D.depth-O.depth);let J=this.project(R);for(let{face:O}of q){let D=0,L=0,K=0;for(let j=0;j<O.length;j++){let N=R[O[j]],I=R[O[(j+1)%O.length]];D+=(N[1]-I[1])*(N[2]+I[2]),L+=(N[2]-I[2])*(N[0]+I[0]),K+=(N[0]-I[0])*(N[1]+I[1])}let Q=o.normalize([D,L,K]),A=Math.max(0,o.dot(Q,w)),M=this.AMBIENT_LIGHT_INTENSITY+A*this.DIRECTED_LIGHT_INTENSITY,G=Math.min(100,Math.max(5,U+M*50)),_=`hsl(${P}, ${S}%, ${G}%)`,k=O.map(j=>J[j]);H.drawSprite(st,{vertices:k,color:_})}}}static stringToHSL(t){let i=document.createElement("div");i.style.color=t,document.body.appendChild(i);let e=getComputedStyle(i).color;document.body.removeChild(i);let[s,r,c]=e.match(/\d+/g).map(Number);s/=255,r/=255,c/=255;let a=Math.max(s,r,c),l=Math.min(s,r,c),m=0,g=0,v=(a+l)/2;if(a===l)m=g=0;else{let p=a-l;switch(g=v>.5?p/(2-a-l):p/(a+l),a){case s:m=(r-c)/p+(r<c?6:0);break;case r:m=(c-s)/p+2;break;case c:m=(s-r)/p+4;break}m*=60}return{h:m,s:g*100,l:v*100}}};var C=class{x;y;z;dirX;dirY;dirZ;color;size;vertices;faces;constructor(t){this.vertices=t.vertices,this.faces=t.faces,this.x=t.x??0,this.y=t.y??0,this.z=t.z??2,this.dirX=t.dirX??0,this.dirY=t.dirY??0,this.dirZ=t.dirZ??0,this.color=t.color??"black",this.size=t.size??1}rotateX(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][1]=c*i-a*e,this.vertices[s][2]=c*e+a*i}}rotateY(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][0]=r*i+a*e,this.vertices[s][2]=-r*e+a*i}}rotateZ(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][0]=r*i-c*e,this.vertices[s][1]=r*e+c*i}}pointX(t){let i=t-this.dirX;this.dirX=t,this.rotateX(i)}pointY(t){let i=t-this.dirY;this.dirY=t,this.rotateY(i)}pointZ(t){let i=t-this.dirZ;this.dirZ=t,this.rotateZ(i)}static loadObj(t){let i=t.split(`
2
- `),e=i.filter(r=>r.startsWith("v ")).map(r=>r.split(" ").slice(1).map(parseFloat)),s=i.filter(r=>r.startsWith("f ")).map(r=>r.split(" ").slice(1).map(c=>parseInt(c.split("/")[0])-1));return{vertices:e,faces:s}}};var $t=[[0,1,2],[0,3,1],[0,2,3],[1,3,2]],It=$t;var Gt=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],Wt=Gt;var Ct=class extends C{constructor(t){super({...t,vertices:Wt,faces:It})}};var _t=[[0,1,2,3],[4,5,6,7],[3,2,6,7],[0,1,5,4],[0,3,7,4],[1,2,6,5]],Dt=_t;function nt(n,t,i){return[[-.5*n,-.5*t,-.5*i],[.5*n,-.5*t,-.5*i],[.5*n,-.5*t,.5*i],[-.5*n,-.5*t,.5*i],[-.5*n,.5*t,-.5*i],[.5*n,.5*t,-.5*i],[.5*n,.5*t,.5*i],[-.5*n,.5*t,.5*i]]}var wt=class extends C{constructor(t){super({...t,vertices:nt(1,1,1),faces:Dt})}};var Ut=[[0,2,4],[2,1,4],[1,3,4],[3,0,4],[2,0,5],[1,2,5],[3,1,5],[0,3,5]],Yt=Ut;var Jt=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],Xt=Jt;var Ot=class extends C{constructor(t){super({...t,vertices:Xt,faces:Yt})}};var Kt=[[0,4,8],[0,8,9],[0,9,6],[0,6,1],[0,1,4],[3,10,5],[3,5,2],[3,2,7],[3,7,11],[3,11,10],[4,1,6],[4,6,9],[8,4,10],[8,10,5],[9,8,2],[9,2,7],[6,9,7],[6,7,11],[1,6,11],[1,11,10]],Et=Kt;var T=(1+Math.sqrt(5))/2,E=.5/T,F=.5,Qt=[[0,-F,-E*T],[0,-F,E*T],[0,F,-E*T],[0,F,E*T],[-F,-E*T,0],[-F,E*T,0],[F,-E*T,0],[F,E*T,0],[-E*T,0,-F],[E*T,0,-F],[-E*T,0,F],[E*T,0,F]],Ft=Qt;var Vt=class extends C{constructor(t){super({...t,vertices:Ft,faces:Et})}};var ti=[[0,13,12],[1,13,15],[0,12,17],[0,17,19],[0,19,16],[1,15,22],[2,14,24],[3,18,26],[4,20,28],[5,21,30],[1,22,25],[2,24,27],[3,26,29],[4,28,31],[5,30,23],[6,32,37],[7,33,39],[8,34,40],[9,35,41],[10,36,38],[38,41,11],[38,36,41],[36,9,41],[41,40,11],[41,35,40],[35,8,40],[40,39,11],[40,34,39],[34,7,39],[39,37,11],[39,33,37],[33,6,37],[37,38,11],[37,32,38],[32,10,38],[23,36,10],[23,30,36],[30,9,36],[31,35,9],[31,28,35],[28,8,35],[29,34,8],[29,26,34],[26,7,34],[27,33,7],[27,24,33],[24,6,33],[25,32,6],[25,22,32],[22,10,32],[30,31,9],[30,21,31],[21,4,31],[28,29,8],[28,20,29],[20,3,29],[26,27,7],[26,18,27],[18,2,27],[24,25,6],[24,14,25],[14,1,25],[22,23,10],[22,15,23],[15,5,23],[16,21,5],[16,19,21],[19,4,21],[19,20,4],[19,17,20],[17,3,20],[17,18,3],[17,12,18],[12,2,18],[15,16,5],[15,13,16],[13,0,16],[12,14,2],[12,13,14],[13,1,14]],Lt=ti;var ii=[[0,-1,0],[.723607,-.44722,.525725],[-.276388,-.44722,.850649],[-.894426,-.447216,0],[-.276388,-.44722,-.850649],[.723607,-.44722,-.525725],[.276388,.44722,.850649],[-.723607,.44722,.525725],[-.723607,.44722,-.525725],[.276388,.44722,-.850649],[.894426,.447216,0],[0,1,0],[-.162456,-.850654,.499995],[.425323,-.850654,.309011],[.262869,-.525738,.809012],[.850648,-.525736,0],[.425323,-.850654,-.309011],[-.52573,-.850652,0],[-.688189,-.525736,.499997],[-.162456,-.850654,-.499995],[-.688189,-.525736,-.499997],[.262869,-.525738,-.809012],[.951058,0,.309013],[.951058,0,-.309013],[0,0,1],[.587786,0,.809017],[-.951058,0,.309013],[-.587786,0,.809017],[-.587786,0,-.809017],[-.951058,0,-.309013],[.587786,0,-.809017],[0,0,-1],[.688189,.525736,.499997],[-.262869,.525738,.809012],[-.850648,.525736,0],[-.262869,.525738,-.809012],[.688189,.525736,-.499997],[.162456,.850654,.499995],[.52573,.850652,0],[-.425323,.850654,.309011],[-.425323,.850654,-.309011],[.162456,.850654,-.499995]],At=ii;var Pt=class extends C{constructor(t){super({...t,vertices:At,faces:Lt})}};var ei=[[46,0,2,44],[3,1,47,45],[44,2,4,42],[5,3,45,43],[2,8,6,4],[7,9,3,5],[0,10,8,2],[9,11,1,3],[10,12,14,8],[15,13,11,9],[8,14,16,6],[17,15,9,7],[14,20,18,16],[19,21,15,17],[12,22,20,14],[21,23,13,15],[22,24,26,20],[27,25,23,21],[20,26,28,18],[29,27,21,19],[26,32,30,28],[31,33,27,29],[24,34,32,26],[33,35,25,27],[34,36,38,32],[39,37,35,33],[32,38,40,30],[41,39,33,31],[38,44,42,40],[43,45,39,41],[36,46,44,38],[45,47,37,39],[46,36,50,48],[51,37,47,49],[36,34,52,50],[53,35,37,51],[34,24,54,52],[55,25,35,53],[24,22,56,54],[57,23,25,55],[22,12,58,56],[59,13,23,57],[12,10,62,58],[63,11,13,59],[10,0,64,62],[65,1,11,63],[0,46,48,64],[49,47,1,65],[60,64,48],[49,65,61],[62,64,60],[61,65,63],[60,58,62],[63,59,61],[60,56,58],[59,57,61],[60,54,56],[57,55,61],[60,52,54],[55,53,61],[60,50,52],[53,51,61],[60,48,50],[51,49,61],[88,173,175,90],[175,174,89,90],[86,171,173,88],[174,172,87,89],[84,169,171,86],[172,170,85,87],[82,167,169,84],[170,168,83,85],[80,165,167,82],[168,166,81,83],[78,91,145,163],[146,92,79,164],[91,93,147,145],[148,94,92,146],[93,95,149,147],[150,96,94,148],[95,97,151,149],[152,98,96,150],[97,99,153,151],[154,100,98,152],[99,101,155,153],[156,102,100,154],[101,103,157,155],[158,104,102,156],[103,105,159,157],[160,106,104,158],[105,107,161,159],[162,108,106,160],[107,66,67,161],[67,66,108,162],[109,127,159,161],[160,128,110,162],[127,178,157,159],[158,179,128,160],[125,155,157,178],[158,156,126,179],[123,153,155,125],[156,154,124,126],[121,151,153,123],[154,152,122,124],[119,149,151,121],[152,150,120,122],[117,147,149,119],[150,148,118,120],[115,145,147,117],[148,146,116,118],[113,163,145,115],[146,164,114,116],[113,180,176,163],[176,181,114,164],[109,161,67,111],[67,162,110,112],[111,67,177,182],[177,67,112,183],[176,180,182,177],[183,181,176,177],[134,136,175,173],[175,136,135,174],[132,134,173,171],[174,135,133,172],[130,132,171,169],[172,133,131,170],[165,186,184,167],[185,187,166,168],[130,169,167,184],[168,170,131,185],[143,189,188,186],[188,189,144,187],[184,186,188,68],[188,187,185,68],[129,130,184,68],[185,131,129,68],[141,192,190,143],[191,193,142,144],[139,194,192,141],[193,195,140,142],[138,196,194,139],[195,197,138,140],[137,70,196,138],[197,70,137,138],[189,143,190,69],[191,144,189,69],[69,190,205,207],[206,191,69,207],[70,198,199,196],[200,198,70,197],[196,199,201,194],[202,200,197,195],[194,201,203,192],[204,202,195,193],[192,203,205,190],[206,204,193,191],[198,203,201,199],[202,204,198,200],[198,207,205,203],[206,207,198,204],[138,139,163,176],[164,140,138,176],[139,141,210,163],[211,142,140,164],[141,143,212,210],[213,144,142,211],[143,186,165,212],[166,187,144,213],[80,208,212,165],[213,209,81,166],[208,214,210,212],[211,215,209,213],[78,163,210,214],[211,164,79,215],[130,129,71,221],[71,129,131,222],[132,130,221,219],[222,131,133,220],[134,132,219,217],[220,133,135,218],[136,134,217,216],[218,135,136,216],[216,217,228,230],[229,218,216,230],[217,219,226,228],[227,220,218,229],[219,221,224,226],[225,222,220,227],[221,71,223,224],[223,71,222,225],[223,230,228,224],[229,230,223,225],[224,228,226],[227,229,225],[182,180,233,231],[234,181,183,232],[111,182,231,253],[232,183,112,254],[109,111,253,255],[254,112,110,256],[180,113,251,233],[252,114,181,234],[113,115,249,251],[250,116,114,252],[115,117,247,249],[248,118,116,250],[117,119,245,247],[246,120,118,248],[119,121,243,245],[244,122,120,246],[121,123,241,243],[242,124,122,244],[123,125,239,241],[240,126,124,242],[125,178,235,239],[236,179,126,240],[178,127,237,235],[238,128,179,236],[127,109,255,237],[256,110,128,238],[237,255,257,275],[258,256,238,276],[235,237,275,277],[276,238,236,278],[239,235,277,273],[278,236,240,274],[241,239,273,271],[274,240,242,272],[243,241,271,269],[272,242,244,270],[245,243,269,267],[270,244,246,268],[247,245,267,265],[268,246,248,266],[249,247,265,263],[266,248,250,264],[251,249,263,261],[264,250,252,262],[233,251,261,279],[262,252,234,280],[255,253,259,257],[260,254,256,258],[253,231,281,259],[282,232,254,260],[231,233,279,281],[280,234,232,282],[66,107,283,72],[284,108,66,72],[107,105,285,283],[286,106,108,284],[105,103,287,285],[288,104,106,286],[103,101,289,287],[290,102,104,288],[101,99,291,289],[292,100,102,290],[99,97,293,291],[294,98,100,292],[97,95,295,293],[296,96,98,294],[95,93,297,295],[298,94,96,296],[93,91,299,297],[300,92,94,298],[307,308,327,337],[328,308,307,338],[306,307,337,335],[338,307,306,336],[305,306,335,339],[336,306,305,340],[88,90,305,339],[305,90,89,340],[86,88,339,333],[340,89,87,334],[84,86,333,329],[334,87,85,330],[82,84,329,331],[330,85,83,332],[329,335,337,331],[338,336,330,332],[329,333,339,335],[340,334,330,336],[325,331,337,327],[338,332,326,328],[80,82,331,325],[332,83,81,326],[208,341,343,214],[344,342,209,215],[80,325,341,208],[342,326,81,209],[78,214,343,345],[344,215,79,346],[78,345,299,91],[300,346,79,92],[76,323,351,303],[352,324,76,303],[303,351,349,77],[350,352,303,77],[77,349,347,304],[348,350,77,304],[304,347,327,308],[328,348,304,308],[325,327,347,341],[348,328,326,342],[295,297,317,309],[318,298,296,310],[75,315,323,76],[324,316,75,76],[301,357,355,302],[356,358,301,302],[302,355,353,74],[354,356,302,74],[74,353,315,75],[316,354,74,75],[291,293,361,363],[362,294,292,364],[363,361,367,365],[368,362,364,366],[365,367,369,371],[370,368,366,372],[371,369,375,373],[376,370,372,374],[313,377,373,375],[374,378,314,376],[315,353,373,377],[374,354,316,378],[353,355,371,373],[372,356,354,374],[355,357,365,371],[366,358,356,372],[357,359,363,365],[364,360,358,366],[289,291,363,359],[364,292,290,360],[73,359,357,301],[358,360,73,301],[283,285,287,289],[288,286,284,290],[283,289,359,73],[360,290,284,73],[72,283,73],[73,284,72],[293,295,309,361],[310,296,294,362],[309,311,367,361],[368,312,310,362],[311,381,369,367],[370,382,312,368],[313,375,369,381],[370,376,314,382],[347,349,385,383],[386,350,348,384],[317,383,385,319],[386,384,318,320],[297,299,383,317],[384,300,298,318],[299,343,341,383],[342,344,300,384],[341,347,383],[384,348,342],[299,345,343],[344,346,300],[313,321,379,377],[380,322,314,378],[315,377,379,323],[380,378,316,324],[319,385,379,321],[380,386,320,322],[349,351,379,385],[380,352,350,386],[323,379,351],[352,380,324],[399,387,413,401],[414,388,400,402],[399,401,403,397],[404,402,400,398],[397,403,405,395],[406,404,398,396],[395,405,407,393],[408,406,396,394],[393,407,409,391],[410,408,394,392],[391,409,411,389],[412,410,392,390],[409,419,417,411],[418,420,410,412],[407,421,419,409],[420,422,408,410],[405,423,421,407],[422,424,406,408],[403,425,423,405],[424,426,404,406],[401,427,425,403],[426,428,402,404],[401,413,415,427],[416,414,402,428],[317,319,443,441],[444,320,318,442],[319,389,411,443],[412,390,320,444],[309,317,441,311],[442,318,310,312],[381,429,413,387],[414,430,382,388],[411,417,439,443],[440,418,412,444],[437,445,443,439],[444,446,438,440],[433,445,437,435],[438,446,434,436],[431,447,445,433],[446,448,432,434],[429,447,431,449],[432,448,430,450],[413,429,449,415],[450,430,414,416],[311,447,429,381],[430,448,312,382],[311,441,445,447],[446,442,312,448],[441,443,445],[446,444,442],[415,449,451,475],[452,450,416,476],[449,431,461,451],[462,432,450,452],[431,433,459,461],[460,434,432,462],[433,435,457,459],[458,436,434,460],[435,437,455,457],[456,438,436,458],[437,439,453,455],[454,440,438,456],[439,417,473,453],[474,418,440,454],[427,415,475,463],[476,416,428,464],[425,427,463,465],[464,428,426,466],[423,425,465,467],[466,426,424,468],[421,423,467,469],[468,424,422,470],[419,421,469,471],[470,422,420,472],[417,419,471,473],[472,420,418,474],[457,455,479,477],[480,456,458,478],[477,479,481,483],[482,480,478,484],[483,481,487,485],[488,482,484,486],[485,487,489,491],[490,488,486,492],[463,475,485,491],[486,476,464,492],[451,483,485,475],[486,484,452,476],[451,461,477,483],[478,462,452,484],[457,477,461,459],[462,478,458,460],[453,473,479,455],[480,474,454,456],[471,481,479,473],[480,482,472,474],[469,487,481,471],[482,488,470,472],[467,489,487,469],[488,490,468,470],[465,491,489,467],[490,492,466,468],[463,491,465],[466,492,464],[391,389,503,501],[504,390,392,502],[393,391,501,499],[502,392,394,500],[395,393,499,497],[500,394,396,498],[397,395,497,495],[498,396,398,496],[399,397,495,493],[496,398,400,494],[387,399,493,505],[494,400,388,506],[493,501,503,505],[504,502,494,506],[493,495,499,501],[500,496,494,502],[495,497,499],[500,498,496],[313,381,387,505],[388,382,314,506],[313,505,503,321],[504,506,314,322],[319,321,503,389],[504,322,320,390]],jt=ei;var si=[[.4375,.164062,.765625],[-.4375,.164062,.765625],[.5,.09375,.6875],[-.5,.09375,.6875],[.546875,.054688,.578125],[-.546875,.054688,.578125],[.351562,-.023438,.617188],[-.351562,-.023438,.617188],[.351562,.03125,.71875],[-.351562,.03125,.71875],[.351562,.132812,.78125],[-.351562,.132812,.78125],[.273438,.164062,.796875],[-.273438,.164062,.796875],[.203125,.09375,.742188],[-.203125,.09375,.742188],[.15625,.054688,.648438],[-.15625,.054688,.648438],[.078125,.242188,.65625],[-.078125,.242188,.65625],[.140625,.242188,.742188],[-.140625,.242188,.742188],[.242188,.242188,.796875],[-.242188,.242188,.796875],[.273438,.328125,.796875],[-.273438,.328125,.796875],[.203125,.390625,.742188],[-.203125,.390625,.742188],[.15625,.4375,.648438],[-.15625,.4375,.648438],[.351562,.515625,.617188],[-.351562,.515625,.617188],[.351562,.453125,.71875],[-.351562,.453125,.71875],[.351562,.359375,.78125],[-.351562,.359375,.78125],[.4375,.328125,.765625],[-.4375,.328125,.765625],[.5,.390625,.6875],[-.5,.390625,.6875],[.546875,.4375,.578125],[-.546875,.4375,.578125],[.625,.242188,.5625],[-.625,.242188,.5625],[.5625,.242188,.671875],[-.5625,.242188,.671875],[.46875,.242188,.757812],[-.46875,.242188,.757812],[.476562,.242188,.773438],[-.476562,.242188,.773438],[.445312,.335938,.78125],[-.445312,.335938,.78125],[.351562,.375,.804688],[-.351562,.375,.804688],[.265625,.335938,.820312],[-.265625,.335938,.820312],[.226562,.242188,.820312],[-.226562,.242188,.820312],[.265625,.15625,.820312],[-.265625,.15625,.820312],[.351562,.242188,.828125],[-.351562,.242188,.828125],[.351562,.117188,.804688],[-.351562,.117188,.804688],[.445312,.15625,.78125],[-.445312,.15625,.78125],[0,.429688,.742188],[0,.351562,.820312],[0,-.679688,.734375],[0,-.320312,.78125],[0,-.1875,.796875],[0,-.773438,.71875],[0,.40625,.601562],[0,.570312,.570312],[0,.898438,-.546875],[0,.5625,-.851562],[0,.070312,-.828125],[0,-.382812,-.351562],[.203125,-.1875,.5625],[-.203125,-.1875,.5625],[.3125,-.4375,.570312],[-.3125,-.4375,.570312],[.351562,-.695312,.570312],[-.351562,-.695312,.570312],[.367188,-.890625,.53125],[-.367188,-.890625,.53125],[.328125,-.945312,.523438],[-.328125,-.945312,.523438],[.179688,-.96875,.554688],[-.179688,-.96875,.554688],[0,-.984375,.578125],[.4375,-.140625,.53125],[-.4375,-.140625,.53125],[.632812,-.039062,.539062],[-.632812,-.039062,.539062],[.828125,.148438,.445312],[-.828125,.148438,.445312],[.859375,.429688,.59375],[-.859375,.429688,.59375],[.710938,.484375,.625],[-.710938,.484375,.625],[.492188,.601562,.6875],[-.492188,.601562,.6875],[.320312,.757812,.734375],[-.320312,.757812,.734375],[.15625,.71875,.757812],[-.15625,.71875,.757812],[.0625,.492188,.75],[-.0625,.492188,.75],[.164062,.414062,.773438],[-.164062,.414062,.773438],[.125,.304688,.765625],[-.125,.304688,.765625],[.203125,.09375,.742188],[-.203125,.09375,.742188],[.375,.015625,.703125],[-.375,.015625,.703125],[.492188,.0625,.671875],[-.492188,.0625,.671875],[.625,.1875,.648438],[-.625,.1875,.648438],[.640625,.296875,.648438],[-.640625,.296875,.648438],[.601562,.375,.664062],[-.601562,.375,.664062],[.429688,.4375,.71875],[-.429688,.4375,.71875],[.25,.46875,.757812],[-.25,.46875,.757812],[0,-.765625,.734375],[.109375,-.71875,.734375],[-.109375,-.71875,.734375],[.117188,-.835938,.710938],[-.117188,-.835938,.710938],[.0625,-.882812,.695312],[-.0625,-.882812,.695312],[0,-.890625,.6875],[0,-.195312,.75],[0,-.140625,.742188],[.101562,-.148438,.742188],[-.101562,-.148438,.742188],[.125,-.226562,.75],[-.125,-.226562,.75],[.085938,-.289062,.742188],[-.085938,-.289062,.742188],[.398438,-.046875,.671875],[-.398438,-.046875,.671875],[.617188,.054688,.625],[-.617188,.054688,.625],[.726562,.203125,.601562],[-.726562,.203125,.601562],[.742188,.375,.65625],[-.742188,.375,.65625],[.6875,.414062,.726562],[-.6875,.414062,.726562],[.4375,.546875,.796875],[-.4375,.546875,.796875],[.3125,.640625,.835938],[-.3125,.640625,.835938],[.203125,.617188,.851562],[-.203125,.617188,.851562],[.101562,.429688,.84375],[-.101562,.429688,.84375],[.125,-.101562,.8125],[-.125,-.101562,.8125],[.210938,-.445312,.710938],[-.210938,-.445312,.710938],[.25,-.703125,.6875],[-.25,-.703125,.6875],[.265625,-.820312,.664062],[-.265625,-.820312,.664062],[.234375,-.914062,.632812],[-.234375,-.914062,.632812],[.164062,-.929688,.632812],[-.164062,-.929688,.632812],[0,-.945312,.640625],[0,.046875,.726562],[0,.210938,.765625],[.328125,.476562,.742188],[-.328125,.476562,.742188],[.164062,.140625,.75],[-.164062,.140625,.75],[.132812,.210938,.757812],[-.132812,.210938,.757812],[.117188,-.6875,.734375],[-.117188,-.6875,.734375],[.078125,-.445312,.75],[-.078125,-.445312,.75],[0,-.445312,.75],[0,-.328125,.742188],[.09375,-.273438,.78125],[-.09375,-.273438,.78125],[.132812,-.226562,.796875],[-.132812,-.226562,.796875],[.109375,-.132812,.78125],[-.109375,-.132812,.78125],[.039062,-.125,.78125],[-.039062,-.125,.78125],[0,-.203125,.828125],[.046875,-.148438,.8125],[-.046875,-.148438,.8125],[.09375,-.15625,.8125],[-.09375,-.15625,.8125],[.109375,-.226562,.828125],[-.109375,-.226562,.828125],[.078125,-.25,.804688],[-.078125,-.25,.804688],[0,-.289062,.804688],[.257812,-.3125,.554688],[-.257812,-.3125,.554688],[.164062,-.242188,.710938],[-.164062,-.242188,.710938],[.179688,-.3125,.710938],[-.179688,-.3125,.710938],[.234375,-.25,.554688],[-.234375,-.25,.554688],[0,-.875,.6875],[.046875,-.867188,.6875],[-.046875,-.867188,.6875],[.09375,-.820312,.710938],[-.09375,-.820312,.710938],[.09375,-.742188,.726562],[-.09375,-.742188,.726562],[0,-.78125,.65625],[.09375,-.75,.664062],[-.09375,-.75,.664062],[.09375,-.8125,.640625],[-.09375,-.8125,.640625],[.046875,-.851562,.632812],[-.046875,-.851562,.632812],[0,-.859375,.632812],[.171875,.21875,.78125],[-.171875,.21875,.78125],[.1875,.15625,.773438],[-.1875,.15625,.773438],[.335938,.429688,.757812],[-.335938,.429688,.757812],[.273438,.421875,.773438],[-.273438,.421875,.773438],[.421875,.398438,.773438],[-.421875,.398438,.773438],[.5625,.351562,.695312],[-.5625,.351562,.695312],[.585938,.289062,.6875],[-.585938,.289062,.6875],[.578125,.195312,.679688],[-.578125,.195312,.679688],[.476562,.101562,.71875],[-.476562,.101562,.71875],[.375,.0625,.742188],[-.375,.0625,.742188],[.226562,.109375,.78125],[-.226562,.109375,.78125],[.179688,.296875,.78125],[-.179688,.296875,.78125],[.210938,.375,.78125],[-.210938,.375,.78125],[.234375,.359375,.757812],[-.234375,.359375,.757812],[.195312,.296875,.757812],[-.195312,.296875,.757812],[.242188,.125,.757812],[-.242188,.125,.757812],[.375,.085938,.726562],[-.375,.085938,.726562],[.460938,.117188,.703125],[-.460938,.117188,.703125],[.546875,.210938,.671875],[-.546875,.210938,.671875],[.554688,.28125,.671875],[-.554688,.28125,.671875],[.53125,.335938,.679688],[-.53125,.335938,.679688],[.414062,.390625,.75],[-.414062,.390625,.75],[.28125,.398438,.765625],[-.28125,.398438,.765625],[.335938,.40625,.75],[-.335938,.40625,.75],[.203125,.171875,.75],[-.203125,.171875,.75],[.195312,.226562,.75],[-.195312,.226562,.75],[.109375,.460938,.609375],[-.109375,.460938,.609375],[.195312,.664062,.617188],[-.195312,.664062,.617188],[.335938,.6875,.59375],[-.335938,.6875,.59375],[.484375,.554688,.554688],[-.484375,.554688,.554688],[.679688,.453125,.492188],[-.679688,.453125,.492188],[.796875,.40625,.460938],[-.796875,.40625,.460938],[.773438,.164062,.375],[-.773438,.164062,.375],[.601562,0,.414062],[-.601562,0,.414062],[.4375,-.09375,.46875],[-.4375,-.09375,.46875],[0,.898438,.289062],[0,.984375,-.078125],[0,-.195312,-.671875],[0,-.460938,.1875],[0,-.976562,.460938],[0,-.804688,.34375],[0,-.570312,.320312],[0,-.484375,.28125],[.851562,.234375,.054688],[-.851562,.234375,.054688],[.859375,.320312,-.046875],[-.859375,.320312,-.046875],[.773438,.265625,-.4375],[-.773438,.265625,-.4375],[.460938,.4375,-.703125],[-.460938,.4375,-.703125],[.734375,-.046875,.070312],[-.734375,-.046875,.070312],[.59375,-.125,-.164062],[-.59375,-.125,-.164062],[.640625,-.007812,-.429688],[-.640625,-.007812,-.429688],[.335938,.054688,-.664062],[-.335938,.054688,-.664062],[.234375,-.351562,.40625],[-.234375,-.351562,.40625],[.179688,-.414062,.257812],[-.179688,-.414062,.257812],[.289062,-.710938,.382812],[-.289062,-.710938,.382812],[.25,-.5,.390625],[-.25,-.5,.390625],[.328125,-.914062,.398438],[-.328125,-.914062,.398438],[.140625,-.757812,.367188],[-.140625,-.757812,.367188],[.125,-.539062,.359375],[-.125,-.539062,.359375],[.164062,-.945312,.4375],[-.164062,-.945312,.4375],[.21875,-.28125,.429688],[-.21875,-.28125,.429688],[.210938,-.226562,.46875],[-.210938,-.226562,.46875],[.203125,-.171875,.5],[-.203125,-.171875,.5],[.210938,-.390625,.164062],[-.210938,-.390625,.164062],[.296875,-.3125,-.265625],[-.296875,-.3125,-.265625],[.34375,-.148438,-.539062],[-.34375,-.148438,-.539062],[.453125,.867188,-.382812],[-.453125,.867188,-.382812],[.453125,.929688,-.070312],[-.453125,.929688,-.070312],[.453125,.851562,.234375],[-.453125,.851562,.234375],[.460938,.523438,.429688],[-.460938,.523438,.429688],[.726562,.40625,.335938],[-.726562,.40625,.335938],[.632812,.453125,.28125],[-.632812,.453125,.28125],[.640625,.703125,.054688],[-.640625,.703125,.054688],[.796875,.5625,.125],[-.796875,.5625,.125],[.796875,.617188,-.117188],[-.796875,.617188,-.117188],[.640625,.75,-.195312],[-.640625,.75,-.195312],[.640625,.679688,-.445312],[-.640625,.679688,-.445312],[.796875,.539062,-.359375],[-.796875,.539062,-.359375],[.617188,.328125,-.585938],[-.617188,.328125,-.585938],[.484375,.023438,-.546875],[-.484375,.023438,-.546875],[.820312,.328125,-.203125],[-.820312,.328125,-.203125],[.40625,-.171875,.148438],[-.40625,-.171875,.148438],[.429688,-.195312,-.210938],[-.429688,-.195312,-.210938],[.890625,.40625,-.234375],[-.890625,.40625,-.234375],[.773438,-.140625,-.125],[-.773438,-.140625,-.125],[1.039062,-.101562,-.328125],[-1.039062,-.101562,-.328125],[1.28125,.054688,-.429688],[-1.28125,.054688,-.429688],[1.351562,.320312,-.421875],[-1.351562,.320312,-.421875],[1.234375,.507812,-.421875],[-1.234375,.507812,-.421875],[1.023438,.476562,-.3125],[-1.023438,.476562,-.3125],[1.015625,.414062,-.289062],[-1.015625,.414062,-.289062],[1.1875,.4375,-.390625],[-1.1875,.4375,-.390625],[1.265625,.289062,-.40625],[-1.265625,.289062,-.40625],[1.210938,.078125,-.40625],[-1.210938,.078125,-.40625],[1.03125,-.039062,-.304688],[-1.03125,-.039062,-.304688],[.828125,-.070312,-.132812],[-.828125,-.070312,-.132812],[.921875,.359375,-.21875],[-.921875,.359375,-.21875],[.945312,.304688,-.289062],[-.945312,.304688,-.289062],[.882812,-.023438,-.210938],[-.882812,-.023438,-.210938],[1.039062,0,-.367188],[-1.039062,0,-.367188],[1.1875,.09375,-.445312],[-1.1875,.09375,-.445312],[1.234375,.25,-.445312],[-1.234375,.25,-.445312],[1.171875,.359375,-.4375],[-1.171875,.359375,-.4375],[1.023438,.34375,-.359375],[-1.023438,.34375,-.359375],[.84375,.289062,-.210938],[-.84375,.289062,-.210938],[.835938,.171875,-.273438],[-.835938,.171875,-.273438],[.757812,.09375,-.273438],[-.757812,.09375,-.273438],[.820312,.085938,-.273438],[-.820312,.085938,-.273438],[.84375,.015625,-.273438],[-.84375,.015625,-.273438],[.8125,-.015625,-.273438],[-.8125,-.015625,-.273438],[.726562,0,-.070312],[-.726562,0,-.070312],[.71875,-.023438,-.171875],[-.71875,-.023438,-.171875],[.71875,.039062,-.1875],[-.71875,.039062,-.1875],[.796875,.203125,-.210938],[-.796875,.203125,-.210938],[.890625,.242188,-.265625],[-.890625,.242188,-.265625],[.890625,.234375,-.320312],[-.890625,.234375,-.320312],[.8125,-.015625,-.320312],[-.8125,-.015625,-.320312],[.851562,.015625,-.320312],[-.851562,.015625,-.320312],[.828125,.078125,-.320312],[-.828125,.078125,-.320312],[.765625,.09375,-.320312],[-.765625,.09375,-.320312],[.84375,.171875,-.320312],[-.84375,.171875,-.320312],[1.039062,.328125,-.414062],[-1.039062,.328125,-.414062],[1.1875,.34375,-.484375],[-1.1875,.34375,-.484375],[1.257812,.242188,-.492188],[-1.257812,.242188,-.492188],[1.210938,.085938,-.484375],[-1.210938,.085938,-.484375],[1.046875,0,-.421875],[-1.046875,0,-.421875],[.882812,-.015625,-.265625],[-.882812,-.015625,-.265625],[.953125,.289062,-.34375],[-.953125,.289062,-.34375],[.890625,.109375,-.328125],[-.890625,.109375,-.328125],[.9375,.0625,-.335938],[-.9375,.0625,-.335938],[1,.125,-.367188],[-1,.125,-.367188],[.960938,.171875,-.351562],[-.960938,.171875,-.351562],[1.015625,.234375,-.375],[-1.015625,.234375,-.375],[1.054688,.1875,-.382812],[-1.054688,.1875,-.382812],[1.109375,.210938,-.390625],[-1.109375,.210938,-.390625],[1.085938,.273438,-.390625],[-1.085938,.273438,-.390625],[1.023438,.4375,-.484375],[-1.023438,.4375,-.484375],[1.25,.46875,-.546875],[-1.25,.46875,-.546875],[1.367188,.296875,-.5],[-1.367188,.296875,-.5],[1.3125,.054688,-.53125],[-1.3125,.054688,-.53125],[1.039062,-.085938,-.492188],[-1.039062,-.085938,-.492188],[.789062,-.125,-.328125],[-.789062,-.125,-.328125],[.859375,.382812,-.382812],[-.859375,.382812,-.382812]],Nt=si;var zt=class extends C{constructor(t){super({...t,vertices:Nt,faces:jt})}};var Mt=class extends C{width;height;length;constructor(t){super({...t,vertices:nt(t?.width??1,t?.height??1,t?.length??1),faces:Dt}),this.width=t?.width??1,this.height=t?.height??1,this.length=t?.length??1}computeVertices(){this.vertices=nt(this.width,this.height,this.length)}setWidth(t){this.width=t,this.computeVertices()}setHeight(t){this.height=t,this.computeVertices()}setLength(t){this.length=t,this.computeVertices()}};var ri={Engine:X,Sprite:b,TSCMath:o,Perlin1D:ct,Perlin2D:ht,Multiplayer:at,Rectangle:et,Square:lt,Oval:ut,Circle:pt,Arc:dt,RegularPolygon:mt,CustomPolygon:st,Pen:H,Text:rt,Button:bt,Watermark:gt,ImageSprite:ft,RigidRectangle:yt,Camera3D:xt,Renderer3D:$,WireframeRenderer3D:vt,SolidRenderer3D:St,Object3D:C,Tetrahedron:Ct,Cube:wt,Octahedron:Ot,Icosahedron:Vt,Icosphere:Pt,Monkey:zt,Cuboid:Mt,scale:tt,aspectRatio:ot,setScale:Bt,setAspectRatio:kt,canvas:h,ctx:u},ts=ri;export{dt as Arc,bt as Button,xt as Camera3D,pt as Circle,wt as Cube,Mt as Cuboid,st as CustomPolygon,X as Engine,Vt as Icosahedron,Pt as Icosphere,ft as ImageSprite,zt as Monkey,at as Multiplayer,C as Object3D,Ot as Octahedron,ut as Oval,H as Pen,ct as Perlin1D,ht as Perlin2D,et as Rectangle,mt as RegularPolygon,$ as Renderer3D,yt as RigidRectangle,St as SolidRenderer3D,b as Sprite,lt as Square,o as TSCMath,Ct as Tetrahedron,rt as Text,gt as Watermark,vt as WireframeRenderer3D,ot as aspectRatio,h as canvas,u as ctx,ts as default,tt as scale,kt as setAspectRatio,Bt as setScale};
1
+ var h=document.getElementById("game-window")||document.createElement("canvas"),p=h.getContext("2d"),nt=document.createElement("canvas"),b=nt.getContext("2d");nt.id="pen-canvas";var ot=16/9,Q;function It(){h.width=ot*Q,h.height=Q,nt.width=ot*Q,nt.height=Q}function kt(n){Q=n,It()}function Wt(n){ot=n,It()}h.parentElement?.insertBefore(nt,h);kt(500);var o=class n{constructor(){}static pickRandom(t,i){return t>i&&([t,i]=[i,t]),Math.floor(Math.random()*(i-t+1)+t)}static magnitude(t){return Math.hypot(...t)}static normalize(t){let i=Math.hypot(...t);return i===0?[...t]:t.map(e=>e/i)}static add(t,i){return t.map((e,s)=>e+i[s])}static subtract(t,i){return t.map((e,s)=>e-i[s])}static multiply(t,i){return t.map((e,s)=>e*i[s])}static dot(t,i){return t.reduce((e,s,r)=>e+s*i[r],0)}static cross(t,i){return[t[1]*i[2]-t[2]*i[1],t[2]*i[0]-t[0]*i[2],t[0]*i[1]-t[1]*i[0]]}static toRadians(t){return t*Math.PI/180}static toDegrees(t){return t*180/Math.PI}static sin(t){return Math.sin(n.toRadians(t))}static cos(t){return Math.cos(n.toRadians(t))}static tan(t){return Math.tan(n.toRadians(t))}static csc(t){return 1/Math.sin(n.toRadians(t))}static sec(t){return 1/Math.cos(n.toRadians(t))}static cot(t){return 1/Math.tan(n.toRadians(t))}static asin(t){return n.toDegrees(Math.asin(t))}static acos(t){return n.toDegrees(Math.acos(t))}static acsc(t){return n.toDegrees(Math.asin(1/t))}static asec(t){return n.toDegrees(Math.acos(1/t))}};var f=class n{x=0;y=0;dir=0;size=1;pivot=[0,0];scene="main";hidden=!1;layer=0;cachedPath=null;pathDirty=!0;static collisionCanvas=null;static collisionCtx=null;refresh(){B.init().refresh()}invalidatePath(){this.pathDirty=!0,this.cachedPath=null}getCachedPath(){return(this.pathDirty||!this.cachedPath)&&(this.cachedPath=this.getPath(),this.pathDirty=!1),this.cachedPath}constructor(t){Object.assign(this,t),B.init().addSprite(this)}getCreateOptions(){return{x:this.x,y:this.y,dir:this.dir,size:this.size,scene:this.scene,layer:this.layer,hidden:this.hidden}}clone(t){return this.create({...this.getCreateOptions(),...t})}touching(t){if(this.hidden||t.hidden||this.scene!=="*"&&t.scene!=="*"&&this.scene!==t.scene)return null;let i=this.getBoundingBox(),e=t.getBoundingBox();if(!(Math.abs(i.x-e.x)<(i.width+e.width)/2&&Math.abs(i.y-e.y)<(i.height+e.height)/2))return null;let r=i.x-i.width/2,c=i.y+i.height/2,a=i.x+i.width/2,l=i.y-i.height/2,d=e.x-e.width/2,g=e.y+e.height/2,y=e.x+e.width/2,u=e.y-e.height/2,x=Math.max(r,d),w=Math.min(l,u),P=Math.min(a,y),C=Math.max(c,g),v=P-x,O=C-w;if(v<1||O<1)return null;n.collisionCanvas||(n.collisionCanvas=new OffscreenCanvas(1,1),n.collisionCtx=n.collisionCanvas.getContext("2d",{willReadFrequently:!0}));let m=n.collisionCtx;n.collisionCanvas.width<v&&(n.collisionCanvas.width=v),n.collisionCanvas.height<O&&(n.collisionCanvas.height=O),m.clearRect(0,0,v,O);let J=(S,W)=>{m.save();let Y=S.x-x,N=C-S.y;m.translate(Y,N),m.rotate(S.toRadians(S.dir)),m.translate(-S.pivot[0]*S.size,S.pivot[1]*S.size),m.fillStyle=W,m.fill(S.getCachedPath()),m.restore()};J(this,"red");let k=m.getImageData(0,0,v,O).data;m.clearRect(0,0,v,O),J(t,"blue");let Z=m.getImageData(0,0,v,O).data,_=0,M=0,D=0,F=[];for(let S=3;S<k.length;S+=4)if(k[S]>0&&Z[S]>0){let W=S/4;F.push(W);let Y=W%v,N=Math.floor(W/v);_+=Y,M+=N,D++}if(D===0)return null;let U=_/D,K=M/D,L=[x+U,C-K],z=0,$=0;for(let S of F){let W=S%v,Y=Math.floor(S/v);z+=W-U,$+=Y-K}Math.abs(z)<.01&&Math.abs($)<.01&&(z=this.x-L[0],$=this.y-L[1]);let G=[z,-$],R=o.magnitude(G)>0?o.normalize(G):G,A=this.x-t.x,j=this.y-t.y;A*R[0]+j*R[1]<0&&(R[0]*=-1,R[1]*=-1);let I=-1/0;for(let S of F){let W=S%v,Y=Math.floor(S/v),N=x+W,Ht=C-Y,$t=(N-L[0])*R[0]+(Ht-L[1])*R[1];I=Math.max(I,$t)}return{contact:L,normal:R,displacement:I}}toRadians(t){return t*Math.PI/180}toDegrees(t){return t*180/Math.PI}distanceTo(t,i){return Math.hypot(t-this.x,i-this.y)}move(t){this.x+=t*Math.sin(this.toRadians(this.dir)),this.y+=t*Math.cos(this.toRadians(this.dir)),this.refresh()}turn(t){this.dir+=t,this.refresh()}point(t){this.dir=t,this.refresh()}pointTowards(t,i){this.dir=90-this.toDegrees(Math.atan2(i-this.y,t-this.x)),this.refresh()}setX(t){this.x=t,this.refresh()}setY(t){this.y=t,this.refresh()}goTo(t,i){this.x=t,this.y=i,this.refresh()}changeX(t){this.x+=t,this.refresh()}changeY(t){this.y+=t,this.refresh()}setPivot(t,i){this.pivot=[t,i],this.refresh()}show(){this.hidden=!1,this.refresh()}hide(){this.hidden=!0,this.refresh()}setSize(t){this.size=t>0?t:0,this.invalidatePath(),this.refresh()}changeSize(t){this.size=this.size+t>0?this.size+t:0,this.invalidatePath(),this.refresh()}goToLayer(t){this.layer=t,this.refresh()}changeLayer(t){this.layer+=t,this.refresh()}static getSpriteByTagName(t){let i=B.init();return i.sceneMap.get(i.currentScene).sprites.filter(e=>e.tags.has(t))}getDrawOffset(){let[t,i]=this.pivot,e=o.sin(this.dir),s=o.cos(this.dir),r=-t*s-i*e,c=-t*e+i*s;return[r*this.size,c*this.size]}};var B=class n{static instance;loopRunning=!1;gameLoop=null;maxFPS=30;deltaTime=1/this.maxFPS;lastFrame=performance.now();refreshScheduled=!1;animationFrameId=null;sounds=[];mouseX=0;mouseY=0;mouseDown=!1;mouseClicked=!1;keysPressed=new Set;currentScene="main";sceneMap=new Map;variableMap=new Map;static init(){return this.instance||(this.instance=new n),this.instance}constructor(){this.setMaxFPS(30),this.sceneMap.set("main",{loop:null,sprites:[]}),this.sceneMap.set("*",{loop:null,sprites:[]}),h.addEventListener("mousemove",t=>{this.mouseX=t.clientX-h.offsetLeft-h.width/2,this.mouseY=-(t.clientY-h.offsetTop-h.height/2)}),h.addEventListener("mousedown",()=>{this.mouseDown=!0}),h.addEventListener("mouseup",()=>{this.mouseDown=!1}),h.addEventListener("click",()=>{this.mouseClicked=!0,setTimeout(()=>this.mouseClicked=!1,0)}),addEventListener("keydown",t=>{t.repeat||this.keysPressed.add(t.key)}),addEventListener("keyup",t=>{this.keysPressed.delete(t.key)})}setScene(t){this.sceneMap.get(t)||this.sceneMap.set(t,{sprites:[],loop:null}),this.loopRunning=!1,this.currentScene=t,this.gameLoop=this.sceneMap.get(t).loop,this.setMaxFPS(this.maxFPS)}setLoop(t,i){if(!this.sceneMap.get(t)){this.sceneMap.set(t,{sprites:[],loop:i}),t===this.currentScene&&this.setScene(t);return}this.sceneMap.get(t).loop=i,t===this.currentScene&&this.setScene(t)}pauseLoop(){this.loopRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}resumeLoop(){this.loopRunning=!0,this.setMaxFPS(this.maxFPS)}addSprite(t){let{scene:i,layer:e}=t;if(!this.sceneMap.get(i)){this.sceneMap.set(i,{sprites:[t],loop:null});return}let s=this.sceneMap.get(i).sprites.findIndex(r=>r.layer>e);if(s===-1){this.sceneMap.get(i).sprites.push(t);return}this.sceneMap.get(i).sprites.splice(s,0,t),this.refresh()}removeSprite(t){let{scene:i}=t;this.sceneMap.get(i)&&(this.sceneMap.get(i).sprites=this.sceneMap.get(i).sprites.filter(e=>e!==t),this.refresh())}async setMaxFPS(t){this.maxFPS=t;let i=this.gameLoop;if(!i)return;this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.loopRunning=!0;let e=1e3/t,s=0,r=async c=>{if(!this.loopRunning)return;let a=c-this.lastFrame;this.lastFrame=c,s+=a,s>=e&&(this.deltaTime=s/1e3,s=s%e,i&&await i()),this.animationFrameId=requestAnimationFrame(r)};this.lastFrame=performance.now(),this.animationFrameId=requestAnimationFrame(r)}refresh(){this.refreshScheduled||(this.refreshScheduled=!0,requestAnimationFrame(()=>{this.refreshScheduled=!1,p.clearRect(0,0,h.width,h.height),[...this.sceneMap.get(this.currentScene).sprites,...this.sceneMap.get("*").sprites].forEach(i=>{i.hidden||i.draw()})}))}async wait(t){return new Promise(i=>setTimeout(i,t))}async waitUntil(t){return new Promise(i=>{let e=()=>{t()?i():setTimeout(e,1e3/this.maxFPS)};e()})}setVariable(t,i){this.variableMap.set(t,i)}getVariable(t){return this.variableMap.get(t)}hovering(t){let{mouseX:i,mouseY:e}=this,s=i+h.width/2,r=h.height/2-e,c=s-(t.x+h.width/2),a=r-(h.height/2-t.y),l=-o.toRadians(t.dir),d=c*Math.cos(l)-a*Math.sin(l),g=c*Math.sin(l)+a*Math.cos(l);return p.isPointInPath(t.getCachedPath(),d,g)}keyPressed(t){switch(t){case"any":return this.keysPressed.size>0;case"up":return this.keysPressed.has("ArrowUp");case"down":return this.keysPressed.has("ArrowDown");case"left":return this.keysPressed.has("ArrowLeft");case"right":return this.keysPressed.has("ArrowRight");case"space":return this.keysPressed.has(" ");default:return this.keysPressed.has(t)}}playSound(t){let i=new Audio(t);return this.sounds.push(i),i.play(),i}stopSound(t){t.pause(),t.currentTime=0,this.sounds=this.sounds.filter(i=>i!==t)}stopAllSounds(){this.sounds.forEach(t=>{t.pause(),t.currentTime=0}),this.sounds=[]}};function Rt(n,t){if(!n)throw new Error(t)}var tt=class{amplitude=1;gradientCount=100;fade(t){return 6*t**5-15*t**4+10*t**3}lerp(t,i,e){return t*(1-e)+i*e}mod(t,i){return Rt(i>0,"Modulus must be greater than 0"),(t%i+i)%i}};var ct=class extends tt{amplitude=1;gradientCount=100;gradients=[];constructor(){super(),this.regen()}regen(){this.gradients=[];for(let t=0;t<this.gradientCount;t++)this.gradients.push(Math.random()*2-1)}get(t){let i=Math.floor(t),e=i+1,s=this.gradients[this.mod(i,this.gradientCount)],r=this.gradients[this.mod(e,this.gradientCount)],c=t-i,a=t-e,l=s*c,d=r*a,g=this.fade(c);return this.lerp(l,d,g)*this.amplitude*2}};var ht=class extends tt{amplitude=1;gradientCount=100;gradients=[];constructor(){super(),this.regen()}regen(){this.gradients=[];for(let t=0;t<this.gradientCount;t++){let i=[];for(let e=0;e<this.gradientCount;e++){let s=Math.random()*2-1,r=Math.random()*2-1,c=(s*s+r*r)**.5;c!==0?i.push([s/c,r/c]):i.push([1,0])}this.gradients.push(i)}}get(t,i){let e=Math.floor(t),s=Math.floor(i),r=e+1,c=s+1,a=this.gradients[this.mod(s,this.gradientCount)][this.mod(e,this.gradientCount)],l=this.gradients[this.mod(s,this.gradientCount)][this.mod(r,this.gradientCount)],d=this.gradients[this.mod(c,this.gradientCount)][this.mod(e,this.gradientCount)],g=this.gradients[this.mod(c,this.gradientCount)][this.mod(r,this.gradientCount)],y=t-e,u=i-s,x=t-r,w=i-c,P=a[0]*y+a[1]*u,C=l[0]*x+l[1]*u,v=d[0]*y+d[1]*w,O=g[0]*x+g[1]*w,m=this.fade(y),J=this.fade(u),k=this.lerp(P,C,m),Z=this.lerp(v,O,m);return this.lerp(k,Z,J)*this.amplitude*2}};var at=class n{links;angles;target;constructor(t,i){this.links=t,this.target=i,this.angles=t.map(()=>0)}getAngles(){let t=0;return this.angles.map(i=>(t+=i,90-o.toDegrees(t)))}getPoints(){let t=0,i=0,e=[];for(let s=0;s<this.links.length;s++){let r=0;for(let c=0;c<=s;c++)r+=this.angles[c];t+=this.links[s]*Math.cos(r),i+=this.links[s]*Math.sin(r),e.push([t,i])}return e}static dot(t,i){let e=0;for(let s=0;s<t.length;s++)e+=t[s]*i[s];return e}computeApproximateAngles(t,i,e=.25){if(o.magnitude(this.target)>=this.links.reduce((s,r)=>s+r,0)){let s=Math.atan2(this.target[1],this.target[0]);this.angles[0]=s;for(let r=1;r<this.angles.length;r++)this.angles[r]=0;return}this.angles=Array(this.links.length).fill(0);for(let s=0;s<t;s++)if(this.updateAngles(e),o.magnitude(this.computeError())<i)return}forwardKinematicsPass(){let t=this.getPoints();return t[t.length-1]}computeError(){let[t,i]=this.forwardKinematicsPass();return[this.target[0]-t,this.target[1]-i]}computeJacobian(){let t=[[],[]];for(let i=0;i<this.angles.length;i++){let e=0,s=0;for(let r=i;r<this.links.length;r++){let c=0;for(let a=0;a<=r;a++)c+=this.angles[a];e+=-this.links[r]*Math.sin(c),s+=this.links[r]*Math.cos(c)}t[0].push(e),t[1].push(s)}return t}computePseudoinverse(){let t=this.computeJacobian(),i=[];for(let m=0;m<t[0].length;m++)i.push([t[0][m],t[1][m]]);let e=t[0],s=t[1],r=[],c=[];for(let m=0;m<i.length;m++)r.push(i[m][0]),c.push(i[m][1]);let a=[[n.dot(e,r),n.dot(e,c)],[n.dot(s,r),n.dot(s,c)]],l=.01,d=a[0][0]+l,g=a[0][1],y=a[1][0],u=a[1][1]+l,w=1/(d*u-g*y),P=[[u*w,-g*w],[-y*w,d*w]],C=P[0],v=P[1],O=[];for(let m of i)O.push([n.dot(m,C),n.dot(m,v)]);return O}computeJointUpdate(){let t=this.computeError(),i=[];for(let e of this.computePseudoinverse())i.push(n.dot(t,e));return i}updateAngles(t){let i=this.computeJointUpdate();for(let e=0;e<this.angles.length;e++)this.angles[e]+=i[e]*t}};import{io as Gt}from"socket.io-client";var lt=class n{static instance;socket;static connect(t="http://localhost:3000"){return this.instance||(this.instance=new n(t)),this.instance}disconnect(){this.socket.disconnect()}constructor(t){this.socket=Gt(t)}broadcast(t,i){this.socket.emit(t,i)}on(t,i){this.socket.on(t,i)}};var ut=class n extends f{discriminant="line";tags=new Set(["line"]);color;length;width;getBoundingBox(){return{x:this.x,y:this.y,width:this.length*Math.abs(o.sin(this.dir)),height:this.length*Math.abs(o.cos(this.dir))}}getPath(){let t=new Path2D;return t.rect(-this.width,-this.length/2,this.width*2,this.length),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.fill(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),color:this.color,length:this.length,width:this.width}}setColor(t){this.color=t,this.refresh()}setLength(t){this.length=t,this.invalidatePath(),this.refresh()}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.color=t?.color??"black",this.length=t?.length??50,this.width=t?.width??4,this.draw()}};var it=class n extends f{discriminant="rectangle";tags=new Set(["rectangle"]);width;height;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.width/2,i=this.height/2,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),width:this.width,height:this.height,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.width=t?.width??50,this.height=t?.height??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var pt=class n extends f{discriminant="square";tags=new Set(["square"]);sideLength;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.sideLength/2,i=o.cos(this.dir),e=o.sin(this.dir),s=2*(Math.abs(t*i)+Math.abs(t*e))*this.size,r=this.getDrawOffset();return{x:this.x+r[0],y:this.y+r[1],width:s,height:s}}getPath(){let t=new Path2D;return t.rect(-this.sideLength/2*this.size,-this.sideLength/2*this.size,this.sideLength*this.size,this.sideLength*this.size),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),sideLength:this.sideLength,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSideLength(t){this.sideLength=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sideLength=t?.sideLength??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var dt=class n extends f{discriminant="oval";tags=new Set(["oval"]);radX;radY;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.radX,i=this.radY,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radX*this.size,this.radY*this.size,0,0,Math.PI*2),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radX:this.radX,radY:this.radY,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadX(t){this.radX=t,this.invalidatePath(),this.refresh()}setRadY(t){this.radY=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radX=t?.radX??25,this.radY=t?.radY??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var mt=class n extends f{discriminant="circle";tags=new Set(["circle"]);radius;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.ellipse(0,0,this.radius*this.size,this.radius*this.size,0,0,Math.PI*2),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var bt=class n extends f{discriminant="arc";tags=new Set(["arc"]);radius;angle;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D;return t.arc(0,0,this.radius*this.size,this.toRadians(this.angle/2-90),this.toRadians(-this.angle/2-90)),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),radius:this.radius,angle:this.angle,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setAngle(t){this.angle=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.radius=t?.radius??25,this.angle=t?.angle??270,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var gt=class n extends f{discriminant="regularpolygon";tags=new Set(["regularpolygon"]);sides;radius;color;outlineColor;outlineWidth;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.radius*2*this.size,height:this.radius*2*this.size}}getPath(){let t=new Path2D,i=2*Math.PI/this.sides;t.moveTo(this.radius*this.size,0);for(let e=1;e<this.sides;e++)t.lineTo(this.radius*Math.cos(i*e)*this.size,this.radius*Math.sin(i*e)*this.size);return t.closePath(),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(o.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),sides:this.sides,radius:this.radius,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setSides(t){this.sides=t,this.invalidatePath(),this.refresh()}setRadius(t){this.radius=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.sides=t?.sides??5,this.radius=t?.radius??50,this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var et=class n extends f{discriminant="custompolygon";tags=new Set(["custompolygon"]);vertices;color;outlineColor;outlineWidth;getBoundingBox(){let t=o.cos(this.dir),i=o.sin(this.dir),e=1/0,s=-1/0,r=1/0,c=-1/0;if(this.vertices.length===0)return{x:this.x,y:this.y,width:0,height:0};for(let u of this.vertices){let x=u[0]*t-u[1]*i,w=u[0]*i+u[1]*t,P=this.x+x,C=this.y+w;P<e&&(e=P),P>s&&(s=P),C<r&&(r=C),C>c&&(c=C)}let a=s-e,l=c-r,d=e+a/2,g=r+l/2,y=this.getDrawOffset();return{x:d*this.size+y[0],y:g*this.size+y[1],width:a*this.size,height:l*this.size}}getPath(){let t=new Path2D;if(this.vertices.length<2)return t;let i=this.vertices,[e,...s]=i;t.moveTo(e[0]*this.size,-e[1]*this.size);for(let r of s)t.lineTo(r[0]*this.size,-r[1]*this.size);return t.closePath(),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size);let r=this.getCachedPath();i.fillStyle=this.color,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.fill(r),this.outlineWidth&&i.stroke(r),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),vertices:this.vertices,color:this.color,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setVertices(t){this.vertices=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}constructor(t){super(t),this.vertices=t?.vertices??[],this.color=t?.color??"black",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var q=class n extends f{discriminant="pen";tags=new Set(["pen"]);drawing;penSize;color;getBoundingBox(){let t=this.getDrawOffset();return{x:this.x+t[0],y:this.y+t[1],width:this.penSize*this.size*2,height:this.penSize*this.size*2}}getPath(){return new Path2D}draw(){}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),drawing:this.drawing,penSize:this.penSize,color:this.color}}up(){this.drawing=!1}down(){this.drawing=!0}stamp(t){t.draw(!0)}eraseAll(){b.clearRect(0,0,h.width,h.height)}dot(){b.fillStyle=this.color,b.fillRect(this.x-this.penSize/2+h.width/2,-this.y-this.penSize/2+h.height/2,this.penSize,this.penSize)}static drawSprite(t,i){let e=new t(i??{});e.draw(!0),B.init().removeSprite(e)}drawLine(t,i){b.beginPath(),b.moveTo(t+h.width/2,-i+h.height/2),b.lineTo(this.x+h.width/2,-this.y+h.height/2),b.lineWidth=this.penSize,b.strokeStyle=this.color,b.stroke()}move(t){let i=this.x,e=this.y;this.x+=t*Math.sin(o.toRadians(this.dir)),this.y+=t*Math.cos(o.toRadians(this.dir)),this.drawing&&this.drawLine(i,e),this.refresh()}setX(t){let i=this.x,e=this.y;this.x=t,this.drawing&&this.drawLine(i,e),this.refresh()}setY(t){let i=this.x,e=this.y;this.y=t,this.drawing&&this.drawLine(i,e),this.refresh()}goTo(t,i){let e=this.x,s=this.y;this.x=t,this.y=i,this.drawing&&this.drawLine(e,s),this.refresh()}changeX(t){let i=this.x,e=this.y;this.x+=t,this.drawing&&this.drawLine(i,e),this.refresh()}changeY(t){let i=this.x,e=this.y;this.y+=t,this.drawing&&this.drawLine(i,e),this.refresh()}constructor(t){super(t),this.drawing=t?.drawing??!1,this.penSize=t?.penSize??5,this.color=t?.color??"black"}};var st=class n extends f{discriminant="text";tags=new Set(["text"]);content;color;fontFamily;fontSize;align;baseline;font;getBoundingBox(){let t=p.measureText(String(this.content)),i=t.width/2,e=t.actualBoundingBoxAscent+t.actualBoundingBoxDescent/2,s=o.cos(this.dir),r=o.sin(this.dir),c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size,a=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,l=this.getDrawOffset();return{x:this.x+l[0],y:this.y+l[1],width:c,height:a}}getPath(){let t=new Path2D;p.save(),p.font=this.font;let i=p.measureText(String(this.content)),e=i.width*this.size,s=(i.actualBoundingBoxAscent+i.actualBoundingBoxDescent)*this.size;return p.restore(),t.rect(-e/2,-s/2,e,s),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.font=this.font,i.fillStyle=this.color,i.textAlign=this.align,i.textBaseline=this.baseline,i.fillText(String(this.content),0,0),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions,content:this.content,color:this.color,fontFamily:this.fontFamily,fontSize:this.fontSize,align:this.align,baseline:this.baseline}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setColor(t){this.color=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setAlign(t){this.align=t,this.refresh()}setBaseline(t){this.baseline=t,this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.color=t?.color??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.align=t?.align??"center",this.baseline=t?.baseline??"middle",this.font=`${this.fontSize}px ${this.fontFamily}`,this.draw()}};var ft=class n extends f{discriminant="button";tags=new Set(["button"]);content;fontColor;fontFamily;fontSize;font;width;height;backgroundColor;outlineColor;outlineWidth;getBoundingBox(){p.save(),p.font=this.font;let t=p.measureText(String(this.content)),i=Math.max(t.width,this.width)/2,e=Math.max(t.actualBoundingBoxAscent+t.actualBoundingBoxDescent,this.height)/2;p.restore();let s=o.cos(this.dir),r=o.sin(this.dir),c=2*(Math.abs(i*s)+Math.abs(e*r))*this.size,a=2*(Math.abs(i*r)+Math.abs(e*s))*this.size,l=this.getDrawOffset();return{x:this.x+l[0],y:this.y+l[1],width:c,height:a}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.fillStyle=this.backgroundColor,i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth;let r=this.getCachedPath();i.fill(r),this.outlineWidth&&i.stroke(r),i.font=this.font,i.fillStyle=this.fontColor,i.textAlign="center",i.textBaseline="middle",i.fillText(String(this.content),0,0),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),content:this.content,fontColor:this.fontColor,fontFamily:this.fontFamily,fontSize:this.fontSize,width:this.width,height:this.height,backgroundColor:this.backgroundColor,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setContent(t){this.content=t,this.invalidatePath(),this.refresh()}setBackgroundColor(t){this.backgroundColor=t,this.refresh()}setFontColor(t){this.fontColor=t,this.refresh()}setFontSize(t){this.fontSize=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}setFontFamily(t){this.fontFamily=t,this.font=`${this.fontSize}px ${this.fontFamily}`,this.invalidatePath(),this.refresh()}constructor(t){super(t),this.content=t?.content??"",this.fontColor=t?.fontColor??"black",this.fontFamily=t?.fontFamily??"Arial",this.fontSize=t?.fontSize??16,this.font=`${this.fontSize}px ${this.fontFamily}`,this.width=t?.width??String(this.content).length*this.fontSize+10,this.height=t?.height??this.fontSize+10,this.backgroundColor=t?.backgroundColor??"rgb(204, 204, 204)",this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.draw()}};var yt=class n extends st{tags=new Set(["text","watermark"]);create(t){return new n(t)}constructor(t){super(t),this.content=t?.content??"Made with TScratch",this.x=t?.x??-h.width/2+5,this.y=t?.y??h.height/2-5,this.align=t?.align??"left",this.baseline=t?.baseline??"top",this.invalidatePath()}};var xt=class n extends f{discriminant="imagesprite";tags=new Set(["imagesprite"]);costumes;costumeNumber;width;height;outlineColor;outlineWidth;imgBitmap=null;img;getBoundingBox(){let t=this.width/2,i=this.height/2,e=o.cos(this.dir),s=o.sin(this.dir),r=2*(Math.abs(t*e)+Math.abs(i*s))*this.size,c=2*(Math.abs(t*s)+Math.abs(i*e))*this.size,a=this.getDrawOffset();return{x:this.x+a[0],y:this.y+a[1],width:r,height:c}}getPath(){let t=new Path2D;return t.rect(-this.width/2*this.size,-this.height/2*this.size,this.width*this.size,this.height*this.size),t}draw(t){let i=t?b:p;i.save();let e=this.x+h.width/2,s=-this.y+h.height/2;i.translate(e,s),i.rotate(this.toRadians(this.dir)),i.translate(-this.pivot[0]*this.size,this.pivot[1]*this.size),i.strokeStyle=this.outlineColor,i.lineWidth=this.outlineWidth,i.drawImage(this.imgBitmap??this.img,0,0,this.img.width,this.img.height,-this.width/2,-this.height/2,this.width,this.height),this.outlineWidth&&i.stroke(this.getCachedPath()),i.restore()}create(t){return new n(t)}getCreateOptions(){return{...super.getCreateOptions(),costumes:this.costumes,costumeNumber:this.costumeNumber,width:this.width,height:this.height,outlineColor:this.outlineColor,outlineWidth:this.outlineWidth}}setCostume(t){this.costumeNumber=t<this.costumes.length&&t>=0?t:0,this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}nextCostume(){this.costumeNumber=(this.costumeNumber+1)%this.costumes.length,this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}previousCostume(){this.costumeNumber--,this.costumeNumber<0&&(this.costumeNumber=this.costumes.length-1),this.img.src=this.costumes[this.costumeNumber],this.loadImageBitmap()}setWidth(t){this.width=t,this.invalidatePath(),this.refresh()}setHeight(t){this.height=t,this.invalidatePath(),this.refresh()}loadImageBitmap(){this.img.onload=()=>{this.imgBitmap=null,createImageBitmap(this.img).then(t=>{this.imgBitmap=t}),this.refresh()}}constructor(t){super(t),this.costumes=t?.costumes??[],this.costumeNumber=t?.costumeNumber&&t.costumeNumber<this.costumes.length&&t.costumeNumber>=0?t.costumeNumber:0,this.img=new Image,this.img.src=this.costumes[this.costumeNumber]??"",this.width=t?.width??0,this.height=t?.height??0,this.outlineColor=t?.outlineColor??"black",this.outlineWidth=t?.outlineWidth??0,this.img.onload=()=>{t?.width||(this.width=this.img.width),t?.height||(this.height=this.img.height),createImageBitmap(this.img).then(i=>{this.imgBitmap=i}),this.draw()}}};var vt=class extends it{tags=new Set(["rectangle","rigidbody"]);obstacles;isStatic;gravity;drag;bounceLoss;velocity;angularVelocity;inertia;addObstacles(...t){this.obstacles.push(...t)}update(t=1){if(!this.isStatic){this.velocity[1]+=this.gravity*t,this.velocity[0]*=this.drag,this.velocity[1]*=this.drag,this.changeX(this.velocity[0]*t),this.changeY(this.velocity[1]*t),this.turn(-o.toDegrees(this.angularVelocity)*t);for(let i of this.obstacles){let e=this.touching(i);if(e){let{contact:s,normal:r,displacement:c}=e,l=Math.max(c-.05,0),d=i.isStatic?1:.5,g=r[0]*l*d,y=r[1]*l*d;this.changeX(g),this.changeY(y),i.isStatic||(i.changeX(-g),i.changeY(-y));let u=[s[0]-this.x,s[1]-this.y],x=[s[0]-i.x,s[1]-i.y],w=[this.velocity[0]-this.angularVelocity*u[1],this.velocity[1]+this.angularVelocity*u[0]],P=i.velocity,C=i.angularVelocity,v=[P[0]-C*x[1],P[1]+C*x[0]],O=[w[0]-v[0],w[1]-v[1]],m=O[0]*r[0]+O[1]*r[1];if(m<0){let k=u[0]*r[1]-u[1]*r[0],Z=x[0]*r[1]-x[1]*r[0],_=1,M=i.isStatic?0:1,D=k*k,F=Z*Z,U=_+M+D/this.inertia+(i.isStatic?0:F/i.inertia),K=-(1+this.bounceLoss)*m/U,L=[r[0]*K,r[1]*K],z=[-r[1],r[0]],$=O[0]*z[0]+O[1]*z[1],G=u[0]*z[1]-u[1]*z[0],R=x[0]*z[1]-x[1]*z[0],A=G*G,j=R*R,I=_+M+A/this.inertia+(i.isStatic?0:j/i.inertia),S=-$*.3/I,W=[z[0]*S,z[1]*S],Y=L[0]+W[0],N=L[1]+W[1];this.velocity[0]+=Y,this.velocity[1]+=N,this.angularVelocity+=(u[0]*N-u[1]*Y)/this.inertia,i.isStatic||(i.velocity[0]-=Y,i.velocity[1]-=N,i.angularVelocity-=(x[0]*N-x[1]*Y)/i.inertia)}}}this.velocity[0]*=this.drag,this.velocity[1]*=this.drag,this.angularVelocity*=this.drag}}constructor(t){super(t),this.obstacles=t?.obstacles??[],this.isStatic=t?.isStatic??!1,this.gravity=t?.gravity??-1.8,this.drag=t?.drag??.96,this.bounceLoss=t?.bounceLoss??.92,this.velocity=t?.velocity??[0,0],this.angularVelocity=t?.angularVelocity??0,this.inertia=t?.inertia??700,this.invalidatePath()}};var St=class{x=0;y=0;z=0;dirX=0;dirY=0;dirZ=0;constructor(t){this.x=t?.x??0,this.y=t?.y??0,this.z=t?.z??0,this.dirX=t?.dirX??0,this.dirY=t?.dirY??0,this.dirZ=t?.dirZ??0}};var H=class extends q{FOV=60;ASPECT=h.width/h.height;Z_NEAR=.01;SPEED=2;SENSITIVITY=225;camera;objects;constructor(t){super(t),this.objects=t.objects,this.camera=t.camera}registerControls(){let t=B.init(),i=t.deltaTime,e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY);t.keyPressed("w")&&(this.camera.x+=this.SPEED*e*i,this.camera.z+=this.SPEED*s*i),t.keyPressed("a")&&(this.camera.x-=this.SPEED*s*i,this.camera.z+=this.SPEED*e*i),t.keyPressed("s")&&(this.camera.x-=this.SPEED*e*i,this.camera.z-=this.SPEED*s*i),t.keyPressed("d")&&(this.camera.x+=this.SPEED*s*i,this.camera.z-=this.SPEED*e*i),t.keyPressed("e")&&(this.camera.y+=this.SPEED*i),t.keyPressed("q")&&(this.camera.y-=this.SPEED*i),t.keyPressed("up")&&(this.camera.dirX+=this.SENSITIVITY*i),t.keyPressed("down")&&(this.camera.dirX-=this.SENSITIVITY*i),t.keyPressed("left")&&(this.camera.dirY-=this.SENSITIVITY*i),t.keyPressed("right")&&(this.camera.dirY+=this.SENSITIVITY*i);let r=89;this.camera.dirX=Math.max(-r,Math.min(r,this.camera.dirX))}project(t){let i=1/o.tan(this.FOV/2);return t.map(e=>{let s=e[0],r=e[1],c=e[2]<this.Z_NEAR?this.Z_NEAR:e[2],a=h.width/2*(s*i)/(c*this.ASPECT),l=h.height/2*(r*i)/c;return[a,l]})}getRelativeVertices(t){let i=o.sin(this.camera.dirX),e=o.cos(this.camera.dirX),s=o.sin(this.camera.dirY),r=o.cos(this.camera.dirY),c=o.sin(this.camera.dirZ),a=o.cos(this.camera.dirZ);return t.vertices.map(l=>{let d=l[0]*t.size+t.x-this.camera.x,g=l[1]*t.size+t.y-this.camera.y,y=l[2]*t.size+t.z-this.camera.z,u=d*r-y*s,x=d*s+y*r,w=g*e-x*i,P=g*i+x*e,C=u*a-w*c,v=u*c+w*a;return[C,v,P]})}};var wt=class extends H{render(){let t=o.sin(this.camera.dirX),i=o.cos(this.camera.dirX),e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY),r=o.sin(this.camera.dirZ),c=o.cos(this.camera.dirZ);for(let a of this.objects){let l=this.project(this.getRelativeVertices(a));this.color=a.color||"black";for(let d of a.faces){let[g,y]=l[d[0]];this.goTo(g,y),this.down();for(let u of d){let[x,w]=l[u];this.goTo(x,w)}this.goTo(g,y),this.up()}}}};var Ct=class n extends H{AMBIENT_LIGHT_INTENSITY=.25;DIRECTED_LIGHT_INTENSITY=.75;DIRECTED_LIGHT_DIR=[0,1,0];render(){let t=o.sin(this.camera.dirX),i=o.cos(this.camera.dirX),e=o.sin(this.camera.dirY),s=o.cos(this.camera.dirY),r=o.sin(this.camera.dirZ),c=o.cos(this.camera.dirZ),a=this.DIRECTED_LIGHT_DIR[0],l=this.DIRECTED_LIGHT_DIR[1],d=this.DIRECTED_LIGHT_DIR[2],g=a*s-d*e,y=a*e+d*s,u=l*i-y*t,x=l*t+y*i,w=g*c-u*r,P=g*r+u*c,C=o.normalize([w,P,x]);for(let v of this.objects){let{h:O,s:m,l:J}=n.stringToHSL(v.color||"black"),k=this.getRelativeVertices(v),Z=v.faces.map(M=>{let D=0;for(let F of M)D+=k[F][2];return{face:M,depth:D/M.length}});Z.sort((M,D)=>D.depth-M.depth);let _=this.project(k);for(let{face:M}of Z){let D=0,F=0,U=0;for(let A=0;A<M.length;A++){let j=k[M[A]],I=k[M[(A+1)%M.length]];D+=(j[1]-I[1])*(j[2]+I[2]),F+=(j[2]-I[2])*(j[0]+I[0]),U+=(j[0]-I[0])*(j[1]+I[1])}let K=o.normalize([D,F,U]),L=Math.max(0,o.dot(K,C)),z=this.AMBIENT_LIGHT_INTENSITY+L*this.DIRECTED_LIGHT_INTENSITY,$=Math.min(100,Math.max(5,J+z*50)),G=`hsl(${O}, ${m}%, ${$}%)`,R=M.map(A=>_[A]);q.drawSprite(et,{vertices:R,color:G})}}}static stringToHSL(t){let i=document.createElement("div");i.style.color=t,document.body.appendChild(i);let e=getComputedStyle(i).color;document.body.removeChild(i);let[s,r,c]=e.match(/\d+/g).map(Number);s/=255,r/=255,c/=255;let a=Math.max(s,r,c),l=Math.min(s,r,c),d=0,g=0,y=(a+l)/2;if(a===l)d=g=0;else{let u=a-l;switch(g=y>.5?u/(2-a-l):u/(a+l),a){case s:d=(r-c)/u+(r<c?6:0);break;case r:d=(c-s)/u+2;break;case c:d=(s-r)/u+4;break}d*=60}return{h:d,s:g*100,l:y*100}}};var V=class{x;y;z;dirX;dirY;dirZ;color;size;vertices;faces;constructor(t){this.vertices=t.vertices,this.faces=t.faces,this.x=t.x??0,this.y=t.y??0,this.z=t.z??2,this.dirX=t.dirX??0,this.dirY=t.dirY??0,this.dirZ=t.dirZ??0,this.color=t.color??"black",this.size=t.size??1}rotateX(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][1]=c*i-a*e,this.vertices[s][2]=c*e+a*i}}rotateY(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][0]=r*i+a*e,this.vertices[s][2]=-r*e+a*i}}rotateZ(t){let i=o.cos(t),e=o.sin(t);for(let s=0;s<this.vertices.length;s++){let[r,c,a]=this.vertices[s];this.vertices[s][0]=r*i-c*e,this.vertices[s][1]=r*e+c*i}}pointX(t){let i=t-this.dirX;this.dirX=t,this.rotateX(i)}pointY(t){let i=t-this.dirY;this.dirY=t,this.rotateY(i)}pointZ(t){let i=t-this.dirZ;this.dirZ=t,this.rotateZ(i)}static loadObj(t){let i=t.split(`
2
+ `),e=i.filter(r=>r.startsWith("v ")).map(r=>r.split(" ").slice(1).map(parseFloat)),s=i.filter(r=>r.startsWith("f ")).map(r=>r.split(" ").slice(1).map(c=>parseInt(c.split("/")[0])-1));return{vertices:e,faces:s}}};var Jt=[[0,1,2],[0,3,1],[0,2,3],[1,3,2]],Yt=Jt;var _t=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]],Xt=_t;var Ot=class extends V{constructor(t){super({...t,vertices:Xt,faces:Yt})}};var Ut=[[0,1,2,3],[4,5,6,7],[3,2,6,7],[0,1,5,4],[0,3,7,4],[1,2,6,5]],Tt=Ut;function rt(n,t,i){return[[-.5*n,-.5*t,-.5*i],[.5*n,-.5*t,-.5*i],[.5*n,-.5*t,.5*i],[-.5*n,-.5*t,.5*i],[-.5*n,.5*t,-.5*i],[.5*n,.5*t,-.5*i],[.5*n,.5*t,.5*i],[-.5*n,.5*t,.5*i]]}var Vt=class extends V{constructor(t){super({...t,vertices:rt(1,1,1),faces:Tt})}};var Kt=[[0,2,4],[2,1,4],[1,3,4],[3,0,4],[2,0,5],[1,2,5],[3,1,5],[0,3,5]],Et=Kt;var Qt=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]],Ft=Qt;var Pt=class extends V{constructor(t){super({...t,vertices:Ft,faces:Et})}};var ti=[[0,4,8],[0,8,9],[0,9,6],[0,6,1],[0,1,4],[3,10,5],[3,5,2],[3,2,7],[3,7,11],[3,11,10],[4,1,6],[4,6,9],[8,4,10],[8,10,5],[9,8,2],[9,2,7],[6,9,7],[6,7,11],[1,6,11],[1,11,10]],Lt=ti;var T=(1+Math.sqrt(5))/2,X=.5/T,E=.5,ii=[[0,-E,-X*T],[0,-E,X*T],[0,E,-X*T],[0,E,X*T],[-E,-X*T,0],[-E,X*T,0],[E,-X*T,0],[E,X*T,0],[-X*T,0,-E],[X*T,0,-E],[-X*T,0,E],[X*T,0,E]],At=ii;var Mt=class extends V{constructor(t){super({...t,vertices:At,faces:Lt})}};var ei=[[0,13,12],[1,13,15],[0,12,17],[0,17,19],[0,19,16],[1,15,22],[2,14,24],[3,18,26],[4,20,28],[5,21,30],[1,22,25],[2,24,27],[3,26,29],[4,28,31],[5,30,23],[6,32,37],[7,33,39],[8,34,40],[9,35,41],[10,36,38],[38,41,11],[38,36,41],[36,9,41],[41,40,11],[41,35,40],[35,8,40],[40,39,11],[40,34,39],[34,7,39],[39,37,11],[39,33,37],[33,6,37],[37,38,11],[37,32,38],[32,10,38],[23,36,10],[23,30,36],[30,9,36],[31,35,9],[31,28,35],[28,8,35],[29,34,8],[29,26,34],[26,7,34],[27,33,7],[27,24,33],[24,6,33],[25,32,6],[25,22,32],[22,10,32],[30,31,9],[30,21,31],[21,4,31],[28,29,8],[28,20,29],[20,3,29],[26,27,7],[26,18,27],[18,2,27],[24,25,6],[24,14,25],[14,1,25],[22,23,10],[22,15,23],[15,5,23],[16,21,5],[16,19,21],[19,4,21],[19,20,4],[19,17,20],[17,3,20],[17,18,3],[17,12,18],[12,2,18],[15,16,5],[15,13,16],[13,0,16],[12,14,2],[12,13,14],[13,1,14]],jt=ei;var si=[[0,-1,0],[.723607,-.44722,.525725],[-.276388,-.44722,.850649],[-.894426,-.447216,0],[-.276388,-.44722,-.850649],[.723607,-.44722,-.525725],[.276388,.44722,.850649],[-.723607,.44722,.525725],[-.723607,.44722,-.525725],[.276388,.44722,-.850649],[.894426,.447216,0],[0,1,0],[-.162456,-.850654,.499995],[.425323,-.850654,.309011],[.262869,-.525738,.809012],[.850648,-.525736,0],[.425323,-.850654,-.309011],[-.52573,-.850652,0],[-.688189,-.525736,.499997],[-.162456,-.850654,-.499995],[-.688189,-.525736,-.499997],[.262869,-.525738,-.809012],[.951058,0,.309013],[.951058,0,-.309013],[0,0,1],[.587786,0,.809017],[-.951058,0,.309013],[-.587786,0,.809017],[-.587786,0,-.809017],[-.951058,0,-.309013],[.587786,0,-.809017],[0,0,-1],[.688189,.525736,.499997],[-.262869,.525738,.809012],[-.850648,.525736,0],[-.262869,.525738,-.809012],[.688189,.525736,-.499997],[.162456,.850654,.499995],[.52573,.850652,0],[-.425323,.850654,.309011],[-.425323,.850654,-.309011],[.162456,.850654,-.499995]],Nt=si;var zt=class extends V{constructor(t){super({...t,vertices:Nt,faces:jt})}};var ri=[[46,0,2,44],[3,1,47,45],[44,2,4,42],[5,3,45,43],[2,8,6,4],[7,9,3,5],[0,10,8,2],[9,11,1,3],[10,12,14,8],[15,13,11,9],[8,14,16,6],[17,15,9,7],[14,20,18,16],[19,21,15,17],[12,22,20,14],[21,23,13,15],[22,24,26,20],[27,25,23,21],[20,26,28,18],[29,27,21,19],[26,32,30,28],[31,33,27,29],[24,34,32,26],[33,35,25,27],[34,36,38,32],[39,37,35,33],[32,38,40,30],[41,39,33,31],[38,44,42,40],[43,45,39,41],[36,46,44,38],[45,47,37,39],[46,36,50,48],[51,37,47,49],[36,34,52,50],[53,35,37,51],[34,24,54,52],[55,25,35,53],[24,22,56,54],[57,23,25,55],[22,12,58,56],[59,13,23,57],[12,10,62,58],[63,11,13,59],[10,0,64,62],[65,1,11,63],[0,46,48,64],[49,47,1,65],[60,64,48],[49,65,61],[62,64,60],[61,65,63],[60,58,62],[63,59,61],[60,56,58],[59,57,61],[60,54,56],[57,55,61],[60,52,54],[55,53,61],[60,50,52],[53,51,61],[60,48,50],[51,49,61],[88,173,175,90],[175,174,89,90],[86,171,173,88],[174,172,87,89],[84,169,171,86],[172,170,85,87],[82,167,169,84],[170,168,83,85],[80,165,167,82],[168,166,81,83],[78,91,145,163],[146,92,79,164],[91,93,147,145],[148,94,92,146],[93,95,149,147],[150,96,94,148],[95,97,151,149],[152,98,96,150],[97,99,153,151],[154,100,98,152],[99,101,155,153],[156,102,100,154],[101,103,157,155],[158,104,102,156],[103,105,159,157],[160,106,104,158],[105,107,161,159],[162,108,106,160],[107,66,67,161],[67,66,108,162],[109,127,159,161],[160,128,110,162],[127,178,157,159],[158,179,128,160],[125,155,157,178],[158,156,126,179],[123,153,155,125],[156,154,124,126],[121,151,153,123],[154,152,122,124],[119,149,151,121],[152,150,120,122],[117,147,149,119],[150,148,118,120],[115,145,147,117],[148,146,116,118],[113,163,145,115],[146,164,114,116],[113,180,176,163],[176,181,114,164],[109,161,67,111],[67,162,110,112],[111,67,177,182],[177,67,112,183],[176,180,182,177],[183,181,176,177],[134,136,175,173],[175,136,135,174],[132,134,173,171],[174,135,133,172],[130,132,171,169],[172,133,131,170],[165,186,184,167],[185,187,166,168],[130,169,167,184],[168,170,131,185],[143,189,188,186],[188,189,144,187],[184,186,188,68],[188,187,185,68],[129,130,184,68],[185,131,129,68],[141,192,190,143],[191,193,142,144],[139,194,192,141],[193,195,140,142],[138,196,194,139],[195,197,138,140],[137,70,196,138],[197,70,137,138],[189,143,190,69],[191,144,189,69],[69,190,205,207],[206,191,69,207],[70,198,199,196],[200,198,70,197],[196,199,201,194],[202,200,197,195],[194,201,203,192],[204,202,195,193],[192,203,205,190],[206,204,193,191],[198,203,201,199],[202,204,198,200],[198,207,205,203],[206,207,198,204],[138,139,163,176],[164,140,138,176],[139,141,210,163],[211,142,140,164],[141,143,212,210],[213,144,142,211],[143,186,165,212],[166,187,144,213],[80,208,212,165],[213,209,81,166],[208,214,210,212],[211,215,209,213],[78,163,210,214],[211,164,79,215],[130,129,71,221],[71,129,131,222],[132,130,221,219],[222,131,133,220],[134,132,219,217],[220,133,135,218],[136,134,217,216],[218,135,136,216],[216,217,228,230],[229,218,216,230],[217,219,226,228],[227,220,218,229],[219,221,224,226],[225,222,220,227],[221,71,223,224],[223,71,222,225],[223,230,228,224],[229,230,223,225],[224,228,226],[227,229,225],[182,180,233,231],[234,181,183,232],[111,182,231,253],[232,183,112,254],[109,111,253,255],[254,112,110,256],[180,113,251,233],[252,114,181,234],[113,115,249,251],[250,116,114,252],[115,117,247,249],[248,118,116,250],[117,119,245,247],[246,120,118,248],[119,121,243,245],[244,122,120,246],[121,123,241,243],[242,124,122,244],[123,125,239,241],[240,126,124,242],[125,178,235,239],[236,179,126,240],[178,127,237,235],[238,128,179,236],[127,109,255,237],[256,110,128,238],[237,255,257,275],[258,256,238,276],[235,237,275,277],[276,238,236,278],[239,235,277,273],[278,236,240,274],[241,239,273,271],[274,240,242,272],[243,241,271,269],[272,242,244,270],[245,243,269,267],[270,244,246,268],[247,245,267,265],[268,246,248,266],[249,247,265,263],[266,248,250,264],[251,249,263,261],[264,250,252,262],[233,251,261,279],[262,252,234,280],[255,253,259,257],[260,254,256,258],[253,231,281,259],[282,232,254,260],[231,233,279,281],[280,234,232,282],[66,107,283,72],[284,108,66,72],[107,105,285,283],[286,106,108,284],[105,103,287,285],[288,104,106,286],[103,101,289,287],[290,102,104,288],[101,99,291,289],[292,100,102,290],[99,97,293,291],[294,98,100,292],[97,95,295,293],[296,96,98,294],[95,93,297,295],[298,94,96,296],[93,91,299,297],[300,92,94,298],[307,308,327,337],[328,308,307,338],[306,307,337,335],[338,307,306,336],[305,306,335,339],[336,306,305,340],[88,90,305,339],[305,90,89,340],[86,88,339,333],[340,89,87,334],[84,86,333,329],[334,87,85,330],[82,84,329,331],[330,85,83,332],[329,335,337,331],[338,336,330,332],[329,333,339,335],[340,334,330,336],[325,331,337,327],[338,332,326,328],[80,82,331,325],[332,83,81,326],[208,341,343,214],[344,342,209,215],[80,325,341,208],[342,326,81,209],[78,214,343,345],[344,215,79,346],[78,345,299,91],[300,346,79,92],[76,323,351,303],[352,324,76,303],[303,351,349,77],[350,352,303,77],[77,349,347,304],[348,350,77,304],[304,347,327,308],[328,348,304,308],[325,327,347,341],[348,328,326,342],[295,297,317,309],[318,298,296,310],[75,315,323,76],[324,316,75,76],[301,357,355,302],[356,358,301,302],[302,355,353,74],[354,356,302,74],[74,353,315,75],[316,354,74,75],[291,293,361,363],[362,294,292,364],[363,361,367,365],[368,362,364,366],[365,367,369,371],[370,368,366,372],[371,369,375,373],[376,370,372,374],[313,377,373,375],[374,378,314,376],[315,353,373,377],[374,354,316,378],[353,355,371,373],[372,356,354,374],[355,357,365,371],[366,358,356,372],[357,359,363,365],[364,360,358,366],[289,291,363,359],[364,292,290,360],[73,359,357,301],[358,360,73,301],[283,285,287,289],[288,286,284,290],[283,289,359,73],[360,290,284,73],[72,283,73],[73,284,72],[293,295,309,361],[310,296,294,362],[309,311,367,361],[368,312,310,362],[311,381,369,367],[370,382,312,368],[313,375,369,381],[370,376,314,382],[347,349,385,383],[386,350,348,384],[317,383,385,319],[386,384,318,320],[297,299,383,317],[384,300,298,318],[299,343,341,383],[342,344,300,384],[341,347,383],[384,348,342],[299,345,343],[344,346,300],[313,321,379,377],[380,322,314,378],[315,377,379,323],[380,378,316,324],[319,385,379,321],[380,386,320,322],[349,351,379,385],[380,352,350,386],[323,379,351],[352,380,324],[399,387,413,401],[414,388,400,402],[399,401,403,397],[404,402,400,398],[397,403,405,395],[406,404,398,396],[395,405,407,393],[408,406,396,394],[393,407,409,391],[410,408,394,392],[391,409,411,389],[412,410,392,390],[409,419,417,411],[418,420,410,412],[407,421,419,409],[420,422,408,410],[405,423,421,407],[422,424,406,408],[403,425,423,405],[424,426,404,406],[401,427,425,403],[426,428,402,404],[401,413,415,427],[416,414,402,428],[317,319,443,441],[444,320,318,442],[319,389,411,443],[412,390,320,444],[309,317,441,311],[442,318,310,312],[381,429,413,387],[414,430,382,388],[411,417,439,443],[440,418,412,444],[437,445,443,439],[444,446,438,440],[433,445,437,435],[438,446,434,436],[431,447,445,433],[446,448,432,434],[429,447,431,449],[432,448,430,450],[413,429,449,415],[450,430,414,416],[311,447,429,381],[430,448,312,382],[311,441,445,447],[446,442,312,448],[441,443,445],[446,444,442],[415,449,451,475],[452,450,416,476],[449,431,461,451],[462,432,450,452],[431,433,459,461],[460,434,432,462],[433,435,457,459],[458,436,434,460],[435,437,455,457],[456,438,436,458],[437,439,453,455],[454,440,438,456],[439,417,473,453],[474,418,440,454],[427,415,475,463],[476,416,428,464],[425,427,463,465],[464,428,426,466],[423,425,465,467],[466,426,424,468],[421,423,467,469],[468,424,422,470],[419,421,469,471],[470,422,420,472],[417,419,471,473],[472,420,418,474],[457,455,479,477],[480,456,458,478],[477,479,481,483],[482,480,478,484],[483,481,487,485],[488,482,484,486],[485,487,489,491],[490,488,486,492],[463,475,485,491],[486,476,464,492],[451,483,485,475],[486,484,452,476],[451,461,477,483],[478,462,452,484],[457,477,461,459],[462,478,458,460],[453,473,479,455],[480,474,454,456],[471,481,479,473],[480,482,472,474],[469,487,481,471],[482,488,470,472],[467,489,487,469],[488,490,468,470],[465,491,489,467],[490,492,466,468],[463,491,465],[466,492,464],[391,389,503,501],[504,390,392,502],[393,391,501,499],[502,392,394,500],[395,393,499,497],[500,394,396,498],[397,395,497,495],[498,396,398,496],[399,397,495,493],[496,398,400,494],[387,399,493,505],[494,400,388,506],[493,501,503,505],[504,502,494,506],[493,495,499,501],[500,496,494,502],[495,497,499],[500,498,496],[313,381,387,505],[388,382,314,506],[313,505,503,321],[504,506,314,322],[319,321,503,389],[504,322,320,390]],Zt=ri;var ni=[[.4375,.164062,.765625],[-.4375,.164062,.765625],[.5,.09375,.6875],[-.5,.09375,.6875],[.546875,.054688,.578125],[-.546875,.054688,.578125],[.351562,-.023438,.617188],[-.351562,-.023438,.617188],[.351562,.03125,.71875],[-.351562,.03125,.71875],[.351562,.132812,.78125],[-.351562,.132812,.78125],[.273438,.164062,.796875],[-.273438,.164062,.796875],[.203125,.09375,.742188],[-.203125,.09375,.742188],[.15625,.054688,.648438],[-.15625,.054688,.648438],[.078125,.242188,.65625],[-.078125,.242188,.65625],[.140625,.242188,.742188],[-.140625,.242188,.742188],[.242188,.242188,.796875],[-.242188,.242188,.796875],[.273438,.328125,.796875],[-.273438,.328125,.796875],[.203125,.390625,.742188],[-.203125,.390625,.742188],[.15625,.4375,.648438],[-.15625,.4375,.648438],[.351562,.515625,.617188],[-.351562,.515625,.617188],[.351562,.453125,.71875],[-.351562,.453125,.71875],[.351562,.359375,.78125],[-.351562,.359375,.78125],[.4375,.328125,.765625],[-.4375,.328125,.765625],[.5,.390625,.6875],[-.5,.390625,.6875],[.546875,.4375,.578125],[-.546875,.4375,.578125],[.625,.242188,.5625],[-.625,.242188,.5625],[.5625,.242188,.671875],[-.5625,.242188,.671875],[.46875,.242188,.757812],[-.46875,.242188,.757812],[.476562,.242188,.773438],[-.476562,.242188,.773438],[.445312,.335938,.78125],[-.445312,.335938,.78125],[.351562,.375,.804688],[-.351562,.375,.804688],[.265625,.335938,.820312],[-.265625,.335938,.820312],[.226562,.242188,.820312],[-.226562,.242188,.820312],[.265625,.15625,.820312],[-.265625,.15625,.820312],[.351562,.242188,.828125],[-.351562,.242188,.828125],[.351562,.117188,.804688],[-.351562,.117188,.804688],[.445312,.15625,.78125],[-.445312,.15625,.78125],[0,.429688,.742188],[0,.351562,.820312],[0,-.679688,.734375],[0,-.320312,.78125],[0,-.1875,.796875],[0,-.773438,.71875],[0,.40625,.601562],[0,.570312,.570312],[0,.898438,-.546875],[0,.5625,-.851562],[0,.070312,-.828125],[0,-.382812,-.351562],[.203125,-.1875,.5625],[-.203125,-.1875,.5625],[.3125,-.4375,.570312],[-.3125,-.4375,.570312],[.351562,-.695312,.570312],[-.351562,-.695312,.570312],[.367188,-.890625,.53125],[-.367188,-.890625,.53125],[.328125,-.945312,.523438],[-.328125,-.945312,.523438],[.179688,-.96875,.554688],[-.179688,-.96875,.554688],[0,-.984375,.578125],[.4375,-.140625,.53125],[-.4375,-.140625,.53125],[.632812,-.039062,.539062],[-.632812,-.039062,.539062],[.828125,.148438,.445312],[-.828125,.148438,.445312],[.859375,.429688,.59375],[-.859375,.429688,.59375],[.710938,.484375,.625],[-.710938,.484375,.625],[.492188,.601562,.6875],[-.492188,.601562,.6875],[.320312,.757812,.734375],[-.320312,.757812,.734375],[.15625,.71875,.757812],[-.15625,.71875,.757812],[.0625,.492188,.75],[-.0625,.492188,.75],[.164062,.414062,.773438],[-.164062,.414062,.773438],[.125,.304688,.765625],[-.125,.304688,.765625],[.203125,.09375,.742188],[-.203125,.09375,.742188],[.375,.015625,.703125],[-.375,.015625,.703125],[.492188,.0625,.671875],[-.492188,.0625,.671875],[.625,.1875,.648438],[-.625,.1875,.648438],[.640625,.296875,.648438],[-.640625,.296875,.648438],[.601562,.375,.664062],[-.601562,.375,.664062],[.429688,.4375,.71875],[-.429688,.4375,.71875],[.25,.46875,.757812],[-.25,.46875,.757812],[0,-.765625,.734375],[.109375,-.71875,.734375],[-.109375,-.71875,.734375],[.117188,-.835938,.710938],[-.117188,-.835938,.710938],[.0625,-.882812,.695312],[-.0625,-.882812,.695312],[0,-.890625,.6875],[0,-.195312,.75],[0,-.140625,.742188],[.101562,-.148438,.742188],[-.101562,-.148438,.742188],[.125,-.226562,.75],[-.125,-.226562,.75],[.085938,-.289062,.742188],[-.085938,-.289062,.742188],[.398438,-.046875,.671875],[-.398438,-.046875,.671875],[.617188,.054688,.625],[-.617188,.054688,.625],[.726562,.203125,.601562],[-.726562,.203125,.601562],[.742188,.375,.65625],[-.742188,.375,.65625],[.6875,.414062,.726562],[-.6875,.414062,.726562],[.4375,.546875,.796875],[-.4375,.546875,.796875],[.3125,.640625,.835938],[-.3125,.640625,.835938],[.203125,.617188,.851562],[-.203125,.617188,.851562],[.101562,.429688,.84375],[-.101562,.429688,.84375],[.125,-.101562,.8125],[-.125,-.101562,.8125],[.210938,-.445312,.710938],[-.210938,-.445312,.710938],[.25,-.703125,.6875],[-.25,-.703125,.6875],[.265625,-.820312,.664062],[-.265625,-.820312,.664062],[.234375,-.914062,.632812],[-.234375,-.914062,.632812],[.164062,-.929688,.632812],[-.164062,-.929688,.632812],[0,-.945312,.640625],[0,.046875,.726562],[0,.210938,.765625],[.328125,.476562,.742188],[-.328125,.476562,.742188],[.164062,.140625,.75],[-.164062,.140625,.75],[.132812,.210938,.757812],[-.132812,.210938,.757812],[.117188,-.6875,.734375],[-.117188,-.6875,.734375],[.078125,-.445312,.75],[-.078125,-.445312,.75],[0,-.445312,.75],[0,-.328125,.742188],[.09375,-.273438,.78125],[-.09375,-.273438,.78125],[.132812,-.226562,.796875],[-.132812,-.226562,.796875],[.109375,-.132812,.78125],[-.109375,-.132812,.78125],[.039062,-.125,.78125],[-.039062,-.125,.78125],[0,-.203125,.828125],[.046875,-.148438,.8125],[-.046875,-.148438,.8125],[.09375,-.15625,.8125],[-.09375,-.15625,.8125],[.109375,-.226562,.828125],[-.109375,-.226562,.828125],[.078125,-.25,.804688],[-.078125,-.25,.804688],[0,-.289062,.804688],[.257812,-.3125,.554688],[-.257812,-.3125,.554688],[.164062,-.242188,.710938],[-.164062,-.242188,.710938],[.179688,-.3125,.710938],[-.179688,-.3125,.710938],[.234375,-.25,.554688],[-.234375,-.25,.554688],[0,-.875,.6875],[.046875,-.867188,.6875],[-.046875,-.867188,.6875],[.09375,-.820312,.710938],[-.09375,-.820312,.710938],[.09375,-.742188,.726562],[-.09375,-.742188,.726562],[0,-.78125,.65625],[.09375,-.75,.664062],[-.09375,-.75,.664062],[.09375,-.8125,.640625],[-.09375,-.8125,.640625],[.046875,-.851562,.632812],[-.046875,-.851562,.632812],[0,-.859375,.632812],[.171875,.21875,.78125],[-.171875,.21875,.78125],[.1875,.15625,.773438],[-.1875,.15625,.773438],[.335938,.429688,.757812],[-.335938,.429688,.757812],[.273438,.421875,.773438],[-.273438,.421875,.773438],[.421875,.398438,.773438],[-.421875,.398438,.773438],[.5625,.351562,.695312],[-.5625,.351562,.695312],[.585938,.289062,.6875],[-.585938,.289062,.6875],[.578125,.195312,.679688],[-.578125,.195312,.679688],[.476562,.101562,.71875],[-.476562,.101562,.71875],[.375,.0625,.742188],[-.375,.0625,.742188],[.226562,.109375,.78125],[-.226562,.109375,.78125],[.179688,.296875,.78125],[-.179688,.296875,.78125],[.210938,.375,.78125],[-.210938,.375,.78125],[.234375,.359375,.757812],[-.234375,.359375,.757812],[.195312,.296875,.757812],[-.195312,.296875,.757812],[.242188,.125,.757812],[-.242188,.125,.757812],[.375,.085938,.726562],[-.375,.085938,.726562],[.460938,.117188,.703125],[-.460938,.117188,.703125],[.546875,.210938,.671875],[-.546875,.210938,.671875],[.554688,.28125,.671875],[-.554688,.28125,.671875],[.53125,.335938,.679688],[-.53125,.335938,.679688],[.414062,.390625,.75],[-.414062,.390625,.75],[.28125,.398438,.765625],[-.28125,.398438,.765625],[.335938,.40625,.75],[-.335938,.40625,.75],[.203125,.171875,.75],[-.203125,.171875,.75],[.195312,.226562,.75],[-.195312,.226562,.75],[.109375,.460938,.609375],[-.109375,.460938,.609375],[.195312,.664062,.617188],[-.195312,.664062,.617188],[.335938,.6875,.59375],[-.335938,.6875,.59375],[.484375,.554688,.554688],[-.484375,.554688,.554688],[.679688,.453125,.492188],[-.679688,.453125,.492188],[.796875,.40625,.460938],[-.796875,.40625,.460938],[.773438,.164062,.375],[-.773438,.164062,.375],[.601562,0,.414062],[-.601562,0,.414062],[.4375,-.09375,.46875],[-.4375,-.09375,.46875],[0,.898438,.289062],[0,.984375,-.078125],[0,-.195312,-.671875],[0,-.460938,.1875],[0,-.976562,.460938],[0,-.804688,.34375],[0,-.570312,.320312],[0,-.484375,.28125],[.851562,.234375,.054688],[-.851562,.234375,.054688],[.859375,.320312,-.046875],[-.859375,.320312,-.046875],[.773438,.265625,-.4375],[-.773438,.265625,-.4375],[.460938,.4375,-.703125],[-.460938,.4375,-.703125],[.734375,-.046875,.070312],[-.734375,-.046875,.070312],[.59375,-.125,-.164062],[-.59375,-.125,-.164062],[.640625,-.007812,-.429688],[-.640625,-.007812,-.429688],[.335938,.054688,-.664062],[-.335938,.054688,-.664062],[.234375,-.351562,.40625],[-.234375,-.351562,.40625],[.179688,-.414062,.257812],[-.179688,-.414062,.257812],[.289062,-.710938,.382812],[-.289062,-.710938,.382812],[.25,-.5,.390625],[-.25,-.5,.390625],[.328125,-.914062,.398438],[-.328125,-.914062,.398438],[.140625,-.757812,.367188],[-.140625,-.757812,.367188],[.125,-.539062,.359375],[-.125,-.539062,.359375],[.164062,-.945312,.4375],[-.164062,-.945312,.4375],[.21875,-.28125,.429688],[-.21875,-.28125,.429688],[.210938,-.226562,.46875],[-.210938,-.226562,.46875],[.203125,-.171875,.5],[-.203125,-.171875,.5],[.210938,-.390625,.164062],[-.210938,-.390625,.164062],[.296875,-.3125,-.265625],[-.296875,-.3125,-.265625],[.34375,-.148438,-.539062],[-.34375,-.148438,-.539062],[.453125,.867188,-.382812],[-.453125,.867188,-.382812],[.453125,.929688,-.070312],[-.453125,.929688,-.070312],[.453125,.851562,.234375],[-.453125,.851562,.234375],[.460938,.523438,.429688],[-.460938,.523438,.429688],[.726562,.40625,.335938],[-.726562,.40625,.335938],[.632812,.453125,.28125],[-.632812,.453125,.28125],[.640625,.703125,.054688],[-.640625,.703125,.054688],[.796875,.5625,.125],[-.796875,.5625,.125],[.796875,.617188,-.117188],[-.796875,.617188,-.117188],[.640625,.75,-.195312],[-.640625,.75,-.195312],[.640625,.679688,-.445312],[-.640625,.679688,-.445312],[.796875,.539062,-.359375],[-.796875,.539062,-.359375],[.617188,.328125,-.585938],[-.617188,.328125,-.585938],[.484375,.023438,-.546875],[-.484375,.023438,-.546875],[.820312,.328125,-.203125],[-.820312,.328125,-.203125],[.40625,-.171875,.148438],[-.40625,-.171875,.148438],[.429688,-.195312,-.210938],[-.429688,-.195312,-.210938],[.890625,.40625,-.234375],[-.890625,.40625,-.234375],[.773438,-.140625,-.125],[-.773438,-.140625,-.125],[1.039062,-.101562,-.328125],[-1.039062,-.101562,-.328125],[1.28125,.054688,-.429688],[-1.28125,.054688,-.429688],[1.351562,.320312,-.421875],[-1.351562,.320312,-.421875],[1.234375,.507812,-.421875],[-1.234375,.507812,-.421875],[1.023438,.476562,-.3125],[-1.023438,.476562,-.3125],[1.015625,.414062,-.289062],[-1.015625,.414062,-.289062],[1.1875,.4375,-.390625],[-1.1875,.4375,-.390625],[1.265625,.289062,-.40625],[-1.265625,.289062,-.40625],[1.210938,.078125,-.40625],[-1.210938,.078125,-.40625],[1.03125,-.039062,-.304688],[-1.03125,-.039062,-.304688],[.828125,-.070312,-.132812],[-.828125,-.070312,-.132812],[.921875,.359375,-.21875],[-.921875,.359375,-.21875],[.945312,.304688,-.289062],[-.945312,.304688,-.289062],[.882812,-.023438,-.210938],[-.882812,-.023438,-.210938],[1.039062,0,-.367188],[-1.039062,0,-.367188],[1.1875,.09375,-.445312],[-1.1875,.09375,-.445312],[1.234375,.25,-.445312],[-1.234375,.25,-.445312],[1.171875,.359375,-.4375],[-1.171875,.359375,-.4375],[1.023438,.34375,-.359375],[-1.023438,.34375,-.359375],[.84375,.289062,-.210938],[-.84375,.289062,-.210938],[.835938,.171875,-.273438],[-.835938,.171875,-.273438],[.757812,.09375,-.273438],[-.757812,.09375,-.273438],[.820312,.085938,-.273438],[-.820312,.085938,-.273438],[.84375,.015625,-.273438],[-.84375,.015625,-.273438],[.8125,-.015625,-.273438],[-.8125,-.015625,-.273438],[.726562,0,-.070312],[-.726562,0,-.070312],[.71875,-.023438,-.171875],[-.71875,-.023438,-.171875],[.71875,.039062,-.1875],[-.71875,.039062,-.1875],[.796875,.203125,-.210938],[-.796875,.203125,-.210938],[.890625,.242188,-.265625],[-.890625,.242188,-.265625],[.890625,.234375,-.320312],[-.890625,.234375,-.320312],[.8125,-.015625,-.320312],[-.8125,-.015625,-.320312],[.851562,.015625,-.320312],[-.851562,.015625,-.320312],[.828125,.078125,-.320312],[-.828125,.078125,-.320312],[.765625,.09375,-.320312],[-.765625,.09375,-.320312],[.84375,.171875,-.320312],[-.84375,.171875,-.320312],[1.039062,.328125,-.414062],[-1.039062,.328125,-.414062],[1.1875,.34375,-.484375],[-1.1875,.34375,-.484375],[1.257812,.242188,-.492188],[-1.257812,.242188,-.492188],[1.210938,.085938,-.484375],[-1.210938,.085938,-.484375],[1.046875,0,-.421875],[-1.046875,0,-.421875],[.882812,-.015625,-.265625],[-.882812,-.015625,-.265625],[.953125,.289062,-.34375],[-.953125,.289062,-.34375],[.890625,.109375,-.328125],[-.890625,.109375,-.328125],[.9375,.0625,-.335938],[-.9375,.0625,-.335938],[1,.125,-.367188],[-1,.125,-.367188],[.960938,.171875,-.351562],[-.960938,.171875,-.351562],[1.015625,.234375,-.375],[-1.015625,.234375,-.375],[1.054688,.1875,-.382812],[-1.054688,.1875,-.382812],[1.109375,.210938,-.390625],[-1.109375,.210938,-.390625],[1.085938,.273438,-.390625],[-1.085938,.273438,-.390625],[1.023438,.4375,-.484375],[-1.023438,.4375,-.484375],[1.25,.46875,-.546875],[-1.25,.46875,-.546875],[1.367188,.296875,-.5],[-1.367188,.296875,-.5],[1.3125,.054688,-.53125],[-1.3125,.054688,-.53125],[1.039062,-.085938,-.492188],[-1.039062,-.085938,-.492188],[.789062,-.125,-.328125],[-.789062,-.125,-.328125],[.859375,.382812,-.382812],[-.859375,.382812,-.382812]],qt=ni;var Dt=class extends V{constructor(t){super({...t,vertices:qt,faces:Zt})}};var Bt=class extends V{width;height;length;constructor(t){super({...t,vertices:rt(t?.width??1,t?.height??1,t?.length??1),faces:Tt}),this.width=t?.width??1,this.height=t?.height??1,this.length=t?.length??1}computeVertices(){this.vertices=rt(this.width,this.height,this.length)}setWidth(t){this.width=t,this.computeVertices()}setHeight(t){this.height=t,this.computeVertices()}setLength(t){this.length=t,this.computeVertices()}};var oi={Engine:B,Sprite:f,TSCMath:o,Perlin1D:ct,Perlin2D:ht,InverseKinematics:at,Multiplayer:lt,Line:ut,Rectangle:it,Square:pt,Oval:dt,Circle:mt,Arc:bt,RegularPolygon:gt,CustomPolygon:et,Pen:q,Text:st,Button:ft,Watermark:yt,ImageSprite:xt,RigidRectangle:vt,Camera3D:St,Renderer3D:H,WireframeRenderer3D:wt,SolidRenderer3D:Ct,Object3D:V,Tetrahedron:Ot,Cube:Vt,Octahedron:Pt,Icosahedron:Mt,Icosphere:zt,Monkey:Dt,Cuboid:Bt,scale:Q,aspectRatio:ot,setScale:kt,setAspectRatio:Wt,canvas:h,ctx:p},l0=oi;export{bt as Arc,ft as Button,St as Camera3D,mt as Circle,Vt as Cube,Bt as Cuboid,et as CustomPolygon,B as Engine,Mt as Icosahedron,zt as Icosphere,xt as ImageSprite,at as InverseKinematics,ut as Line,Dt as Monkey,lt as Multiplayer,V as Object3D,Pt as Octahedron,dt as Oval,q as Pen,ct as Perlin1D,ht as Perlin2D,it as Rectangle,gt as RegularPolygon,H as Renderer3D,vt as RigidRectangle,Ct as SolidRenderer3D,f as Sprite,pt as Square,o as TSCMath,Ot as Tetrahedron,st as Text,yt as Watermark,wt as WireframeRenderer3D,ot as aspectRatio,h as canvas,p as ctx,l0 as default,Q as scale,Wt as setAspectRatio,kt as setScale};
3
3
  //# sourceMappingURL=index.js.map