tscratch 0.7.4 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.cjs +2 -2
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +43 -40
- package/dist/client/index.d.ts +43 -40
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/index.ts","../../src/client/canvas.ts","../../src/client/Sprite.ts","../../src/client/TSCMath.ts","../../src/client/Engine.ts","../../src/client/Multiplayer.ts","../../src/client/sprites/Rectangle.ts","../../src/client/sprites/Square.ts","../../src/client/sprites/Oval.ts","../../src/client/sprites/Circle.ts","../../src/client/sprites/Arc.ts","../../src/client/sprites/RegularPolygon.ts","../../src/client/sprites/CustomPolygon.ts","../../src/client/sprites/Pen.ts","../../src/client/sprites/Text.ts","../../src/client/sprites/Button.ts","../../src/client/sprites/Watermark.ts","../../src/client/sprites/ImageSprite.ts","../../src/client/sprites/physics/RigidCircle.ts","../../src/client/sprites/3d/WireframeRenderer3D.ts","../../src/client/sprites/3d/SolidRenderer3D.ts","../../src/client/sprites/3d/Object3D.ts","../../src/client/sprites/3d/models/faces/tetrahedron.ts","../../src/client/sprites/3d/models/vertices/tetrahedron.ts","../../src/client/sprites/3d/models/Tetrahedron.ts","../../src/client/sprites/3d/models/faces/cuboid.ts","../../src/client/sprites/3d/models/vertices/cuboid.ts","../../src/client/sprites/3d/models/Cube.ts","../../src/client/sprites/3d/models/faces/octahedron.ts","../../src/client/sprites/3d/models/vertices/octahedron.ts","../../src/client/sprites/3d/models/Octahedron.ts","../../src/client/sprites/3d/models/faces/icosahedron.ts","../../src/client/sprites/3d/models/vertices/icosahedron.ts","../../src/client/sprites/3d/models/Icosahedron.ts","../../src/client/sprites/3d/models/faces/icosphere.ts","../../src/client/sprites/3d/models/vertices/icosphere.ts","../../src/client/sprites/3d/models/Icosphere.ts","../../src/client/sprites/3d/models/faces/monkey.ts","../../src/client/sprites/3d/models/vertices/monkey.ts","../../src/client/sprites/3d/models/Monkey.ts","../../src/client/sprites/3d/models/Cuboid.ts"],"sourcesContent":["// Main\r\nimport Engine from './Engine.ts';\r\nimport Sprite, { type SpriteOptions } from './Sprite.ts';\r\nimport { scale, aspectRatio, setScale, setAspectRatio, canvas, ctx } from './canvas.ts';\r\nimport TSCMath from './TSCMath.ts';\r\n\r\n// Multiplayer\r\nimport Multiplayer from './Multiplayer.ts';\r\n\r\n// Sprites\r\nimport Rectangle, { type RectangleOptions } from './sprites/Rectangle.ts';\r\nimport Square, { type SquareOptions } from './sprites/Square.ts';\r\nimport Oval, { type OvalOptions } from './sprites/Oval.ts';\r\nimport Circle, { type CircleOptions } from './sprites/Circle.ts';\r\nimport Arc, { type ArcOptions } from './sprites/Arc.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from './sprites/RegularPolygon.ts';\r\nimport CustomPolygon, { type CustomPolygonOptions } from './sprites/CustomPolygon.ts';\r\nimport Pen, { type PenOptions } from './sprites/Pen.ts';\r\nimport Text, { type TextOptions } from './sprites/Text.ts';\r\nimport Button, { type ButtonOptions } from './sprites/Button.ts';\r\nimport Watermark from './sprites/Watermark.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from './sprites/ImageSprite.ts';\r\n\r\nimport RigidCircle, { type RigidCircleOptions } from './sprites/physics/RigidCircle.ts';\r\n\r\n// 3D\r\nimport WireframeRenderer3D, { type WireframeRenderer3DOptions } from './sprites/3d/WireframeRenderer3D.ts';\r\nimport SolidRenderer3D, { type SolidRenderer3DOptions } from './sprites/3d/SolidRenderer3D.ts';\r\nimport Object3D, { type Object3DOptions } from './sprites/3d/Object3D.ts';\r\n\r\nimport Tetrahedron from './sprites/3d/models/Tetrahedron.ts';\r\nimport Cube from './sprites/3d/models/Cube.ts';\r\nimport Octahedron from './sprites/3d/models/Octahedron.ts';\r\nimport Icosahedron from './sprites/3d/models/Icosahedron.ts';\r\nimport Icosphere from './sprites/3d/models/Icosphere.ts';\r\nimport Monkey from './sprites/3d/models/Monkey.ts';\r\nimport Cuboid, { type CuboidOptions } from './sprites/3d/models/Cuboid.ts';\r\n\r\n// Types\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\nimport type { Mat2, Mat3, Mat4 } from './types/Matricies.ts';\r\nimport { type RigidBodyOptions } from './sprites/physics/RigidBodyOptions.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n TSCMath,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n WireframeRenderer3D,\r\n SolidRenderer3D,\r\n Object3D,\r\n\r\n Tetrahedron,\r\n Cube,\r\n Octahedron,\r\n Icosahedron,\r\n Icosphere,\r\n Monkey,\r\n\r\n Cuboid,\r\n\r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n TSCMath,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n WireframeRenderer3D,\r\n SolidRenderer3D,\r\n Object3D,\r\n\r\n Tetrahedron,\r\n Cube,\r\n Octahedron,\r\n Icosahedron,\r\n Icosphere,\r\n Monkey,\r\n\r\n Cuboid,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type SquareOptions,\r\n type OvalOptions,\r\n type CircleOptions,\r\n type ArcOptions,\r\n type RegularPolygonOptions,\r\n type CustomPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ButtonOptions,\r\n type TextOptions as WatermarkOptions,\r\n type ImageSpriteOptions,\r\n\r\n type RigidBodyOptions,\r\n type RigidCircleOptions,\r\n type WireframeRenderer3DOptions,\r\n type SolidRenderer3DOptions,\r\n type Object3DOptions,\r\n\r\n type CuboidOptions,\r\n\r\n // Other types\r\n type Vec2,\r\n type Vec3,\r\n type Vec4,\r\n type Mat2,\r\n type Mat3,\r\n type Mat4,\r\n \r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement || document.createElement('canvas'); // For testing\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\n\r\nexport let aspectRatio: number = 16 / 9;\r\nexport let scale: number;\r\n\r\nfunction updateSize() {\r\n canvas.width = aspectRatio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = aspectRatio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n updateSize();\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n aspectRatio = newAspectRatio;\r\n updateSize();\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\nimport type { Vec2 } from './types/Vectors.ts';\r\n\r\nexport interface BoundingBox {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n size?: number;\r\n pivot?: Vec2;\r\n scene?: string;\r\n hidden?: boolean;\r\n layer?: number;\r\n}\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number = 0;\r\n public y: number = 0;\r\n public dir: number = 0;\r\n public size: number = 1;\r\n public pivot: Vec2 = [0, 0];\r\n public scene: string = 'main';\r\n public hidden: boolean = false;\r\n public layer: number = 0;\r\n\r\n public abstract discriminant: string;\r\n public abstract tags: Set<string>;\r\n\r\n private cachedPath: Path2D | null = null;\r\n private pathDirty: boolean = true;\r\n\r\n // Reusable collision detection canvas\r\n private static collisionCanvas: OffscreenCanvas | null = null;\r\n private static collisionCtx: OffscreenCanvasRenderingContext2D | null = null;\r\n\r\n // Rendering\r\n\r\n public abstract getBoundingBox(): BoundingBox;\r\n public abstract getPath(): Path2D;\r\n public abstract draw(stamping?: true): void;\r\n protected abstract create(options?: SpriteOptions): this;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\r\n public getCachedPath(): Path2D {\r\n if (this.pathDirty || !this.cachedPath) {\r\n this.cachedPath = this.getPath();\r\n this.pathDirty = false;\r\n }\r\n return this.cachedPath;\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n Object.assign(this, options);\r\n Engine.init().addSprite(this);\r\n }\r\n\r\n protected getCreateOptions(): SpriteOptions & Record<string, any> {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n dir: this.dir,\r\n size: this.size,\r\n scene: this.scene,\r\n layer: this.layer,\r\n hidden: this.hidden\r\n };\r\n }\r\n\r\n public clone(options?: SpriteOptions): this {\r\n return this.create({\r\n ...this.getCreateOptions(),\r\n ...options\r\n });\r\n }\r\n\r\n // Sensing\r\n\r\n public touching(sprite: Sprite): boolean {\r\n\r\n // Return if hidden or if the scenes differ\r\n if (this.hidden || sprite.hidden || (this.scene !== '*' && sprite.scene !== '*' && this.scene !== sprite.scene)) return false;\r\n\r\n // AABB (bounding boxes)\r\n const bBox1 = this.getBoundingBox();\r\n const bBox2 = sprite.getBoundingBox();\r\n\r\n const aabbOverlap =\r\n Math.abs(bBox1.x - bBox2.x) < (bBox1.width + bBox2.width) / 2 &&\r\n Math.abs(bBox1.y - bBox2.y) < (bBox1.height + bBox2.height) / 2;\r\n\r\n if (!aabbOverlap) return false;\r\n\r\n // Image data (pixel perfect)\r\n\r\n // Compute intersection bounding box\r\n const b1Left = bBox1.x - bBox1.width / 2;\r\n const b1Top = bBox1.y + bBox1.height / 2;\r\n const b1Right = bBox1.x + bBox1.width / 2;\r\n const b1Bottom = bBox1.y - bBox1.height / 2;\r\n\r\n const b2Left = bBox2.x - bBox2.width / 2;\r\n const b2Top = bBox2.y + bBox2.height / 2;\r\n const b2Right = bBox2.x + bBox2.width / 2;\r\n const b2Bottom = bBox2.y - bBox2.height / 2;\r\n\r\n const xMin = Math.max(b1Left, b2Left);\r\n const yMin = Math.min(b1Bottom, b2Bottom);\r\n const xMax = Math.min(b1Right, b2Right);\r\n const yMax = Math.max(b1Top, b2Top);\r\n\r\n const width = xMax - xMin;\r\n const height = yMax - yMin;\r\n\r\n if (width < 1 || height < 1) return false;\r\n\r\n // Reuse or create offscreen canvas for collision detection\r\n if (!Sprite.collisionCanvas) {\r\n Sprite.collisionCanvas = new OffscreenCanvas(1, 1);\r\n Sprite.collisionCtx = Sprite.collisionCanvas.getContext('2d', { willReadFrequently: true })!;\r\n }\r\n\r\n // Prepare canvas\r\n const ctx = Sprite.collisionCtx!;\r\n if (Sprite.collisionCanvas.width < width) Sprite.collisionCanvas.width = width;\r\n if (Sprite.collisionCanvas.height < height) Sprite.collisionCanvas.height = height;\r\n ctx.clearRect(0, 0, width, height);\r\n\r\n // Helper to draw a sprite into collision canvas\r\n const drawSprite = (sprite: Sprite, color: string) => {\r\n ctx.save();\r\n\r\n // Translate to intersection box coordinates (centered)\r\n const dx = sprite.x - xMin;\r\n const dy = yMax - sprite.y; // flip Y to match draw()\r\n\r\n ctx.translate(dx, dy);\r\n ctx.rotate(sprite.toRadians(sprite.dir));\r\n\r\n ctx.fillStyle = color;\r\n ctx.fill(sprite.getCachedPath());\r\n\r\n ctx.restore();\r\n };\r\n\r\n // Draw sprite 1 in red\r\n drawSprite(this, 'red');\r\n const img1 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Draw sprite 2 in blue\r\n ctx.clearRect(0, 0, width, height);\r\n drawSprite(sprite, 'blue');\r\n const img2 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Check for overlapping non-transparent pixels\r\n for (let i = 3; i < img1.length; i += 4) // alpha channel\r\n if (img1[i]! > 0 && img2[i]! > 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n public distanceTo(x: number, y: number) {\r\n return Math.hypot(x - this.x, y - this.y);\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public pointTowards(x: number, y: number) {\r\n this.dir = 90 - this.toDegrees(Math.atan2(y - this.y, x - this.x));\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n\r\n public setPivot(x: number, y: number) {\r\n this.pivot = [x, y];\r\n this.refresh();\r\n }\r\n\r\n // Looks\r\n\r\n public show() {\r\n this.hidden = false;\r\n this.refresh();\r\n }\r\n\r\n public hide() {\r\n this.hidden = true;\r\n this.refresh();\r\n }\r\n\r\n public setSize(size: number) {\r\n this.size = size > 0 ? size : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public changeSize(dS: number) {\r\n this.size = this.size + dS > 0 ? this.size + dS : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public goToLayer(layer: number) {\r\n this.layer = layer;\r\n this.refresh();\r\n }\r\n\r\n public changeLayer(dL: number) {\r\n this.layer += dL;\r\n this.refresh();\r\n }\r\n}","import type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\n\r\ntype Vec = Vec2 | Vec3 | Vec4;\r\n\r\nexport default class TSCMath {\r\n\r\n // Random integer\r\n public static pickRandom(min: number, max: number) {\r\n if (min > max)\r\n [min, max] = [max, min];\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n // --- Vectors ---\r\n\r\n // Vector magnitude\r\n public static magnitude(v: Vec2): number;\r\n public static magnitude(v: Vec3): number;\r\n public static magnitude(v: Vec4): number;\r\n public static magnitude(v: Vec): number {\r\n return Math.hypot(...v);\r\n }\r\n\r\n // Vector normalization\r\n public static normalize(v: Vec2): Vec2;\r\n public static normalize(v: Vec3): Vec3;\r\n public static normalize(v: Vec4): Vec4;\r\n public static normalize(v: Vec): Vec {\r\n const d = Math.hypot(...v);\r\n if (d === 0) return [...v] as Vec;\r\n\r\n return v.map(n => n / d) as Vec;\r\n }\r\n\r\n // Vector addition\r\n public static add(a: Vec2, b: Vec2): Vec2;\r\n public static add(a: Vec3, b: Vec3): Vec3;\r\n public static add(a: Vec4, b: Vec4): Vec4;\r\n public static add(a: Vec, b: Vec): Vec {\r\n return a.map((n, i) => n + b[i]!) as Vec;\r\n }\r\n\r\n // Vector subtraction\r\n public static subtract(a: Vec2, b: Vec2): Vec2;\r\n public static subtract(a: Vec3, b: Vec3): Vec3;\r\n public static subtract(a: Vec4, b: Vec4): Vec4;\r\n public static subtract(a: Vec, b: Vec): Vec {\r\n return a.map((n, i) => n - b[i]!) as Vec;\r\n }\r\n\r\n // Vector dot product\r\n public static dot(a: Vec2, b: Vec2): number;\r\n public static dot(a: Vec3, b: Vec3): number;\r\n public static dot(a: Vec4, b: Vec4): number;\r\n public static dot(a: Vec, b: Vec): number {\r\n return a.reduce((sum, n, i) => sum + n * b[i]!, 0);\r\n }\r\n\r\n // Vector cross product\r\n public static cross(a: Vec3, b: Vec3): Vec3 {\r\n return [\r\n a[1] * b[2] - a[2] * b[1],\r\n a[2] * b[0] - a[0] * b[2],\r\n a[0] * b[1] - a[1] * b[0],\r\n ];\r\n }\r\n\r\n // --- Angles ---\r\n\r\n // Deg / rad conversion\r\n public static toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public static toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Trigonometric functions\r\n public static sin(deg: number) {\r\n return Math.sin(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static cos(deg: number) {\r\n return Math.cos(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static tan(deg: number) {\r\n return Math.tan(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static csc(deg: number) {\r\n return 1 / Math.sin(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static sec(deg: number) {\r\n return 1 / Math.cos(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static cot(deg: number) {\r\n return 1 / Math.tan(TSCMath.toRadians(deg));\r\n }\r\n\r\n // Inverse Trigonometric functions\r\n public static asin(val: number) {\r\n return TSCMath.toDegrees(Math.asin(val));\r\n }\r\n\r\n public static acos(val: number) {\r\n return TSCMath.toDegrees(Math.acos(val));\r\n }\r\n\r\n public static acsc(val: number) {\r\n return TSCMath.toDegrees(Math.asin(1 / val));\r\n }\r\n\r\n public static asec(val: number) {\r\n return TSCMath.toDegrees(Math.acos(1 / val));\r\n }\r\n}","import { canvas, ctx, penCanvas } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\nimport TSCMath from './TSCMath.ts';\r\nimport type { Vec2, Vec3, Vec4 } from './types/Vectors.ts';\r\n\r\ntype GameLoop = (() => void) | (() => Promise<void>);\r\n\r\ntype SceneMap = Map<string, {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n}>;\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private loopRunning: boolean = false;\r\n private gameLoop: GameLoop | null = null;\r\n\r\n public maxFPS: number = 30;\r\n public deltaTime: number = 1 / this.maxFPS;\r\n private lastFrame: number = performance.now();\r\n private refreshScheduled: boolean = false;\r\n private animationFrameId: number | null = null;\r\n\r\n private sounds: HTMLAudioElement[] = [];\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public mouseDown: boolean = false;\r\n public mouseClicked: boolean = false;\r\n\r\n private keysPressed: Set<string> = new Set<string>();\r\n\r\n private currentScene: string = 'main';\r\n public sceneMap: SceneMap = new Map();\r\n\r\n private variableMap: Map<string, unknown> = new Map();\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n // Change the scene\r\n\r\n public setScene(scene: string) {\r\n if (!this.sceneMap.get(scene))\r\n this.sceneMap.set(scene, { sprites: [], loop: null });\r\n\r\n this.loopRunning = false;\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap.get(scene)!.loop;\r\n this.setMaxFPS(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Loops\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [], loop });\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.loop = loop;\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n }\r\n\r\n public pauseLoop() {\r\n this.loopRunning = false;\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n }\r\n\r\n public resumeLoop() {\r\n this.loopRunning = true;\r\n void this.setMaxFPS(this.maxFPS);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(sprite: Sprite) {\r\n const { scene, layer } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [sprite], loop: null });\r\n return;\r\n }\r\n\r\n let targetIndex = this.sceneMap.get(scene)!.sprites.findIndex(s => s.layer > layer);\r\n if (targetIndex === -1) {\r\n this.sceneMap.get(scene)!.sprites.push(sprite);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.sprites.splice(targetIndex, 0, sprite);\r\n this.refresh();\r\n }\r\n\r\n public removeSprite(sprite: Sprite) {\r\n const { scene } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) return;\r\n\r\n this.sceneMap.get(scene)!.sprites = this.sceneMap.get(scene)!.sprites.filter(s => s !== sprite);\r\n this.refresh();\r\n }\r\n\r\n public async setMaxFPS(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n\r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n // Cancel existing animation frame if any\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n\r\n this.loopRunning = true;\r\n const frameInterval = 1000 / maxFPS;\r\n let accumulator = 0;\r\n\r\n const tick = async (currentTime: number) => {\r\n if (!this.loopRunning) return;\r\n\r\n const deltaTime = currentTime - this.lastFrame;\r\n this.lastFrame = currentTime;\r\n accumulator += deltaTime;\r\n\r\n // Fixed timestep: only run loop when enough time has passed\r\n if (accumulator >= frameInterval) {\r\n this.deltaTime = accumulator / 1000;\r\n accumulator = accumulator % frameInterval;\r\n\r\n if (loop) await loop();\r\n }\r\n\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.lastFrame = performance.now();\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n }\r\n\r\n public refresh() {\r\n if (this.refreshScheduled) return;\r\n this.refreshScheduled = true;\r\n\r\n requestAnimationFrame(() => {\r\n this.refreshScheduled = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const sprites = [\r\n ...this.sceneMap.get(this.currentScene)!.sprites,\r\n ...this.sceneMap.get('*')!.sprites\r\n ];\r\n sprites.forEach(sprite => {\r\n if (!sprite.hidden)\r\n sprite.draw();\r\n });\r\n });\r\n }\r\n\r\n // Wait functions\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n public async waitUntil(conditionGetter: () => boolean): Promise<void> {\r\n return new Promise(resolve => {\r\n const check = () => {\r\n if (conditionGetter()) resolve();\r\n else setTimeout(check, 1000 / this.maxFPS);\r\n }\r\n check();\r\n });\r\n }\r\n\r\n // Global variables\r\n\r\n public setVariable<T = any>(key: string, value: T) {\r\n this.variableMap.set(key, value);\r\n }\r\n\r\n public getVariable<T = unknown>(key: string) {\r\n return this.variableMap.get(key) as T;\r\n }\r\n\r\n // Events\r\n\r\n public hovering(sprite: Sprite) {\r\n const { mouseX, mouseY } = this;\r\n\r\n const canvasMouseX = mouseX + canvas.width / 2;\r\n const canvasMouseY = canvas.height / 2 - mouseY;\r\n\r\n // Mouse relative to sprite center\r\n const localX = canvasMouseX - (sprite.x + canvas.width / 2);\r\n const localY = canvasMouseY - (canvas.height / 2 - sprite.y);\r\n\r\n // Rotate mouse point by -dir to align with the path's local coordinates\r\n const angle = -TSCMath.toRadians(sprite.dir);\r\n const rotatedX = localX * Math.cos(angle) - localY * Math.sin(angle);\r\n const rotatedY = localX * Math.sin(angle) + localY * Math.cos(angle);\r\n\r\n return ctx.isPointInPath(sprite.getCachedPath(), rotatedX, rotatedY);\r\n }\r\n\r\n public keyPressed(key: string) {\r\n switch (key) {\r\n case 'any': return this.keysPressed.size > 0;\r\n\r\n case 'up': return this.keysPressed.has('ArrowUp');\r\n case 'down': return this.keysPressed.has('ArrowDown');\r\n case 'left': return this.keysPressed.has('ArrowLeft');\r\n case 'right': return this.keysPressed.has('ArrowRight');\r\n\r\n case 'space': return this.keysPressed.has(' ');\r\n\r\n default: return this.keysPressed.has(key);\r\n }\r\n }\r\n\r\n // Sound\r\n\r\n public playSound(src: string) {\r\n const audio = new Audio(src);\r\n this.sounds.push(audio);\r\n\r\n audio.play();\r\n\r\n return audio;\r\n }\r\n\r\n public stopSound(sound: HTMLAudioElement) {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n this.sounds = this.sounds.filter(s => s !== sound);\r\n }\r\n\r\n public stopAllSounds() {\r\n this.sounds.forEach(sound => {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n });\r\n this.sounds = [];\r\n }\r\n\r\n // Private constructor\r\n\r\n private constructor() {\r\n void this.setMaxFPS(30);\r\n this.sceneMap.set('main', { loop: null, sprites: [] });\r\n this.sceneMap.set('*', { loop: null, sprites: [] });\r\n\r\n // Events\r\n\r\n // Mouse\r\n penCanvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - penCanvas.offsetLeft - penCanvas.width / 2;\r\n this.mouseY = -(e.clientY - penCanvas.offsetTop - penCanvas.height / 2);\r\n });\r\n penCanvas.addEventListener('mousedown', () => {\r\n this.mouseDown = true;\r\n });\r\n penCanvas.addEventListener('mouseup', () => {\r\n this.mouseDown = false;\r\n });\r\n penCanvas.addEventListener('click', () => {\r\n this.mouseClicked = true;\r\n setTimeout(() => this.mouseClicked = false, 0);\r\n });\r\n\r\n // Keys\r\n addEventListener('keydown', e => {\r\n if (e.repeat) return;\r\n this.keysPressed.add(e.key);\r\n });\r\n\r\n addEventListener('keyup', e => {\r\n this.keysPressed.delete(e.key);\r\n });\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\r\n\r\nexport default class Multiplayer {\r\n\r\n private static instance: Multiplayer;\r\n private socket: Socket;\r\n\r\n public static connect(serverURL: string = 'http://localhost:3000') {\r\n if (!this.instance)\r\n this.instance = new Multiplayer(serverURL);\r\n\r\n return this.instance;\r\n }\r\n\r\n public disconnect() {\r\n this.socket.disconnect();\r\n }\r\n\r\n private constructor(serverURL: string) {\r\n this.socket = io(serverURL);\r\n }\r\n\r\n // Methods\r\n\r\n public broadcast<T = unknown>(eventName: string, data: T) {\r\n this.socket.emit(eventName, data);\r\n }\r\n\r\n public on<T = unknown>(eventName: string, callback: (data: T) => void) {\r\n this.socket.on(eventName, callback);\r\n }\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public discriminant = 'rectangle';\r\n public tags = new Set(['rectangle']);\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RectangleOptions): this {\r\n return new Rectangle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n width: this.width,\r\n height: this.height,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '../canvas.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface SquareOptions extends SpriteOptions {\r\n sideLength?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Square extends Sprite {\r\n\r\n public discriminant = 'square';\r\n public tags = new Set(['square']);\r\n\r\n public sideLength: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const s = this.sideLength / 2;\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const size = 2 * (Math.abs(s * cos) + Math.abs(s * sin)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: size,\r\n height: size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.sideLength / 2 * this.size,\r\n -this.sideLength / 2 * this.size,\r\n this.sideLength * this.size,\r\n this.sideLength * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: SquareOptions): this {\r\n return new Square(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sideLength: this.sideLength,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSideLength(sideLength: number) {\r\n this.sideLength = sideLength;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: SquareOptions) {\r\n super(options);\r\n this.sideLength = options?.sideLength ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radX?: number;\r\n radY?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public discriminant = 'oval';\r\n public tags = new Set(['oval']);\r\n\r\n public radX: number;\r\n public radY: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const rX = this.radX;\r\n const rY = this.radY;\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(rX * cos) + Math.abs(rY * sin)) * this.size;\r\n const height = 2 * (Math.abs(rX * sin) + Math.abs(rY * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radX * this.size,\r\n this.radY * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: OvalOptions): this {\r\n return new Oval(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radX: this.radX,\r\n radY: this.radY,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadX(radX: number) {\r\n this.radX = radX;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadY(radY: number) {\r\n this.radY = radY;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n\r\n this.radX = options?.radX ?? 25;\r\n this.radY = options?.radY ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '../Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface CircleOptions extends SpriteOptions {\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Circle extends Sprite {\r\n\r\n public discriminant = 'circle';\r\n public tags = new Set(['circle']);\r\n\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.radius * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CircleOptions): this {\r\n return new Circle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CircleOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\n\r\nexport interface ArcOptions extends SpriteOptions {\r\n radius?: number;\r\n angle?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Arc extends Sprite {\r\n\r\n public discriminant = 'arc';\r\n public tags = new Set(['arc']);\r\n\r\n public radius: number;\r\n public angle: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.arc(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.toRadians(this.angle / 2 - 90),\r\n this.toRadians(-this.angle / 2 - 90)\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ArcOptions): this {\r\n return new Arc(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n angle: this.angle,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAngle(angle: number) {\r\n this.angle = angle;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: ArcOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.angle = options?.angle ?? 270;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public discriminant = 'regularpolygon';\r\n public tags = new Set(['regularpolygon']);\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n const step = (2 * Math.PI) / this.sides;\r\n\r\n path.moveTo(this.radius * this.size, 0);\r\n for (let i = 1; i < this.sides; i++)\r\n path.lineTo(\r\n this.radius * Math.cos(step * i) * this.size,\r\n this.radius * Math.sin(step * i) * this.size\r\n );\r\n \r\n path.closePath();\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(TSCMath.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RegularPolygonOptions): this {\r\n return new RegularPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sides: this.sides,\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport type { Vec2 } from '../types/Vectors.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface CustomPolygonOptions extends SpriteOptions {\r\n vertices?: Vec2[];\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class CustomPolygon extends Sprite {\r\n\r\n public discriminant = 'custompolygon';\r\n public tags = new Set(['custompolygon']);\r\n\r\n public vertices: Vec2[];\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n if (this.vertices.length === 0) {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n for (const v of this.vertices) {\r\n\r\n // Rotate\r\n const rx = v[0] * cos - v[1] * sin;\r\n const ry = v[0] * sin + v[1] * cos;\r\n\r\n // Translate\r\n const fx = this.x + rx;\r\n const fy = this.y + ry;\r\n\r\n if (fx < minX) minX = fx;\r\n if (fx > maxX) maxX = fx;\r\n if (fy < minY) minY = fy;\r\n if (fy > maxY) maxY = fy;\r\n }\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n const x = minX + width / 2;\r\n const y = minY + height / 2;\r\n\r\n return {\r\n x: x * this.size,\r\n y: y * this.size,\r\n width: width * this.size,\r\n height: height * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n if (this.vertices.length < 2) return path;\r\n\r\n const vertices = this.vertices as [Vec2, Vec2, ...Vec2[]];\r\n const [first, ...rest] = vertices;\r\n\r\n path.moveTo(first[0] * this.size, -first[1] * this.size);\r\n for (const v of rest) path.lineTo(v[0] * this.size, -v[1] * this.size);\r\n\r\n path.closePath();\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CustomPolygonOptions): this {\r\n return new CustomPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n vertices: this.vertices,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setVertices(vertices: Vec2[]) {\r\n this.vertices = vertices;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CustomPolygonOptions) {\r\n super(options);\r\n\r\n this.vertices = options?.vertices ?? [];\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\nimport Engine from '../Engine.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n penSize?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public discriminant = 'pen';\r\n public tags = new Set(['pen']);\r\n\r\n public drawing: boolean;\r\n public penSize: number;\r\n public color: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.penSize * this.size * 2,\r\n height: this.penSize * this.size * 2\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n return new Path2D();\r\n }\r\n public draw() {}\r\n\r\n public create(options?: PenOptions): this {\r\n return new Pen(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n drawing: this.drawing,\r\n penSize: this.penSize,\r\n color: this.color\r\n };\r\n }\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public stamp(sprite: Sprite) {\r\n sprite.draw(true);\r\n }\r\n\r\n public eraseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.penSize / 2 + canvas.width / 2,\r\n -this.y - this.penSize / 2 + canvas.height / 2,\r\n this.penSize,\r\n this.penSize\r\n );\r\n }\r\n\r\n public drawSprite(sprite: Sprite) {\r\n sprite.draw(true);\r\n Engine.init().removeSprite(sprite);\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.penSize;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(TSCMath.toRadians(this.dir));\r\n this.y += steps * Math.cos(TSCMath.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n \r\n this.drawing = options?.drawing ?? false;\r\n this.penSize = options?.penSize ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string | number;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public discriminant = 'text';\r\n public tags = new Set(['text']);\r\n\r\n public content: string | number;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = metrics.width / 2; // half-width\r\n const h = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const width = metrics.width * this.size;\r\n const height = (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent) * this.size;\r\n\r\n ctx.restore();\r\n\r\n path.rect(-width / 2, -height / 2, width, height);\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n c.font = this.font;\r\n c.fillStyle = this.color;\r\n c.textAlign = this.align;\r\n c.textBaseline = this.baseline;\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: TextOptions): this {\r\n return new Text(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions,\r\n content: this.content,\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n align: this.align,\r\n baseline: this.baseline\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface ButtonOptions extends SpriteOptions {\r\n content?: string | number;\r\n fontColor?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n\r\n width?: number;\r\n height?: number;\r\n backgroundColor?: string;\r\n\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class Button extends Sprite {\r\n\r\n public discriminant = 'button';\r\n public tags = new Set(['button']);\r\n\r\n public content: string | number;\r\n public fontColor: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n\r\n private font: string;\r\n\r\n public width: number;\r\n public height: number;\r\n public backgroundColor: string;\r\n\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = Math.max(metrics.width, this.width) / 2; // half-width\r\n const h = Math.max(metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent, this.height) / 2; // half-height\r\n\r\n ctx.restore();\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.fillStyle = this.backgroundColor;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n\r\n const path = this.getCachedPath();\r\n \r\n c.fill(path);\r\n if (this.outlineWidth) c.stroke(path);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.fontColor;\r\n c.textAlign = 'center';\r\n c.textBaseline = 'middle';\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ButtonOptions): this {\r\n return new Button(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n content: this.content,\r\n fontColor: this.fontColor,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n width: this.width,\r\n height: this.height,\r\n backgroundColor: this.backgroundColor,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setBackgroundColor(color: string) {\r\n this.backgroundColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontColor(color: string) {\r\n this.fontColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ButtonOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.fontColor = options?.fontColor ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.width = options?.width ?? String(this.content).length * this.fontSize + 10;\r\n this.height = options?.height ?? this.fontSize + 10;\r\n this.backgroundColor = options?.backgroundColor ?? 'rgb(204, 204, 204)';\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas } from '../canvas.ts';\r\nimport Text, { type TextOptions } from './Text.ts';\r\n\r\nexport default class Watermark extends Text {\r\n\r\n public override tags = new Set(['text', 'watermark']);\r\n\r\n public override create(options?: TextOptions): this {\r\n return new Watermark(options) as this;\r\n }\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? 'Made with TScratch';\r\n this.x = options?.x ?? -canvas.width / 2 + 5,\r\n this.y = options?.y ?? canvas.height / 2 - 5,\r\n this.align = options?.align ?? 'left',\r\n this.baseline = options?.baseline ?? 'top'\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '../canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '../Sprite.ts';\r\nimport TSCMath from '../TSCMath.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n costumes?: string[];\r\n costumeNumber?: number;\r\n width?: number;\r\n height?: number;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public discriminant = 'imagesprite';\r\n public tags = new Set(['imagesprite']);\r\n\r\n public costumes: string[];\r\n public costumeNumber: number;\r\n public width: number;\r\n public height: number;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n private imgBitmap: ImageBitmap | null = null;\r\n protected img: HTMLImageElement;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * Math.sqrt((w * cos)**2 + (h * sin)**2) * this.size;\r\n const height = 2 * Math.sqrt((w * sin)**2 + (h * cos)**2) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\nTSCMath\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.drawImage(\r\n this.imgBitmap ?? this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n if (this.outlineWidth)\r\n c.stroke(this.getCachedPath());\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ImageSpriteOptions): this {\r\n return new ImageSprite(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n costumes: this.costumes,\r\n costumeNumber: this.costumeNumber,\r\n width: this.width,\r\n height: this.height,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setCostume(costumeNumber: number) {\r\n this.costumeNumber = costumeNumber < this.costumes.length && costumeNumber >= 0\r\n ? costumeNumber\r\n : 0;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public nextCostume() {\r\n this.costumeNumber = (this.costumeNumber + 1) % this.costumes.length;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public previousCostume() {\r\n this.costumeNumber--;\r\n if (this.costumeNumber < 0) this.costumeNumber = this.costumes.length - 1;\r\n\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.costumes = options?.costumes ?? [];\r\n this.costumeNumber = options?.costumeNumber && options.costumeNumber < this.costumes.length && options.costumeNumber >= 0\r\n ? options.costumeNumber\r\n : 0;\r\n\r\n this.img = new Image();\r\n this.img.src = this.costumes[this.costumeNumber] ?? '';\r\n\r\n this.width = options?.width ?? 0;\r\n this.height = options?.height ?? 0;\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.img.onload = () => {\r\n if (!options?.width) this.width = this.img.width;\r\n if (!options?.height) this.height = this.img.height;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.draw();\r\n };\r\n }\r\n}","import { canvas } from '../../canvas.ts';\r\nimport Engine from '../../Engine.ts';\r\nimport Circle, { type CircleOptions } from '../Circle.ts';\r\nimport type { RigidBodyOptions } from './RigidBodyOptions.ts';\r\n\r\nexport interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidCircle extends Circle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['circle', 'rigidbody']);\r\n\r\n public gravity: number;\r\n public vX: number;\r\n public vY: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n\r\n public update() {\r\n\r\n const engine = Engine.init();\r\n\r\n this.vY += this.gravity;\r\n this.vY *= this.drag;\r\n this.vX *= this.drag;\r\n\r\n const x = this.x + this.vX;\r\n const y = this.y + this.vY;\r\n\r\n const localCircles = engine.sceneMap.get(this.scene)!.sprites.filter(s => s.discriminant === 'circle');\r\n const globalCircles = engine.sceneMap.get('*')!.sprites.filter(s => s.discriminant === 'circle');\r\n const circles = [...localCircles, ...globalCircles] as Circle[];\r\n\r\n const steps = Math.ceil(this.distanceTo(x, y) / (2 * this.radius));\r\n\r\n for (let i = 0; i < steps; i++) {\r\n for (const circle of circles) {\r\n if (this.distanceTo(circle.x, circle.y) < this.radius + circle.radius) {\r\n\r\n const nx = this.x - circle.x;\r\n const ny = this.y - circle.y;\r\n const dist = Math.sqrt(nx * nx + ny * ny);\r\n\r\n // Avoid division by zero\r\n if (dist === 0) continue;\r\n\r\n const nxn = nx / dist;\r\n const nyn = ny / dist;\r\n\r\n // Dot product of velocity and normal\r\n const dot = this.vX * nxn + this.vY * nyn;\r\n\r\n // Reflect velocity along normal and apply bounceLoss\r\n this.vX = (this.vX - 2 * dot * nxn) * this.bounceLoss;\r\n this.vY = (this.vY - 2 * dot * nyn) * this.bounceLoss;\r\n\r\n this.changeX(this.vX);\r\n this.changeY(this.vY);\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.goTo(x, y);\r\n\r\n // Bounce off canvas edges\r\n const cX = canvas.width / 2;\r\n const cY = canvas.height / 2;\r\n\r\n if (this.x - this.radius < -cX) {\r\n this.setX(-cX + this.radius);\r\n this.vX = Math.abs(this.vX) * this.bounceLoss;\r\n } else if (this.x + this.radius > cX) {\r\n this.setX(cX - this.radius);\r\n this.vX = -Math.abs(this.vX) * this.bounceLoss;\r\n }\r\n\r\n if (this.y - this.radius < -cY) {\r\n this.setY(-cY + this.radius);\r\n this.vY = Math.abs(this.vY) * this.bounceLoss;\r\n } else if (this.y + this.radius > cY) {\r\n this.setY(cY - this.radius);\r\n this.vY = -Math.abs(this.vY) * this.bounceLoss;\r\n }\r\n }\r\n\r\n constructor(options?: RigidCircleOptions) {\r\n super(options);\r\n\r\n this.gravity = options?.gravity ?? -1.8;\r\n this.drag = options?.drag ?? 0.96;\r\n this.bounceLoss = options?.bounceLoss ?? 0.9;\r\n this.vX = options?.vX ?? 0;\r\n this.vY = options?.vY ?? 0;\r\n }\r\n}","import { canvas } from '../../canvas.ts';\r\nimport Pen, { type PenOptions } from '../Pen.ts';\r\nimport Engine from '../../Engine.ts';\r\nimport type Object3D from './Object3D.ts';\r\nimport type { Vec2, Vec3 } from '../../types/Vectors.ts';\r\nimport TSCMath from '../../TSCMath.ts';\r\n\r\nexport interface WireframeRenderer3DOptions extends PenOptions {\r\n objects: Object3D[];\r\n}\r\n\r\nexport default class WireframeRenderer3D extends Pen {\r\n\r\n public FOV = 60;\r\n public ASPECT = canvas.width / canvas.height;\r\n public Z_NEAR = 0.01;\r\n\r\n public SPEED = 2;\r\n public SENSITIVITY = 225;\r\n\r\n public camX = 0;\r\n public camY = 0;\r\n public camZ = 0;\r\n public camDirX = 0;\r\n public camDirY = 0;\r\n public camDirZ = 0;\r\n\r\n public objects: Object3D[];\r\n\r\n constructor(options: WireframeRenderer3DOptions) {\r\n super(options);\r\n this.objects = options.objects;\r\n }\r\n\r\n // Controls\r\n public registerControls() {\r\n const engine = Engine.init();\r\n\r\n const dt = engine.deltaTime;\r\n\r\n const sinY = TSCMath.sin(this.camDirY);\r\n const cosY = TSCMath.cos(this.camDirY);\r\n\r\n if (engine.keyPressed('w')) {\r\n this.camX += this.SPEED * sinY * dt;\r\n this.camZ += this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('a')) {\r\n this.camX -= this.SPEED * cosY * dt;\r\n this.camZ += this.SPEED * sinY * dt;\r\n }\r\n if (engine.keyPressed('s')) {\r\n this.camX -= this.SPEED * sinY * dt;\r\n this.camZ -= this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('d')) {\r\n this.camX += this.SPEED * cosY * dt;\r\n this.camZ -= this.SPEED * sinY * dt;\r\n }\r\n\r\n if (engine.keyPressed('e'))\r\n this.camY += this.SPEED * dt;\r\n if (engine.keyPressed('q'))\r\n this.camY -= this.SPEED * dt;\r\n\r\n if (engine.keyPressed('up'))\r\n this.camDirX += this.SENSITIVITY * dt;\r\n if (engine.keyPressed('down'))\r\n this.camDirX -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('left'))\r\n this.camDirY -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('right'))\r\n this.camDirY += this.SENSITIVITY * dt;\r\n\r\n const maxPitch = 89;\r\n this.camDirX = Math.max(-maxPitch, Math.min(maxPitch, this.camDirX));\r\n }\r\n\r\n // Perspective projection\r\n private project(vertices: Vec3[]): Vec2[] {\r\n\r\n const f = 1 / TSCMath.tan(this.FOV / 2);\r\n\r\n return vertices.map(v => {\r\n const x = v[0];\r\n const y = v[1];\r\n const z = v[2] < this.Z_NEAR ? this.Z_NEAR : v[2];\r\n\r\n // Perspective divide for x and y\r\n const xp = canvas.width / 2 * (x * f) / (z * this.ASPECT);\r\n const yp = canvas.height / 2 * (y * f) / z;\r\n\r\n return [xp, yp];\r\n });\r\n }\r\n\r\n // Render (run every frame)\r\n public render() {\r\n const sinX = TSCMath.sin(this.camDirX);\r\n const cosX = TSCMath.cos(this.camDirX);\r\n const sinY = TSCMath.sin(this.camDirY);\r\n const cosY = TSCMath.cos(this.camDirY);\r\n const sinZ = TSCMath.sin(this.camDirZ);\r\n const cosZ = TSCMath.cos(this.camDirZ);\r\n\r\n for (const obj of this.objects) {\r\n\r\n const projected = this.project(\r\n obj.vertices.map(v => {\r\n let x = v[0] * obj.scale + obj.x - this.camX;\r\n let y = v[1] * obj.scale + obj.y - this.camY;\r\n let z = v[2] * obj.scale + obj.z - this.camZ;\r\n\r\n // Y (yaw)\r\n let x1 = x * cosY - z * sinY;\r\n let z1 = x * sinY + z * cosY;\r\n\r\n // X (pitch)\r\n let y2 = y * cosX - z1 * sinX;\r\n let z2 = y * sinX + z1 * cosX;\r\n\r\n // Z (roll)\r\n let x3 = x1 * cosZ - y2 * sinZ;\r\n let y3 = x1 * sinZ + y2 * cosZ;\r\n\r\n return [x3, y3, z2] as Vec3;\r\n })\r\n );\r\n\r\n this.color = obj.color || 'black';\r\n \r\n for (const f of obj.faces) {\r\n \r\n const [x, y] = projected[f[0]]!;\r\n this.goTo(x, y);\r\n this.down();\r\n \r\n for (const vIndex of f) {\r\n const [x, y] = projected[vIndex]!;\r\n this.goTo(x, y);\r\n }\r\n \r\n this.goTo(x, y);\r\n this.up();\r\n }\r\n }\r\n }\r\n}","import Engine from '../../Engine.ts';\r\nimport TSCMath from '../../TSCMath.ts';\r\nimport { canvas } from '../../canvas.ts';\r\nimport Pen, { type PenOptions } from '../Pen.ts';\r\nimport CustomPolygon from '../CustomPolygon.ts';\r\nimport type Object3D from './Object3D.ts';\r\nimport type { Vec2, Vec3 } from '../../types/Vectors.ts';\r\n\r\nexport interface SolidRenderer3DOptions extends PenOptions {\r\n objects: Object3D[];\r\n}\r\n\r\ntype FaceDepth = {\r\n face: number[];\r\n depth: number;\r\n};\r\n\r\nexport default class SolidRenderer3D extends Pen {\r\n\r\n public FOV = 60;\r\n public ASPECT = canvas.width / canvas.height;\r\n public Z_NEAR = 0.01;\r\n\r\n public SPEED = 2;\r\n public SENSITIVITY = 225;\r\n\r\n public AMBIENT_LIGHT_INTENSITY = 0.25;\r\n public DIRECTED_LIGHT_INTENSITY = 0.75;\r\n public DIRECTED_LIGHT_DIR: Vec3 = [0, 1, 0];\r\n\r\n public camX = 0;\r\n public camY = 0;\r\n public camZ = 0;\r\n public camDirX = 0;\r\n public camDirY = 0;\r\n public camDirZ = 0;\r\n\r\n public objects: Object3D[];\r\n\r\n constructor(options: SolidRenderer3DOptions) {\r\n super(options);\r\n this.objects = options.objects;\r\n }\r\n\r\n // Controls\r\n public registerControls() {\r\n const engine = Engine.init();\r\n\r\n const dt = engine.deltaTime;\r\n\r\n const sinY = TSCMath.sin(this.camDirY);\r\n const cosY = TSCMath.cos(this.camDirY);\r\n\r\n if (engine.keyPressed('w')) {\r\n this.camX += this.SPEED * sinY * dt;\r\n this.camZ += this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('a')) {\r\n this.camX -= this.SPEED * cosY * dt;\r\n this.camZ += this.SPEED * sinY * dt;\r\n }\r\n if (engine.keyPressed('s')) {\r\n this.camX -= this.SPEED * sinY * dt;\r\n this.camZ -= this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('d')) {\r\n this.camX += this.SPEED * cosY * dt;\r\n this.camZ -= this.SPEED * sinY * dt;\r\n }\r\n\r\n if (engine.keyPressed('e'))\r\n this.camY += this.SPEED * dt;\r\n if (engine.keyPressed('q'))\r\n this.camY -= this.SPEED * dt;\r\n\r\n if (engine.keyPressed('up'))\r\n this.camDirX += this.SENSITIVITY * dt;\r\n if (engine.keyPressed('down'))\r\n this.camDirX -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('left'))\r\n this.camDirY -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('right'))\r\n this.camDirY += this.SENSITIVITY * dt;\r\n\r\n const maxPitch = 89;\r\n this.camDirX = Math.max(-maxPitch, Math.min(maxPitch, this.camDirX));\r\n }\r\n\r\n // Perspective projection\r\n private project(vertices: Vec3[]): Vec2[] {\r\n\r\n const f = 1 / TSCMath.tan(this.FOV / 2);\r\n\r\n return vertices.map(v => {\r\n const x = v[0];\r\n const y = v[1];\r\n const z = v[2] < this.Z_NEAR ? this.Z_NEAR : v[2];\r\n\r\n // Perspective divide for x and y\r\n const xp = canvas.width / 2 * (x * f) / (z * this.ASPECT);\r\n const yp = canvas.height / 2 * (y * f) / z;\r\n\r\n return [xp, yp];\r\n });\r\n }\r\n\r\n // Render (run every frame)\r\n public render() {\r\n const sinX = TSCMath.sin(this.camDirX);\r\n const cosX = TSCMath.cos(this.camDirX);\r\n const sinY = TSCMath.sin(this.camDirY);\r\n const cosY = TSCMath.cos(this.camDirY);\r\n const sinZ = TSCMath.sin(this.camDirZ);\r\n const cosZ = TSCMath.cos(this.camDirZ);\r\n\r\n // Calculate the lighting normal relative to the cameras rotation\r\n let lx = this.DIRECTED_LIGHT_DIR[0];\r\n let ly = this.DIRECTED_LIGHT_DIR[1];\r\n let lz = this.DIRECTED_LIGHT_DIR[2];\r\n\r\n // yaw\r\n const lx1 = lx * cosY - lz * sinY;\r\n const lz1 = lx * sinY + lz * cosY;\r\n\r\n // pitch\r\n const ly2 = ly * cosX - lz1 * sinX;\r\n const lz2 = ly * sinX + lz1 * cosX;\r\n\r\n // roll\r\n const lx3 = lx1 * cosZ - ly2 * sinZ;\r\n const ly3 = lx1 * sinZ + ly2 * cosZ;\r\n\r\n const lightDir = TSCMath.normalize([lx3, ly3, lz2]);\r\n\r\n for (const obj of this.objects) {\r\n\r\n const { h, s, l } = this.stringToHSL(obj.color || 'black');\r\n\r\n // Camera relative vertices\r\n const cameraVerts: Vec3[] = obj.vertices.map(v => {\r\n let x = v[0] * obj.scale + obj.x - this.camX;\r\n let y = v[1] * obj.scale + obj.y - this.camY;\r\n let z = v[2] * obj.scale + obj.z - this.camZ;\r\n\r\n // yaw (Y)\r\n const x1 = x * cosY - z * sinY;\r\n const z1 = x * sinY + z * cosY;\r\n\r\n // pitch (X)\r\n const y2 = y * cosX - z1 * sinX;\r\n const z2 = y * sinX + z1 * cosX;\r\n\r\n // roll (Z)\r\n const x3 = x1 * cosZ - y2 * sinZ;\r\n const y3 = x1 * sinZ + y2 * cosZ;\r\n\r\n return [x3, y3, z2];\r\n });\r\n\r\n // Face depth calculation\r\n const faces: FaceDepth[] = obj.faces.map(face => {\r\n let z = 0;\r\n for (const i of face) z += cameraVerts[i]![2];\r\n return { face, depth: z / face.length };\r\n });\r\n\r\n // Painter's algorithm (face sorting)\r\n faces.sort((a, b) => b.depth - a.depth);\r\n\r\n const projected = this.project(cameraVerts);\r\n\r\n // Render faces\r\n for (const { face } of faces) {\r\n\r\n // Calculate face normal using Newell's method (works for polygons with any number of vertices)\r\n let nx = 0, ny = 0, nz = 0;\r\n for (let i = 0; i < face.length; i++) {\r\n const v1 = cameraVerts[face[i]!]!;\r\n const v2 = cameraVerts[face[(i + 1) % face.length]!]!;\r\n nx += (v1[1] - v2[1]) * (v1[2] + v2[2]);\r\n ny += (v1[2] - v2[2]) * (v1[0] + v2[0]);\r\n nz += (v1[0] - v2[0]) * (v1[1] + v2[1]);\r\n }\r\n const normal = TSCMath.normalize([nx, ny, nz] as Vec3);\r\n\r\n // Calculate lighting: dot product between normal and light direction\r\n const diffuse = Math.max(0, TSCMath.dot(normal, lightDir));\r\n const brightness =\r\n this.AMBIENT_LIGHT_INTENSITY +\r\n diffuse * this.DIRECTED_LIGHT_INTENSITY;\r\n\r\n // Adjust the brightness\r\n const litL = Math.min(100, Math.max(5, l + brightness * 50));\r\n const color = `hsl(${h}, ${s}%, ${litL}%)`;\r\n\r\n // Draw the polygon\r\n const vertices = face.map(vIndex => projected[vIndex]!);\r\n this.drawSprite(new CustomPolygon({ vertices, color }));\r\n }\r\n }\r\n }\r\n\r\n public stringToHSL(color: string) {\r\n\r\n // String to RGB\r\n const el = document.createElement('div');\r\n el.style.color = color;\r\n\r\n document.body.appendChild(el);\r\n const rgb = getComputedStyle(el).color;\r\n document.body.removeChild(el);\r\n\r\n let [r, g, b] = rgb.match(/\\d+/g)!.map(Number) as [number, number, number];\r\n\r\n // RGB to HSL\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h = 0;\r\n let s = 0;\r\n let l = (max + min) / 2;\r\n\r\n if (max === min)\r\n h = s = 0; // achromatic\r\n else {\r\n const d = max - min;\r\n s = l > 0.5\r\n ? d / (2 - max - min)\r\n : d / (max + min);\r\n\r\n switch (max) {\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n }\r\n h *= 60;\r\n }\r\n\r\n return { h, s: s * 100, l: l * 100 };\r\n }\r\n}","import TSCMath from '../../TSCMath.ts';\r\nimport type { Vec3 } from '../../types/Vectors.ts';\r\n\r\nexport interface Object3DOptions {\r\n vertices: Vec3[];\r\n faces: [number, number, ...number[]][];\r\n\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n\r\n rotX?: number;\r\n rotY?: number;\r\n rotZ?: number;\r\n\r\n color?: string;\r\n\r\n scale?: number;\r\n}\r\n\r\nexport default class Object3D {\r\n\r\n public x: number;\r\n public y: number;\r\n public z: number;\r\n\r\n public rotX: number;\r\n public rotY: number;\r\n public rotZ: number;\r\n\r\n public color: string;\r\n\r\n public scale: number;\r\n\r\n public vertices: Vec3[];\r\n public faces: [number, number, ...number[]][];\r\n\r\n constructor(options: Object3DOptions) {\r\n this.vertices = options.vertices;\r\n this.faces = options.faces;\r\n\r\n this.x = options.x ?? 0;\r\n this.y = options.y ?? 0;\r\n this.z = options.z ?? 2;\r\n\r\n this.rotX = options.rotX ?? 0;\r\n this.rotY = options.rotY ?? 0;\r\n this.rotZ = options.rotZ ?? 0;\r\n\r\n this.color = options.color ?? 'black';\r\n\r\n this.scale = options.scale ?? 1;\r\n }\r\n\r\n public rotateX(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [_, y, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![1] = y * cos - z * sin;\r\n this.vertices[i]![2] = y * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateY(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, _, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos + z * sin;\r\n this.vertices[i]![2] = -x * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateZ(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, y, _] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos - y * sin;\r\n this.vertices[i]![1] = x * sin + y * cos;\r\n }\r\n }\r\n\r\n public pointX(deg: number) {\r\n const delta = deg - this.rotX;\r\n this.rotX = deg;\r\n this.rotateX(delta);\r\n }\r\n\r\n public pointY(deg: number) {\r\n const delta = deg - this.rotY;\r\n this.rotY = deg;\r\n this.rotateY(delta);\r\n }\r\n\r\n public pointZ(deg: number) {\r\n const delta = deg - this.rotZ;\r\n this.rotZ = deg;\r\n this.rotateZ(delta);\r\n }\r\n\r\n // Parses an .obj file\r\n public static loadObj(data: string) {\r\n\r\n const lines = data.split('\\n');\r\n\r\n // Vertices\r\n const vertices = lines\r\n .filter(l => l.startsWith('v '))\r\n .map(l => l.split(' ').slice(1).map(parseFloat)) as Vec3[];\r\n\r\n // Faces\r\n const faces = lines\r\n .filter(l => l.startsWith('f '))\r\n .map(l => l.split(' ').slice(1).map(\r\n f => parseInt(f.split('/')[0]!) - 1\r\n )) as [number, number, ...number[]][];\r\n\r\n return { vertices, faces };\r\n }\r\n}","export const tetrahedronFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2],\r\n [0, 3, 1],\r\n [0, 2, 3],\r\n [1, 3, 2]\r\n];\r\n\r\nexport default tetrahedronFaces;","import type { Vec3 } from '../../../types/Vectors.ts';\r\n\r\nexport const tetrahedronVertices: Vec3[] = [\r\n [ 1, 1, 1],\r\n [-1, -1, 1],\r\n [-1, 1, -1],\r\n [ 1, -1, -1]\r\n];\r\n\r\nexport default tetrahedronVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport tetrahedronFaces from './faces/tetrahedron.ts';\r\nimport tetrahedronVertices from './vertices/tetrahedron.ts';\r\n\r\nexport default class Tetrahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: tetrahedronVertices,\r\n faces: tetrahedronFaces\r\n });\r\n }\r\n}","const cuboidFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2, 3],\r\n [4, 5, 6, 7],\r\n [3, 2, 6, 7],\r\n [0, 1, 5, 4],\r\n [0, 3, 7, 4],\r\n [1, 2, 6, 5]\r\n];\r\n\r\nexport default cuboidFaces;","import type { Vec3 } from '../../../../types/Vectors.ts';\r\n\r\nexport default function getCuboidVertices(width: number, height: number, length: number): Vec3[] {\r\n\r\n return [\r\n // Bottom\r\n [-0.5 * width, -0.5 * height, -0.5 * length],\r\n [0.5 * width, -0.5 * height, -0.5 * length],\r\n [0.5 * width, -0.5 * height, 0.5 * length],\r\n [-0.5 * width, -0.5 * height, 0.5 * length],\r\n // Top\r\n [-0.5 * width, 0.5 * height, -0.5 * length],\r\n [0.5 * width, 0.5 * height, -0.5 * length],\r\n [0.5 * width, 0.5 * height, 0.5 * length],\r\n [-0.5 * width, 0.5 * height, 0.5 * length]\r\n ];\r\n}","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport cuboidFaces from './faces/cuboid.ts';\r\nimport getCuboidVertices from './vertices/cuboid.ts';\r\n\r\nexport default class Cube extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: getCuboidVertices(1, 1, 1),\r\n faces: cuboidFaces\r\n });\r\n }\r\n}","export const octahedronFaces: [number, number, ...number[]][] = [\r\n [0, 2, 4],\r\n [2, 1, 4],\r\n [1, 3, 4],\r\n [3, 0, 4],\r\n\r\n [2, 0, 5],\r\n [1, 2, 5],\r\n [3, 1, 5],\r\n [0, 3, 5]\r\n];\r\n\r\nexport default octahedronFaces;","import type { Vec3 } from '../../../types/Vectors.ts';\r\n\r\nexport const octahedronVerticesVertices: Vec3[] = [\r\n [ 1, 0, 0],\r\n [-1, 0, 0],\r\n [ 0, 1, 0],\r\n [ 0, -1, 0],\r\n [ 0, 0, 1],\r\n [ 0, 0, -1]\r\n];\r\n\r\nexport default octahedronVerticesVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport octahedronFaces from './faces/octahedron.ts';\r\nimport octahedronVertices from './vertices/octahedron.ts';\r\n\r\nexport default class Octahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: octahedronVertices,\r\n faces: octahedronFaces\r\n });\r\n }\r\n}","const icosahedronFaces: [number, number, number][] = [\r\n [0, 4, 8], [0, 8, 9], [0, 9, 6], [0, 6, 1], [0, 1, 4],\r\n [3, 10, 5], [3, 5, 2], [3, 2, 7], [3, 7, 11], [3, 11, 10],\r\n [4, 1, 6], [4, 6, 9],\r\n [8, 4, 10], [8, 10, 5], \r\n [9, 8, 2], [9, 2, 7], \r\n [6, 9, 7], [6, 7, 11],\r\n [1, 6, 11], [1, 11, 10] \r\n];\r\n\r\nexport default icosahedronFaces;","import type { Vec3 } from '../../../../types/Vectors.ts';\r\n\r\nconst phi = (1 + Math.sqrt(5)) / 2;\r\nconst a = 0.5 / phi;\r\nconst b = 0.5;\r\n\r\nconst icosahedronVertices: Vec3[] = [\r\n // (0, ±1, ±φ)\r\n [0, -b, -a * phi], [0, -b, a * phi], [0, b, -a * phi], [0, b, a * phi],\r\n // (±1, ±φ, 0)\r\n [-b, -a * phi, 0], [-b, a * phi, 0], [b, -a * phi, 0], [b, a * phi, 0],\r\n // (±φ, 0, ±1)\r\n [-a * phi, 0, -b], [a * phi, 0, -b], [-a * phi, 0, b], [a * phi, 0, b]\r\n];\r\n\r\nexport default icosahedronVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport icosahedronFaces from './faces/icosahedron.ts';\r\nimport icosahedronVertices from './vertices/icosahedron.ts';\r\n\r\nexport default class Icosahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: icosahedronVertices,\r\n faces: icosahedronFaces\r\n });\r\n }\r\n}","const icosphereFaces: [number, number, number][] = [\r\n [0, 13, 12], [1, 13, 15], [0, 12, 17], [0, 17, 19], [0, 19, 16],\r\n [1, 15, 22], [2, 14, 24], [3, 18, 26], [4, 20, 28], [5, 21, 30],\r\n [1, 22, 25], [2, 24, 27], [3, 26, 29], [4, 28, 31], [5, 30, 23],\r\n [6, 32, 37], [7, 33, 39], [8, 34, 40], [9, 35, 41], [10, 36, 38],\r\n [38, 41, 11], [38, 36, 41], [36, 9, 41], [41, 40, 11], [41, 35, 40],\r\n [35, 8, 40], [40, 39, 11], [40, 34, 39], [34, 7, 39], [39, 37, 11],\r\n [39, 33, 37], [33, 6, 37], [37, 38, 11], [37, 32, 38], [32, 10, 38],\r\n [23, 36, 10], [23, 30, 36], [30, 9, 36], [31, 35, 9], [31, 28, 35],\r\n [28, 8, 35], [29, 34, 8], [29, 26, 34], [26, 7, 34], [27, 33, 7],\r\n [27, 24, 33], [24, 6, 33], [25, 32, 6], [25, 22, 32], [22, 10, 32],\r\n [30, 31, 9], [30, 21, 31], [21, 4, 31], [28, 29, 8], [28, 20, 29],\r\n [20, 3, 29], [26, 27, 7], [26, 18, 27], [18, 2, 27], [24, 25, 6],\r\n [24, 14, 25], [14, 1, 25], [22, 23, 10], [22, 15, 23], [15, 5, 23],\r\n [16, 21, 5], [16, 19, 21], [19, 4, 21], [19, 20, 4], [19, 17, 20],\r\n [17, 3, 20], [17, 18, 3], [17, 12, 18], [12, 2, 18], [15, 16, 5],\r\n [15, 13, 16], [13, 0, 16], [12, 14, 2], [12, 13, 14], [13, 1, 14]\r\n];\r\n\r\nexport default icosphereFaces;","import type { Vec3 } from '../../../../types/Vectors.ts';\r\n\r\nconst icosphereVertices: Vec3[] = [\r\n [0.000000, -1.000000, 0.000000], [0.723607, -0.447220, 0.525725], [-0.276388, -0.447220, 0.850649],\r\n [-0.894426, -0.447216, 0.000000], [-0.276388, -0.447220, -0.850649], [0.723607, -0.447220, -0.525725],\r\n [0.276388, 0.447220, 0.850649], [-0.723607, 0.447220, 0.525725], [-0.723607, 0.447220, -0.525725],\r\n [0.276388, 0.447220, -0.850649], [0.894426, 0.447216, 0.000000], [0.000000, 1.000000, 0.000000],\r\n [-0.162456, -0.850654, 0.499995], [0.425323, -0.850654, 0.309011], [0.262869, -0.525738, 0.809012],\r\n [0.850648, -0.525736, 0.000000], [0.425323, -0.850654, -0.309011], [-0.525730, -0.850652, 0.000000],\r\n [-0.688189, -0.525736, 0.499997], [-0.162456, -0.850654, -0.499995], [-0.688189, -0.525736, -0.499997],\r\n [0.262869, -0.525738, -0.809012], [0.951058, 0.000000, 0.309013], [0.951058, 0.000000, -0.309013],\r\n [0.000000, 0.000000, 1.000000], [0.587786, 0.000000, 0.809017], [-0.951058, 0.000000, 0.309013],\r\n [-0.587786, 0.000000, 0.809017], [-0.587786, 0.000000, -0.809017], [-0.951058, 0.000000, -0.309013],\r\n [0.587786, 0.000000, -0.809017], [0.000000, 0.000000, -1.000000], [0.688189, 0.525736, 0.499997],\r\n [-0.262869, 0.525738, 0.809012], [-0.850648, 0.525736, 0.000000], [-0.262869, 0.525738, -0.809012],\r\n [0.688189, 0.525736, -0.499997], [0.162456, 0.850654, 0.499995], [0.525730, 0.850652, 0.000000],\r\n [-0.425323, 0.850654, 0.309011], [-0.425323, 0.850654, -0.309011], [0.162456, 0.850654, -0.499995]\r\n];\r\n\r\nexport default icosphereVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport icosphereFaces from './faces/icosphere.ts';\r\nimport icosphereVertices from './vertices/icosphere.ts';\r\n\r\nexport default class Icosphere extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: icosphereVertices,\r\n faces: icosphereFaces\r\n });\r\n }\r\n}","const monkeyFaces: [number, number, ...number[]][] = [\r\n [46,0,2,44],[3,1,47,45],[44,2,4,42],\r\n [5,3,45,43],[2,8,6,4],[7,9,3,5],\r\n [0,10,8,2],[9,11,1,3],[10,12,14,8],\r\n [15,13,11,9],[8,14,16,6],[17,15,9,7],\r\n [14,20,18,16],[19,21,15,17],[12,22,20,14],\r\n [21,23,13,15],[22,24,26,20],[27,25,23,21],\r\n [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]\r\n]\r\n\r\nexport default monkeyFaces;","import type { Vec3 } from '../../../../types/Vectors.ts';\r\n\r\nconst monkeyVertices: Vec3[] = [\r\n [0.4375,0.164062,0.765625],\r\n [-0.4375,0.164062,0.765625],\r\n [0.5,0.09375,0.6875],\r\n [-0.5,0.09375,0.6875],\r\n [0.546875,0.054688,0.578125],\r\n [-0.546875,0.054688,0.578125],\r\n [0.351562,-0.023438,0.617188],\r\n [-0.351562,-0.023438,0.617188],\r\n [0.351562,0.03125,0.71875],\r\n [-0.351562,0.03125,0.71875],\r\n [0.351562,0.132812,0.78125],\r\n [-0.351562,0.132812,0.78125],\r\n [0.273438,0.164062,0.796875],\r\n [-0.273438,0.164062,0.796875],\r\n [0.203125,0.09375,0.742188],\r\n [-0.203125,0.09375,0.742188],\r\n [0.15625,0.054688,0.648438],\r\n [-0.15625,0.054688,0.648438],\r\n [0.078125,0.242188,0.65625],\r\n [-0.078125,0.242188,0.65625],\r\n [0.140625,0.242188,0.742188],\r\n [-0.140625,0.242188,0.742188],\r\n [0.242188,0.242188,0.796875],\r\n [-0.242188,0.242188,0.796875],\r\n [0.273438,0.328125,0.796875],\r\n [-0.273438,0.328125,0.796875],\r\n [0.203125,0.390625,0.742188],\r\n [-0.203125,0.390625,0.742188]\r\n ,[0.15625,0.4375,0.648438],[-0.15625,0.4375,0.648438],[0.351562,0.515625,0.617188],\r\n [-0.351562,0.515625,0.617188],[0.351562,0.453125,0.71875],[-0.351562,0.453125,0.71875],\r\n [0.351562,0.359375,0.78125],[-0.351562,0.359375,0.78125],[0.4375,0.328125,0.765625],\r\n [-0.4375,0.328125,0.765625],[0.5,0.390625,0.6875],[-0.5,0.390625,0.6875],\r\n [0.546875,0.4375,0.578125],[-0.546875,0.4375,0.578125],[0.625,0.242188,0.5625],\r\n [-0.625,0.242188,0.5625],[0.5625,0.242188,0.671875],[-0.5625,0.242188,0.671875],\r\n [0.46875,0.242188,0.757812],[-0.46875,0.242188,0.757812],[0.476562,0.242188,0.773438],\r\n [-0.476562,0.242188,0.773438],[0.445312,0.335938,0.78125],[-0.445312,0.335938,0.78125],\r\n [0.351562,0.375,0.804688],[-0.351562,0.375,0.804688],[0.265625,0.335938,0.820312],\r\n [-0.265625,0.335938,0.820312],[0.226562,0.242188,0.820312],[-0.226562,0.242188,0.820312],\r\n [0.265625,0.15625,0.820312],[-0.265625,0.15625,0.820312],[0.351562,0.242188,0.828125],\r\n [-0.351562,0.242188,0.828125],[0.351562,0.117188,0.804688],[-0.351562,0.117188,0.804688],\r\n [0.445312,0.15625,0.78125],[-0.445312,0.15625,0.78125],[0,0.429688,0.742188],[0,0.351562,0.820312],\r\n [0,-0.679688,0.734375],[0,-0.320312,0.78125],[0,-0.1875,0.796875],[0,-0.773438,0.71875],[0,0.40625,0.601562],[0,0.570312,0.570312],[0,0.898438,-0.546875],[0,0.5625,-0.851562],[0,0.070312,-0.828125],[0,-0.382812,-0.351562],[0.203125,-0.1875,0.5625],[-0.203125,-0.1875,0.5625],[0.3125,-0.4375,0.570312],[-0.3125,-0.4375,0.570312],[0.351562,-0.695312,0.570312],[-0.351562,-0.695312,0.570312],[0.367188,-0.890625,0.53125],[-0.367188,-0.890625,0.53125],[0.328125,-0.945312,0.523438],[-0.328125,-0.945312,0.523438],[0.179688,-0.96875,0.554688],[-0.179688,-0.96875,0.554688],[0,-0.984375,0.578125],[0.4375,-0.140625,0.53125],[-0.4375,-0.140625,0.53125],[0.632812,-0.039062,0.539062],[-0.632812,-0.039062,0.539062],[0.828125,0.148438,0.445312],[-0.828125,0.148438,0.445312],[0.859375,0.429688,0.59375],[-0.859375,0.429688,0.59375],[0.710938,0.484375,0.625],[-0.710938,0.484375,0.625],[0.492188,0.601562,0.6875],[-0.492188,0.601562,0.6875],[0.320312,0.757812,0.734375],[-0.320312,0.757812,0.734375],[0.15625,0.71875,0.757812],[-0.15625,0.71875,0.757812],[0.0625,0.492188,0.75],[-0.0625,0.492188,0.75],[0.164062,0.414062,0.773438],[-0.164062,0.414062,0.773438],[0.125,0.304688,0.765625],[-0.125,0.304688,0.765625],[0.203125,0.09375,0.742188],[-0.203125,0.09375,0.742188],[0.375,0.015625,0.703125],[-0.375,0.015625,0.703125],[0.492188,0.0625,0.671875],[-0.492188,0.0625,0.671875],[0.625,0.1875,0.648438],[-0.625,0.1875,0.648438],[0.640625,0.296875,0.648438],[-0.640625,0.296875,0.648438],[0.601562,0.375,0.664062],[-0.601562,0.375,0.664062],[0.429688,0.4375,0.71875],[-0.429688,0.4375,0.71875],[0.25,0.46875,0.757812],[-0.25,0.46875,0.757812],[0,-0.765625,0.734375],[0.109375,-0.71875,0.734375],[-0.109375,-0.71875,0.734375],[0.117188,-0.835938,0.710938],[-0.117188,-0.835938,0.710938],[0.0625,-0.882812,0.695312],[-0.0625,-0.882812,0.695312],[0,-0.890625,0.6875],[0,-0.195312,0.75],[0,-0.140625,0.742188],[0.101562,-0.148438,0.742188],[-0.101562,-0.148438,0.742188],[0.125,-0.226562,0.75],[-0.125,-0.226562,0.75],[0.085938,-0.289062,0.742188],[-0.085938,-0.289062,0.742188],[0.398438,-0.046875,0.671875],[-0.398438,-0.046875,0.671875],[0.617188,0.054688,0.625],[-0.617188,0.054688,0.625],[0.726562,0.203125,0.601562],[-0.726562,0.203125,0.601562],[0.742188,0.375,0.65625],[-0.742188,0.375,0.65625],[0.6875,0.414062,0.726562],[-0.6875,0.414062,0.726562],[0.4375,0.546875,0.796875],[-0.4375,0.546875,0.796875],[0.3125,0.640625,0.835938],[-0.3125,0.640625,0.835938],[0.203125,0.617188,0.851562],[-0.203125,0.617188,0.851562],[0.101562,0.429688,0.84375],[-0.101562,0.429688,0.84375],[0.125,-0.101562,0.8125],[-0.125,-0.101562,0.8125],[0.210938,-0.445312,0.710938],[-0.210938,-0.445312,0.710938],[0.25,-0.703125,0.6875],[-0.25,-0.703125,0.6875],[0.265625,-0.820312,0.664062],[-0.265625,-0.820312,0.664062],[0.234375,-0.914062,0.632812],[-0.234375,-0.914062,0.632812],[0.164062,-0.929688,0.632812],[-0.164062,-0.929688,0.632812],[0,-0.945312,0.640625],[0,0.046875,0.726562],[0,0.210938,0.765625],[0.328125,0.476562,0.742188],[-0.328125,0.476562,0.742188],[0.164062,0.140625,0.75],[-0.164062,0.140625,0.75],[0.132812,0.210938,0.757812],[-0.132812,0.210938,0.757812],[0.117188,-0.6875,0.734375],[-0.117188,-0.6875,0.734375],[0.078125,-0.445312,0.75],[-0.078125,-0.445312,0.75],[0,-0.445312,0.75],[0,-0.328125,0.742188],[0.09375,-0.273438,0.78125],[-0.09375,-0.273438,0.78125],[0.132812,-0.226562,0.796875],[-0.132812,-0.226562,0.796875],[0.109375,-0.132812,0.78125],[-0.109375,-0.132812,0.78125],[0.039062,-0.125,0.78125],[-0.039062,-0.125,0.78125],[0,-0.203125,0.828125],[0.046875,-0.148438,0.8125],[-0.046875,-0.148438,0.8125],[0.09375,-0.15625,0.8125],[-0.09375,-0.15625,0.8125],[0.109375,-0.226562,0.828125],[-0.109375,-0.226562,0.828125],[0.078125,-0.25,0.804688],[-0.078125,-0.25,0.804688],[0,-0.289062,0.804688],[0.257812,-0.3125,0.554688],[-0.257812,-0.3125,0.554688],[0.164062,-0.242188,0.710938],[-0.164062,-0.242188,0.710938],[0.179688,-0.3125,0.710938],[-0.179688,-0.3125,0.710938],[0.234375,-0.25,0.554688],[-0.234375,-0.25,0.554688],[0,-0.875,0.6875],[0.046875,-0.867188,0.6875],[-0.046875,-0.867188,0.6875],[0.09375,-0.820312,0.710938],[-0.09375,-0.820312,0.710938],[0.09375,-0.742188,0.726562],[-0.09375,-0.742188,0.726562],[0,-0.78125,0.65625],[0.09375,-0.75,0.664062],[-0.09375,-0.75,0.664062],[0.09375,-0.8125,0.640625],[-0.09375,-0.8125,0.640625],[0.046875,-0.851562,0.632812],[-0.046875,-0.851562,0.632812],[0,-0.859375,0.632812],[0.171875,0.21875,0.78125],[-0.171875,0.21875,0.78125],[0.1875,0.15625,0.773438],[-0.1875,0.15625,0.773438],[0.335938,0.429688,0.757812],[-0.335938,0.429688,0.757812],[0.273438,0.421875,0.773438],[-0.273438,0.421875,0.773438],[0.421875,0.398438,0.773438],[-0.421875,0.398438,0.773438],[0.5625,0.351562,0.695312],[-0.5625,0.351562,0.695312],[0.585938,0.289062,0.6875],[-0.585938,0.289062,0.6875],[0.578125,0.195312,0.679688],[-0.578125,0.195312,0.679688],[0.476562,0.101562,0.71875],[-0.476562,0.101562,0.71875],[0.375,0.0625,0.742188],[-0.375,0.0625,0.742188],[0.226562,0.109375,0.78125],[-0.226562,0.109375,0.78125],[0.179688,0.296875,0.78125],[-0.179688,0.296875,0.78125],[0.210938,0.375,0.78125],[-0.210938,0.375,0.78125],[0.234375,0.359375,0.757812],[-0.234375,0.359375,0.757812],[0.195312,0.296875,0.757812],[-0.195312,0.296875,0.757812],[0.242188,0.125,0.757812],[-0.242188,0.125,0.757812],[0.375,0.085938,0.726562],[-0.375,0.085938,0.726562],[0.460938,0.117188,0.703125],[-0.460938,0.117188,0.703125],[0.546875,0.210938,0.671875],[-0.546875,0.210938,0.671875],[0.554688,0.28125,0.671875],[-0.554688,0.28125,0.671875],[0.53125,0.335938,0.679688],[-0.53125,0.335938,0.679688],[0.414062,0.390625,0.75],[-0.414062,0.390625,0.75],[0.28125,0.398438,0.765625],[-0.28125,0.398438,0.765625],[0.335938,0.40625,0.75],[-0.335938,0.40625,0.75],[0.203125,0.171875,0.75],[-0.203125,0.171875,0.75],[0.195312,0.226562,0.75],[-0.195312,0.226562,0.75],[0.109375,0.460938,0.609375],[-0.109375,0.460938,0.609375],[0.195312,0.664062,0.617188],[-0.195312,0.664062,0.617188],[0.335938,0.6875,0.59375],[-0.335938,0.6875,0.59375],[0.484375,0.554688,0.554688],[-0.484375,0.554688,0.554688],[0.679688,0.453125,0.492188],[-0.679688,0.453125,0.492188],[0.796875,0.40625,0.460938],[-0.796875,0.40625,0.460938],[0.773438,0.164062,0.375],[-0.773438,0.164062,0.375],[0.601562,0,0.414062],[-0.601562,0,0.414062],[0.4375,-0.09375,0.46875],[-0.4375,-0.09375,0.46875],[0,0.898438,0.289062],[0,0.984375,-0.078125],[0,-0.195312,-0.671875],[0,-0.460938,0.1875],[0,-0.976562,0.460938],[0,-0.804688,0.34375],[0,-0.570312,0.320312],[0,-0.484375,0.28125],[0.851562,0.234375,0.054688],[-0.851562,0.234375,0.054688],[0.859375,0.320312,-0.046875],[-0.859375,0.320312,-0.046875],[0.773438,0.265625,-0.4375],[-0.773438,0.265625,-0.4375],[0.460938,0.4375,-0.703125],[-0.460938,0.4375,-0.703125],[0.734375,-0.046875,0.070312],[-0.734375,-0.046875,0.070312],[0.59375,-0.125,-0.164062],[-0.59375,-0.125,-0.164062],[0.640625,-0.007812,-0.429688],[-0.640625,-0.007812,-0.429688],[0.335938,0.054688,-0.664062],[-0.335938,0.054688,-0.664062],[0.234375,-0.351562,0.40625],[-0.234375,-0.351562,0.40625],[0.179688,-0.414062,0.257812],[-0.179688,-0.414062,0.257812],[0.289062,-0.710938,0.382812],[-0.289062,-0.710938,0.382812],[0.25,-0.5,0.390625],[-0.25,-0.5,0.390625],[0.328125,-0.914062,0.398438],[-0.328125,-0.914062,0.398438],[0.140625,-0.757812,0.367188],[-0.140625,-0.757812,0.367188],[0.125,-0.539062,0.359375],[-0.125,-0.539062,0.359375],[0.164062,-0.945312,0.4375],[-0.164062,-0.945312,0.4375],[0.21875,-0.28125,0.429688],[-0.21875,-0.28125,0.429688],[0.210938,-0.226562,0.46875],[-0.210938,-0.226562,0.46875],[0.203125,-0.171875,0.5],[-0.203125,-0.171875,0.5],[0.210938,-0.390625,0.164062],[-0.210938,-0.390625,0.164062],[0.296875,-0.3125,-0.265625],[-0.296875,-0.3125,-0.265625],[0.34375,-0.148438,-0.539062],[-0.34375,-0.148438,-0.539062],[0.453125,0.867188,-0.382812],[-0.453125,0.867188,-0.382812],[0.453125,0.929688,-0.070312],[-0.453125,0.929688,-0.070312],[0.453125,0.851562,0.234375],[-0.453125,0.851562,0.234375],[0.460938,0.523438,0.429688],[-0.460938,0.523438,0.429688],[0.726562,0.40625,0.335938],[-0.726562,0.40625,0.335938],[0.632812,0.453125,0.28125],[-0.632812,0.453125,0.28125],[0.640625,0.703125,0.054688],[-0.640625,0.703125,0.054688],[0.796875,0.5625,0.125],[-0.796875,0.5625,0.125],[0.796875,0.617188,-0.117188],[-0.796875,0.617188,-0.117188],[0.640625,0.75,-0.195312],[-0.640625,0.75,-0.195312],[0.640625,0.679688,-0.445312],[-0.640625,0.679688,-0.445312],[0.796875,0.539062,-0.359375],[-0.796875,0.539062,-0.359375],[0.617188,0.328125,-0.585938],[-0.617188,0.328125,-0.585938],[0.484375,0.023438,-0.546875],[-0.484375,0.023438,-0.546875],[0.820312,0.328125,-0.203125],[-0.820312,0.328125,-0.203125],[0.40625,-0.171875,0.148438],[-0.40625,-0.171875,0.148438],[0.429688,-0.195312,-0.210938],[-0.429688,-0.195312,-0.210938],[0.890625,0.40625,-0.234375],[-0.890625,0.40625,-0.234375],[0.773438,-0.140625,-0.125],[-0.773438,-0.140625,-0.125],[1.039062,-0.101562,-0.328125],[-1.039062,-0.101562,-0.328125],[1.28125,0.054688,-0.429688],[-1.28125,0.054688,-0.429688],[1.351562,0.320312,-0.421875],[-1.351562,0.320312,-0.421875],[1.234375,0.507812,-0.421875],[-1.234375,0.507812,-0.421875],[1.023438,0.476562,-0.3125],[-1.023438,0.476562,-0.3125],[1.015625,0.414062,-0.289062],[-1.015625,0.414062,-0.289062],[1.1875,0.4375,-0.390625],[-1.1875,0.4375,-0.390625],[1.265625,0.289062,-0.40625],[-1.265625,0.289062,-0.40625],[1.210938,0.078125,-0.40625],[-1.210938,0.078125,-0.40625],[1.03125,-0.039062,-0.304688],[-1.03125,-0.039062,-0.304688],[0.828125,-0.070312,-0.132812],[-0.828125,-0.070312,-0.132812],[0.921875,0.359375,-0.21875],[-0.921875,0.359375,-0.21875],[0.945312,0.304688,-0.289062],[-0.945312,0.304688,-0.289062],[0.882812,-0.023438,-0.210938],[-0.882812,-0.023438,-0.210938],[1.039062,0,-0.367188],[-1.039062,0,-0.367188],[1.1875,0.09375,-0.445312],[-1.1875,0.09375,-0.445312],[1.234375,0.25,-0.445312],[-1.234375,0.25,-0.445312],[1.171875,0.359375,-0.4375],[-1.171875,0.359375,-0.4375],[1.023438,0.34375,-0.359375],[-1.023438,0.34375,-0.359375],[0.84375,0.289062,-0.210938],[-0.84375,0.289062,-0.210938],[0.835938,0.171875,-0.273438],[-0.835938,0.171875,-0.273438],[0.757812,0.09375,-0.273438],[-0.757812,0.09375,-0.273438],[0.820312,0.085938,-0.273438],[-0.820312,0.085938,-0.273438],[0.84375,0.015625,-0.273438],[-0.84375,0.015625,-0.273438],[0.8125,-0.015625,-0.273438],[-0.8125,-0.015625,-0.273438],[0.726562,0,-0.070312],[-0.726562,0,-0.070312],[0.71875,-0.023438,-0.171875],[-0.71875,-0.023438,-0.171875],[0.71875,0.039062,-0.1875],[-0.71875,0.039062,-0.1875],[0.796875,0.203125,-0.210938],[-0.796875,0.203125,-0.210938],[0.890625,0.242188,-0.265625],[-0.890625,0.242188,-0.265625],[0.890625,0.234375,-0.320312],[-0.890625,0.234375,-0.320312],[0.8125,-0.015625,-0.320312],[-0.8125,-0.015625,-0.320312],[0.851562,0.015625,-0.320312],[-0.851562,0.015625,-0.320312],[0.828125,0.078125,-0.320312],[-0.828125,0.078125,-0.320312],[0.765625,0.09375,-0.320312],[-0.765625,0.09375,-0.320312],[0.84375,0.171875,-0.320312],[-0.84375,0.171875,-0.320312],[1.039062,0.328125,-0.414062],[-1.039062,0.328125,-0.414062],[1.1875,0.34375,-0.484375],[-1.1875,0.34375,-0.484375],[1.257812,0.242188,-0.492188],[-1.257812,0.242188,-0.492188],[1.210938,0.085938,-0.484375],[-1.210938,0.085938,-0.484375],[1.046875,0,-0.421875],[-1.046875,0,-0.421875],[0.882812,-0.015625,-0.265625],[-0.882812,-0.015625,-0.265625],[0.953125,0.289062,-0.34375],[-0.953125,0.289062,-0.34375],[0.890625,0.109375,-0.328125],[-0.890625,0.109375,-0.328125],[0.9375,0.0625,-0.335938],[-0.9375,0.0625,-0.335938],[1,0.125,-0.367188],[-1,0.125,-0.367188],[0.960938,0.171875,-0.351562],[-0.960938,0.171875,-0.351562],[1.015625,0.234375,-0.375],[-1.015625,0.234375,-0.375],[1.054688,0.1875,-0.382812],[-1.054688,0.1875,-0.382812],[1.109375,0.210938,-0.390625],[-1.109375,0.210938,-0.390625],[1.085938,0.273438,-0.390625],[-1.085938,0.273438,-0.390625],[1.023438,0.4375,-0.484375],[-1.023438,0.4375,-0.484375],[1.25,0.46875,-0.546875],[-1.25,0.46875,-0.546875],[1.367188,0.296875,-0.5],[-1.367188,0.296875,-0.5],[1.3125,0.054688,-0.53125],[-1.3125,0.054688,-0.53125],[1.039062,-0.085938,-0.492188],[-1.039062,-0.085938,-0.492188],[0.789062,-0.125,-0.328125],[-0.789062,-0.125,-0.328125],[0.859375,0.382812,-0.382812],[-0.859375,0.382812,-0.382812]\r\n];\r\n\r\nexport default monkeyVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport monkeyFaces from './faces/monkey.ts';\r\nimport monkeyVertices from './vertices/monkey.ts';\r\n\r\nexport default class Monkey extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: monkeyVertices,\r\n faces: monkeyFaces\r\n });\r\n }\r\n}","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport cuboidFaces from './faces/cuboid.ts';\r\nimport getCuboidVertices from './vertices/cuboid.ts';\r\n\r\nexport interface CuboidOptions extends Object3DOptions {\r\n width: number;\r\n height: number;\r\n length: number;\r\n}\r\n\r\nexport default class Cuboid extends Object3D {\r\n\r\n public width: number;\r\n public height: number;\r\n public length: number;\r\n\r\n constructor(options?: Partial<CuboidOptions>) {\r\n super({\r\n ...options,\r\n vertices: getCuboidVertices(\r\n options?.width ?? 1,\r\n options?.height ?? 1,\r\n options?.length ?? 1\r\n ),\r\n faces: cuboidFaces\r\n });\r\n\r\n this.width = options?.width ?? 1;\r\n this.height = options?.height ?? 1;\r\n this.length = options?.length ?? 1;\r\n }\r\n\r\n private computeVertices() {\r\n this.vertices = getCuboidVertices(this.width, this.height, this.length);\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.computeVertices();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.computeVertices();\r\n }\r\n\r\n public setLength(length: number) {\r\n this.length = length;\r\n this.computeVertices();\r\n }\r\n}"],"mappings":"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AAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAC9D,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAC9D,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAC/D,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAClE,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EACjE,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAClE,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,CAAC,EAAG,CAAC,GAAI,GAAI,EAAE,EACjE,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,CAAC,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,CAAC,EAC/D,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,CAAC,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EACjE,CAAC,GAAI,GAAI,CAAC,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,EAAE,EAAG,CAAC,GAAI,GAAI,CAAC,EAAG,CAAC,GAAI,GAAI,EAAE,EAChE,CAAC,GAAI,EAAG,E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,EACxC,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAA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OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,SAAU,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,MAAO,QAAS,GAAI,EAAE,CAAC,OAAQ,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,OAAQ,EAAE,CAAC,SAAU,MAAO,OAAQ,EAAE,CAAC,KAAM,MAAO,OAAQ,EAAE,CAAC,MAAO,MAAO,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,IAAK,OAAQ,OAAQ,EAAE,CAAC,KAAM,OAAQ,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,MAAO,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,KAAM,EAAE,CAAC,EAAE,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,KAAM,SAAU,GAAI,EAAE,CAAC,MAAO,SAAU,GAAI,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,MAAO,EAAE,CAAC,SAAU,KAAM,MAAO,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,KAAM,SAAU,KAAM,EAAE,CAAC,MAAO,SAAU,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,IAAK,SAAU,KAAM,EAAE,CAAC,KAAM,SAAU,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,GAAI,EAAE,CAAC,SAAU,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,EAAE,MAAO,KAAM,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,EAAE,QAAS,MAAO,EAAE,CAAC,OAAQ,KAAM,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,MAAO,EAAE,CAAC,SAAU,OAAQ,MAAO,EAAE,CAAC,MAAO,OAAQ,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,SAAU,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,KAAM,MAAO,OAAQ,EAAE,CAAC,MAAO,MAAO,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,KAAM,MAAO,EAAE,CAAC,SAAU,KAAM,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,GAAI,EAAE,CAAC,SAAU,OAAQ,GAAI,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,EAAE,OAAQ,EAAE,CAAC,SAAU,EAAE,OAAQ,EAAE,CAAC,MAAO,QAAS,MAAO,EAAE,CAAC,OAAQ,QAAS,MAAO,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,EAAE,QAAS,QAAS,EAAE,CAAC,EAAE,SAAU,QAAS,EAAE,CAAC,EAAE,SAAU,KAAM,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,MAAO,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,MAAO,QAAS,EAAE,CAAC,SAAU,MAAO,QAAS,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,OAAQ,MAAO,QAAS,EAAE,CAAC,QAAS,MAAO,QAAS,EAAE,CAAC,QAAS,SAAU,QAAS,EAAE,CAAC,SAAU,SAAU,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,IAAK,IAAK,OAAQ,EAAE,CAAC,KAAM,IAAK,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,KAAM,SAAU,OAAQ,EAAE,CAAC,MAAO,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,EAAG,EAAE,CAAC,SAAU,SAAU,EAAG,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,QAAS,EAAE,CAAC,SAAU,OAAQ,QAAS,EAAE,CAAC,OAAQ,SAAU,QAAS,EAAE,CAAC,QAAS,SAAU,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,IAAK,EAAE,CAAC,SAAU,MAAO,IAAK,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,IAAK,QAAS,EAAE,CAAC,SAAU,IAAK,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,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","names":["client_exports","__export","Arc","Button","Circle","Cube","Cuboid","CustomPolygon","Engine","Icosahedron","Icosphere","ImageSprite","Monkey","Multiplayer","Object3D","Octahedron","Oval","Pen","Rectangle","RegularPolygon","RigidCircle","SolidRenderer3D","Sprite","Square","TSCMath","Tetrahedron","Text","Watermark","WireframeRenderer3D","aspectRatio","canvas","ctx","client_default","scale","setAspectRatio","setScale","__toCommonJS","canvas","ctx","penCanvas","penCtx","aspectRatio","scale","updateSize","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","_Sprite","Engine","options","sprite","bBox1","bBox2","b1Left","b1Top","b1Right","b1Bottom","b2Left","b2Top","b2Right","b2Bottom","xMin","yMin","xMax","yMax","width","height","ctx","drawSprite","color","dx","dy","img1","img2","i","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","TSCMath","_TSCMath","min","max","v","d","n","a","b","i","sum","deg","rad","val","Engine","_Engine","scene","loop","sprite","layer","targetIndex","s","maxFPS","frameInterval","accumulator","tick","currentTime","deltaTime","ctx","canvas","ms","resolve","conditionGetter","check","key","value","mouseX","mouseY","canvasMouseX","canvasMouseY","localX","localY","angle","TSCMath","rotatedX","rotatedY","src","audio","sound","penCanvas","e","import_socket","Multiplayer","_Multiplayer","serverURL","eventName","data","callback","Rectangle","_Rectangle","Sprite","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Square","_Square","Sprite","s","cos","TSCMath","sin","size","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","sideLength","color","Oval","_Oval","Sprite","rX","rY","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radX","radY","color","Circle","_Circle","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","color","Arc","_Arc","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","angle","color","RegularPolygon","_RegularPolygon","Sprite","path","step","i","stamping","c","penCtx","ctx","cX","canvas","cY","TSCMath","options","sides","radius","color","CustomPolygon","_CustomPolygon","Sprite","cos","TSCMath","sin","minX","maxX","minY","maxY","v","rx","ry","fx","fy","width","height","x","y","path","vertices","first","rest","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","options","sprite","penCtx","canvas","Engine","lastX","lastY","steps","TSCMath","x","y","dX","dY","Text","_Text","Sprite","metrics","ctx","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","align","baseline","Button","_Button","Sprite","ctx","metrics","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","Watermark","_Watermark","Text","options","canvas","ImageSprite","_ImageSprite","Sprite","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","costumeNumber","bitmap","RigidCircle","Circle","engine","Engine","x","y","localCircles","s","globalCircles","circles","steps","i","circle","nx","ny","dist","nxn","nyn","dot","cX","canvas","cY","options","WireframeRenderer3D","Pen","canvas","options","engine","Engine","dt","sinY","TSCMath","cosY","maxPitch","vertices","f","v","x","y","z","xp","yp","sinX","cosX","sinZ","cosZ","obj","projected","x1","z1","y2","z2","x3","y3","vIndex","SolidRenderer3D","Pen","canvas","options","engine","Engine","dt","sinY","TSCMath","cosY","maxPitch","vertices","f","v","x","y","z","xp","yp","sinX","cosX","sinZ","cosZ","lx","ly","lz","lx1","lz1","ly2","lz2","lx3","ly3","lightDir","obj","h","s","l","cameraVerts","x1","z1","y2","z2","x3","y3","faces","face","i","a","b","projected","nx","ny","nz","v1","v2","normal","diffuse","brightness","litL","color","vIndex","CustomPolygon","el","rgb","r","g","max","min","d","Object3D","options","deg","cos","TSCMath","sin","i","_","y","z","x","delta","data","lines","vertices","l","faces","f","tetrahedronFaces","tetrahedron_default","tetrahedronVertices","tetrahedron_default","Tetrahedron","Object3D","options","tetrahedron_default","cuboidFaces","cuboid_default","getCuboidVertices","width","height","length","Cube","Object3D","options","getCuboidVertices","cuboid_default","octahedronFaces","octahedron_default","octahedronVerticesVertices","octahedron_default","Octahedron","Object3D","options","octahedron_default","icosahedronFaces","icosahedron_default","phi","a","b","icosahedronVertices","icosahedron_default","Icosahedron","Object3D","options","icosahedron_default","icosphereFaces","icosphere_default","icosphereVertices","icosphere_default","Icosphere","Object3D","options","icosphere_default","monkeyFaces","monkey_default","monkeyVertices","monkey_default","Monkey","Object3D","options","monkey_default","Cuboid","Object3D","options","getCuboidVertices","cuboid_default","width","height","length","TScratch","Engine","Sprite","TSCMath","Multiplayer","Rectangle","Square","Oval","Circle","Arc","RegularPolygon","CustomPolygon","Pen","Text","Button","Watermark","ImageSprite","RigidCircle","WireframeRenderer3D","SolidRenderer3D","Object3D","Tetrahedron","Cube","Octahedron","Icosahedron","Icosphere","Monkey","Cuboid","scale","aspectRatio","setScale","setAspectRatio","canvas","ctx","client_default"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts","../../src/client/main/canvas.ts","../../src/client/main/Sprite.ts","../../src/client/main/TSCMath.ts","../../src/client/main/Engine.ts","../../src/client/main/Multiplayer.ts","../../src/client/sprites/Rectangle.ts","../../src/client/sprites/Square.ts","../../src/client/sprites/Oval.ts","../../src/client/sprites/Circle.ts","../../src/client/sprites/Arc.ts","../../src/client/sprites/RegularPolygon.ts","../../src/client/sprites/CustomPolygon.ts","../../src/client/sprites/Pen.ts","../../src/client/sprites/Text.ts","../../src/client/sprites/Button.ts","../../src/client/sprites/Watermark.ts","../../src/client/sprites/ImageSprite.ts","../../src/client/sprites/physics/RigidCircle.ts","../../src/client/sprites/3d/Camera3D.ts","../../src/client/sprites/3d/Renderer3D.ts","../../src/client/sprites/3d/WireframeRenderer3D.ts","../../src/client/sprites/3d/SolidRenderer3D.ts","../../src/client/sprites/3d/Object3D.ts","../../src/client/sprites/3d/models/faces/tetrahedron.ts","../../src/client/sprites/3d/models/vertices/tetrahedron.ts","../../src/client/sprites/3d/models/Tetrahedron.ts","../../src/client/sprites/3d/models/faces/cuboid.ts","../../src/client/sprites/3d/models/vertices/cuboid.ts","../../src/client/sprites/3d/models/Cube.ts","../../src/client/sprites/3d/models/faces/octahedron.ts","../../src/client/sprites/3d/models/vertices/octahedron.ts","../../src/client/sprites/3d/models/Octahedron.ts","../../src/client/sprites/3d/models/faces/icosahedron.ts","../../src/client/sprites/3d/models/vertices/icosahedron.ts","../../src/client/sprites/3d/models/Icosahedron.ts","../../src/client/sprites/3d/models/faces/icosphere.ts","../../src/client/sprites/3d/models/vertices/icosphere.ts","../../src/client/sprites/3d/models/Icosphere.ts","../../src/client/sprites/3d/models/faces/monkey.ts","../../src/client/sprites/3d/models/vertices/monkey.ts","../../src/client/sprites/3d/models/Monkey.ts","../../src/client/sprites/3d/models/Cuboid.ts"],"sourcesContent":["// Main\r\nimport Engine from '@main/Engine.ts';\r\nimport Sprite, { type SpriteOptions } from '@main/Sprite.ts';\r\nimport { scale, aspectRatio, setScale, setAspectRatio, canvas, ctx } from '@main/canvas.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\n// Multiplayer\r\nimport Multiplayer from '@main/Multiplayer.ts';\r\n\r\n// Sprites\r\nimport Rectangle, { type RectangleOptions } from '@sprites/Rectangle.ts';\r\nimport Square, { type SquareOptions } from '@sprites/Square.ts';\r\nimport Oval, { type OvalOptions } from '@sprites/Oval.ts';\r\nimport Circle, { type CircleOptions } from '@sprites/Circle.ts';\r\nimport Arc, { type ArcOptions } from '@sprites/Arc.ts';\r\nimport RegularPolygon, { type RegularPolygonOptions } from '@sprites/RegularPolygon.ts';\r\nimport CustomPolygon, { type CustomPolygonOptions } from '@sprites/CustomPolygon.ts';\r\nimport Pen, { type PenOptions } from '@sprites/Pen.ts';\r\nimport Text, { type TextOptions } from '@sprites/Text.ts';\r\nimport Button, { type ButtonOptions } from '@sprites/Button.ts';\r\nimport Watermark from '@sprites/Watermark.ts';\r\nimport ImageSprite, { type ImageSpriteOptions } from '@sprites/ImageSprite.ts';\r\n\r\nimport RigidCircle, { type RigidCircleOptions } from '@sprites/physics/RigidCircle.ts';\r\n\r\n// 3D\r\nimport Camera3D, { type Camera3DOptions } from '@sprites/3d/Camera3D.ts';\r\nimport Renderer3D, { type Renderer3DOptions } from '@sprites/3d/Renderer3D.ts';\r\nimport WireframeRenderer3D from '@sprites/3d/WireframeRenderer3D.ts';\r\nimport SolidRenderer3D from '@sprites/3d/SolidRenderer3D.ts';\r\nimport Object3D, { type Object3DOptions } from '@sprites/3d/Object3D.ts';\r\n\r\nimport Tetrahedron from '@sprites/3d/models/Tetrahedron.ts';\r\nimport Cube from '@sprites/3d/models/Cube.ts';\r\nimport Octahedron from '@sprites/3d/models/Octahedron.ts';\r\nimport Icosahedron from '@sprites/3d/models/Icosahedron.ts';\r\nimport Icosphere from '@sprites/3d/models/Icosphere.ts';\r\nimport Monkey from '@sprites/3d/models/Monkey.ts';\r\nimport Cuboid, { type CuboidOptions } from '@sprites/3d/models/Cuboid.ts';\r\n\r\n// Types\r\nimport type { Vec2, Vec3, Vec4 } from '@ctypes/Vectors.ts';\r\nimport type { Mat2, Mat3, Mat4 } from '@ctypes/Matricies.ts';\r\nimport { type RigidBodyOptions } from '@sprites/physics/RigidBodyOptions.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n TSCMath,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n Camera3D,\r\n Renderer3D, // For custom renderer implementations\r\n WireframeRenderer3D,\r\n SolidRenderer3D,\r\n Object3D,\r\n\r\n Tetrahedron,\r\n Cube,\r\n Octahedron,\r\n Icosahedron,\r\n Icosphere,\r\n Monkey,\r\n\r\n Cuboid,\r\n\r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};\r\n\r\nexport default TScratch;\r\nexport {\r\n // Main\r\n Engine,\r\n Sprite,\r\n TSCMath,\r\n\r\n // Multiplayer\r\n Multiplayer,\r\n\r\n // Sprites\r\n Rectangle,\r\n Square,\r\n Oval,\r\n Circle,\r\n Arc,\r\n RegularPolygon,\r\n CustomPolygon,\r\n Pen,\r\n Text,\r\n Button,\r\n Watermark,\r\n ImageSprite,\r\n\r\n RigidCircle,\r\n\r\n // 3D\r\n Camera3D,\r\n Renderer3D, // For custom renderer implementations\r\n WireframeRenderer3D,\r\n SolidRenderer3D,\r\n Object3D,\r\n\r\n Tetrahedron,\r\n Cube,\r\n Octahedron,\r\n Icosahedron,\r\n Icosphere,\r\n Monkey,\r\n\r\n Cuboid,\r\n\r\n // Options\r\n type SpriteOptions,\r\n type RectangleOptions,\r\n type SquareOptions,\r\n type OvalOptions,\r\n type CircleOptions,\r\n type ArcOptions,\r\n type RegularPolygonOptions,\r\n type CustomPolygonOptions,\r\n type PenOptions,\r\n type TextOptions,\r\n type ButtonOptions,\r\n type TextOptions as WatermarkOptions,\r\n type ImageSpriteOptions,\r\n\r\n type RigidBodyOptions,\r\n type RigidCircleOptions,\r\n type Camera3DOptions,\r\n type Renderer3DOptions,\r\n type Object3DOptions,\r\n\r\n type CuboidOptions,\r\n\r\n // Other types\r\n type Vec2,\r\n type Vec3,\r\n type Vec4,\r\n type Mat2,\r\n type Mat3,\r\n type Mat4,\r\n \r\n // Canvas\r\n scale,\r\n aspectRatio,\r\n setScale,\r\n setAspectRatio,\r\n canvas,\r\n ctx\r\n};","export const canvas = document.getElementById('game-window') as HTMLCanvasElement || document.createElement('canvas'); // For testing\r\nexport const ctx = canvas.getContext('2d')!;\r\n\r\nexport const penCanvas = document.createElement('canvas');\r\nexport const penCtx = penCanvas.getContext('2d')!;\r\n\r\nexport let aspectRatio: number = 16 / 9;\r\nexport let scale: number;\r\n\r\nfunction updateSize() {\r\n canvas.width = aspectRatio * scale;\r\n canvas.height = scale;\r\n\r\n penCanvas.width = aspectRatio * scale;\r\n penCanvas.height = scale;\r\n}\r\n\r\nexport function setScale(newScale: number) {\r\n scale = newScale;\r\n updateSize();\r\n}\r\n\r\nexport function setAspectRatio(newAspectRatio: number) {\r\n aspectRatio = newAspectRatio;\r\n updateSize();\r\n}\r\n\r\ncanvas.parentElement?.insertBefore(penCanvas, canvas);\r\n\r\nsetScale(500);","import Engine from './Engine.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\n\r\nexport interface BoundingBox {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface SpriteOptions {\r\n x?: number;\r\n y?: number;\r\n dir?: number;\r\n size?: number;\r\n pivot?: Vec2;\r\n scene?: string;\r\n hidden?: boolean;\r\n layer?: number;\r\n}\r\n\r\nexport default abstract class Sprite {\r\n\r\n public x: number = 0;\r\n public y: number = 0;\r\n public dir: number = 0;\r\n public size: number = 1;\r\n public pivot: Vec2 = [0, 0];\r\n public scene: string = 'main';\r\n public hidden: boolean = false;\r\n public layer: number = 0;\r\n\r\n public abstract discriminant: string;\r\n public abstract tags: Set<string>;\r\n\r\n private cachedPath: Path2D | null = null;\r\n private pathDirty: boolean = true;\r\n\r\n // Reusable collision detection canvas\r\n private static collisionCanvas: OffscreenCanvas | null = null;\r\n private static collisionCtx: OffscreenCanvasRenderingContext2D | null = null;\r\n\r\n // Rendering\r\n\r\n public abstract getBoundingBox(): BoundingBox;\r\n public abstract getPath(): Path2D;\r\n public abstract draw(stamping?: true): void;\r\n protected abstract create(options?: SpriteOptions): this;\r\n\r\n protected refresh() {\r\n Engine.init().refresh();\r\n }\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\r\n public getCachedPath(): Path2D {\r\n if (this.pathDirty || !this.cachedPath) {\r\n this.cachedPath = this.getPath();\r\n this.pathDirty = false;\r\n }\r\n return this.cachedPath;\r\n }\r\n\r\n constructor(options?: SpriteOptions) {\r\n Object.assign(this, options);\r\n Engine.init().addSprite(this);\r\n }\r\n\r\n protected getCreateOptions(): SpriteOptions & Record<string, any> {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n dir: this.dir,\r\n size: this.size,\r\n scene: this.scene,\r\n layer: this.layer,\r\n hidden: this.hidden\r\n };\r\n }\r\n\r\n public clone(options?: SpriteOptions): this {\r\n return this.create({\r\n ...this.getCreateOptions(),\r\n ...options\r\n });\r\n }\r\n\r\n // Sensing\r\n\r\n public touching(sprite: Sprite): boolean {\r\n\r\n // Return if hidden or if the scenes differ\r\n if (this.hidden || sprite.hidden || (this.scene !== '*' && sprite.scene !== '*' && this.scene !== sprite.scene)) return false;\r\n\r\n // AABB (bounding boxes)\r\n const bBox1 = this.getBoundingBox();\r\n const bBox2 = sprite.getBoundingBox();\r\n\r\n const aabbOverlap =\r\n Math.abs(bBox1.x - bBox2.x) < (bBox1.width + bBox2.width) / 2 &&\r\n Math.abs(bBox1.y - bBox2.y) < (bBox1.height + bBox2.height) / 2;\r\n\r\n if (!aabbOverlap) return false;\r\n\r\n // Image data (pixel perfect)\r\n\r\n // Compute intersection bounding box\r\n const b1Left = bBox1.x - bBox1.width / 2;\r\n const b1Top = bBox1.y + bBox1.height / 2;\r\n const b1Right = bBox1.x + bBox1.width / 2;\r\n const b1Bottom = bBox1.y - bBox1.height / 2;\r\n\r\n const b2Left = bBox2.x - bBox2.width / 2;\r\n const b2Top = bBox2.y + bBox2.height / 2;\r\n const b2Right = bBox2.x + bBox2.width / 2;\r\n const b2Bottom = bBox2.y - bBox2.height / 2;\r\n\r\n const xMin = Math.max(b1Left, b2Left);\r\n const yMin = Math.min(b1Bottom, b2Bottom);\r\n const xMax = Math.min(b1Right, b2Right);\r\n const yMax = Math.max(b1Top, b2Top);\r\n\r\n const width = xMax - xMin;\r\n const height = yMax - yMin;\r\n\r\n if (width < 1 || height < 1) return false;\r\n\r\n // Reuse or create offscreen canvas for collision detection\r\n if (!Sprite.collisionCanvas) {\r\n Sprite.collisionCanvas = new OffscreenCanvas(1, 1);\r\n Sprite.collisionCtx = Sprite.collisionCanvas.getContext('2d', { willReadFrequently: true })!;\r\n }\r\n\r\n // Prepare canvas\r\n const ctx = Sprite.collisionCtx!;\r\n if (Sprite.collisionCanvas.width < width) Sprite.collisionCanvas.width = width;\r\n if (Sprite.collisionCanvas.height < height) Sprite.collisionCanvas.height = height;\r\n ctx.clearRect(0, 0, width, height);\r\n\r\n // Helper to draw a sprite into collision canvas\r\n const drawSprite = (sprite: Sprite, color: string) => {\r\n ctx.save();\r\n\r\n // Translate to intersection box coordinates (centered)\r\n const dx = sprite.x - xMin;\r\n const dy = yMax - sprite.y; // flip Y to match draw()\r\n\r\n ctx.translate(dx, dy);\r\n ctx.rotate(sprite.toRadians(sprite.dir));\r\n\r\n ctx.fillStyle = color;\r\n ctx.fill(sprite.getCachedPath());\r\n\r\n ctx.restore();\r\n };\r\n\r\n // Draw sprite 1 in red\r\n drawSprite(this, 'red');\r\n const img1 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Draw sprite 2 in blue\r\n ctx.clearRect(0, 0, width, height);\r\n drawSprite(sprite, 'blue');\r\n const img2 = ctx.getImageData(0, 0, width, height).data;\r\n\r\n // Check for overlapping non-transparent pixels\r\n for (let i = 3; i < img1.length; i += 4) // alpha channel\r\n if (img1[i]! > 0 && img2[i]! > 0) return true;\r\n\r\n return false;\r\n }\r\n\r\n // Helpers\r\n\r\n protected toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n protected toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n public distanceTo(x: number, y: number) {\r\n return Math.hypot(x - this.x, y - this.y);\r\n }\r\n\r\n // Methods\r\n\r\n // Motion\r\n public move(steps: number) {\r\n this.x += steps * Math.sin(this.toRadians(this.dir));\r\n this.y += steps * Math.cos(this.toRadians(this.dir));\r\n this.refresh();\r\n }\r\n\r\n public turn(deg: number) {\r\n this.dir += deg;\r\n this.refresh();\r\n }\r\n\r\n public point(dir: number) {\r\n this.dir = dir;\r\n this.refresh();\r\n }\r\n\r\n public pointTowards(x: number, y: number) {\r\n this.dir = 90 - this.toDegrees(Math.atan2(y - this.y, x - this.x));\r\n this.refresh();\r\n }\r\n\r\n public setX(x: number) {\r\n this.x = x;\r\n this.refresh();\r\n }\r\n\r\n public setY(y: number) {\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public goTo(x: number, y: number) {\r\n this.x = x;\r\n this.y = y;\r\n this.refresh();\r\n }\r\n\r\n public changeX(dX: number) {\r\n this.x += dX;\r\n this.refresh();\r\n }\r\n\r\n public changeY(dY: number) {\r\n this.y += dY;\r\n this.refresh();\r\n }\r\n\r\n public setPivot(x: number, y: number) {\r\n this.pivot = [x, y];\r\n this.refresh();\r\n }\r\n\r\n // Looks\r\n\r\n public show() {\r\n this.hidden = false;\r\n this.refresh();\r\n }\r\n\r\n public hide() {\r\n this.hidden = true;\r\n this.refresh();\r\n }\r\n\r\n public setSize(size: number) {\r\n this.size = size > 0 ? size : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public changeSize(dS: number) {\r\n this.size = this.size + dS > 0 ? this.size + dS : 0;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public goToLayer(layer: number) {\r\n this.layer = layer;\r\n this.refresh();\r\n }\r\n\r\n public changeLayer(dL: number) {\r\n this.layer += dL;\r\n this.refresh();\r\n }\r\n}","import type { Vec2, Vec3, Vec4 } from '@ctypes/Vectors.ts';\r\n\r\ntype Vec = Vec2 | Vec3 | Vec4;\r\n\r\n// Static class\r\nexport default class TSCMath {\r\n\r\n private constructor() {} // Staticity using a private constructor\r\n\r\n // Random integer\r\n public static pickRandom(min: number, max: number) {\r\n if (min > max)\r\n [min, max] = [max, min];\r\n return Math.floor(Math.random() * (max - min + 1) + min);\r\n }\r\n\r\n // --- Vectors ---\r\n\r\n // Vector magnitude\r\n public static magnitude(v: Vec2): number;\r\n public static magnitude(v: Vec3): number;\r\n public static magnitude(v: Vec4): number;\r\n public static magnitude(v: Vec): number {\r\n return Math.hypot(...v);\r\n }\r\n\r\n // Vector normalization\r\n public static normalize(v: Vec2): Vec2;\r\n public static normalize(v: Vec3): Vec3;\r\n public static normalize(v: Vec4): Vec4;\r\n public static normalize(v: Vec): Vec {\r\n const d = Math.hypot(...v);\r\n if (d === 0) return [...v] as Vec;\r\n\r\n return v.map(n => n / d) as Vec;\r\n }\r\n\r\n // Vector addition\r\n public static add(a: Vec2, b: Vec2): Vec2;\r\n public static add(a: Vec3, b: Vec3): Vec3;\r\n public static add(a: Vec4, b: Vec4): Vec4;\r\n public static add(a: Vec, b: Vec): Vec {\r\n return a.map((n, i) => n + b[i]!) as Vec;\r\n }\r\n\r\n // Vector subtraction\r\n public static subtract(a: Vec2, b: Vec2): Vec2;\r\n public static subtract(a: Vec3, b: Vec3): Vec3;\r\n public static subtract(a: Vec4, b: Vec4): Vec4;\r\n public static subtract(a: Vec, b: Vec): Vec {\r\n return a.map((n, i) => n - b[i]!) as Vec;\r\n }\r\n\r\n // Vector dot product\r\n public static dot(a: Vec2, b: Vec2): number;\r\n public static dot(a: Vec3, b: Vec3): number;\r\n public static dot(a: Vec4, b: Vec4): number;\r\n public static dot(a: Vec, b: Vec): number {\r\n return a.reduce((sum, n, i) => sum + n * b[i]!, 0);\r\n }\r\n\r\n // Vector cross product\r\n public static cross(a: Vec3, b: Vec3): Vec3 {\r\n return [\r\n a[1] * b[2] - a[2] * b[1],\r\n a[2] * b[0] - a[0] * b[2],\r\n a[0] * b[1] - a[1] * b[0],\r\n ];\r\n }\r\n\r\n // --- Angles ---\r\n\r\n // Deg / rad conversion\r\n public static toRadians(deg: number) {\r\n return deg * Math.PI / 180;\r\n }\r\n\r\n public static toDegrees(rad: number) {\r\n return rad * 180 / Math.PI;\r\n }\r\n\r\n // Trigonometric functions\r\n public static sin(deg: number) {\r\n return Math.sin(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static cos(deg: number) {\r\n return Math.cos(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static tan(deg: number) {\r\n return Math.tan(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static csc(deg: number) {\r\n return 1 / Math.sin(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static sec(deg: number) {\r\n return 1 / Math.cos(TSCMath.toRadians(deg));\r\n }\r\n\r\n public static cot(deg: number) {\r\n return 1 / Math.tan(TSCMath.toRadians(deg));\r\n }\r\n\r\n // Inverse Trigonometric functions\r\n public static asin(val: number) {\r\n return TSCMath.toDegrees(Math.asin(val));\r\n }\r\n\r\n public static acos(val: number) {\r\n return TSCMath.toDegrees(Math.acos(val));\r\n }\r\n\r\n public static acsc(val: number) {\r\n return TSCMath.toDegrees(Math.asin(1 / val));\r\n }\r\n\r\n public static asec(val: number) {\r\n return TSCMath.toDegrees(Math.acos(1 / val));\r\n }\r\n}","import { canvas, ctx, penCanvas } from './canvas.ts';\r\nimport Sprite from './Sprite.ts';\r\nimport TSCMath from './TSCMath.ts';\r\n\r\ntype GameLoop = (() => void) | (() => Promise<void>);\r\n\r\ntype SceneMap = Map<string, {\r\n sprites: Sprite[];\r\n loop: GameLoop | null;\r\n}>;\r\n\r\nexport default class Engine {\r\n\r\n private static instance: Engine;\r\n\r\n private loopRunning: boolean = false;\r\n private gameLoop: GameLoop | null = null;\r\n\r\n public maxFPS: number = 30;\r\n public deltaTime: number = 1 / this.maxFPS;\r\n private lastFrame: number = performance.now();\r\n private refreshScheduled: boolean = false;\r\n private animationFrameId: number | null = null;\r\n\r\n private sounds: HTMLAudioElement[] = [];\r\n\r\n public mouseX: number = 0;\r\n public mouseY: number = 0;\r\n\r\n public mouseDown: boolean = false;\r\n public mouseClicked: boolean = false;\r\n\r\n private keysPressed: Set<string> = new Set<string>();\r\n\r\n private currentScene: string = 'main';\r\n public sceneMap: SceneMap = new Map();\r\n\r\n private variableMap: Map<string, unknown> = new Map();\r\n\r\n // Singleton initialization\r\n\r\n public static init() {\r\n if (!this.instance)\r\n this.instance = new Engine();\r\n\r\n return this.instance;\r\n }\r\n\r\n private constructor() {\r\n void this.setMaxFPS(30);\r\n this.sceneMap.set('main', { loop: null, sprites: [] });\r\n this.sceneMap.set('*', { loop: null, sprites: [] });\r\n\r\n // Events\r\n\r\n // Mouse\r\n penCanvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - penCanvas.offsetLeft - penCanvas.width / 2;\r\n this.mouseY = -(e.clientY - penCanvas.offsetTop - penCanvas.height / 2);\r\n });\r\n penCanvas.addEventListener('mousedown', () => {\r\n this.mouseDown = true;\r\n });\r\n penCanvas.addEventListener('mouseup', () => {\r\n this.mouseDown = false;\r\n });\r\n penCanvas.addEventListener('click', () => {\r\n this.mouseClicked = true;\r\n setTimeout(() => this.mouseClicked = false, 0);\r\n });\r\n\r\n // Keys\r\n addEventListener('keydown', e => {\r\n if (e.repeat) return;\r\n this.keysPressed.add(e.key);\r\n });\r\n\r\n addEventListener('keyup', e => {\r\n this.keysPressed.delete(e.key);\r\n });\r\n }\r\n\r\n // Change the scene\r\n\r\n public setScene(scene: string) {\r\n if (!this.sceneMap.get(scene))\r\n this.sceneMap.set(scene, { sprites: [], loop: null });\r\n\r\n this.loopRunning = false;\r\n this.currentScene = scene;\r\n this.gameLoop = this.sceneMap.get(scene)!.loop;\r\n this.setMaxFPS(this.maxFPS); // Update the interval function\r\n }\r\n\r\n // Loops\r\n\r\n public setLoop(scene: string, loop: GameLoop) {\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [], loop });\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.loop = loop;\r\n if (scene === this.currentScene)\r\n this.setScene(scene);\r\n }\r\n\r\n public pauseLoop() {\r\n this.loopRunning = false;\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n }\r\n\r\n public resumeLoop() {\r\n this.loopRunning = true;\r\n void this.setMaxFPS(this.maxFPS);\r\n }\r\n\r\n // Internal\r\n\r\n public addSprite(sprite: Sprite) {\r\n const { scene, layer } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) {\r\n this.sceneMap.set(scene, { sprites: [sprite], loop: null });\r\n return;\r\n }\r\n\r\n let targetIndex = this.sceneMap.get(scene)!.sprites.findIndex(s => s.layer > layer);\r\n if (targetIndex === -1) {\r\n this.sceneMap.get(scene)!.sprites.push(sprite);\r\n return;\r\n }\r\n\r\n this.sceneMap.get(scene)!.sprites.splice(targetIndex, 0, sprite);\r\n this.refresh();\r\n }\r\n\r\n public removeSprite(sprite: Sprite) {\r\n const { scene } = sprite;\r\n\r\n if (!this.sceneMap.get(scene)) return;\r\n\r\n this.sceneMap.get(scene)!.sprites = this.sceneMap.get(scene)!.sprites.filter(s => s !== sprite);\r\n this.refresh();\r\n }\r\n\r\n public async setMaxFPS(maxFPS: number) {\r\n this.maxFPS = maxFPS;\r\n\r\n let loop = this.gameLoop;\r\n if (!loop) return;\r\n\r\n // Cancel existing animation frame if any\r\n if (this.animationFrameId !== null) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = null;\r\n }\r\n\r\n this.loopRunning = true;\r\n const frameInterval = 1000 / maxFPS;\r\n let accumulator = 0;\r\n\r\n const tick = async (currentTime: number) => {\r\n if (!this.loopRunning) return;\r\n\r\n const deltaTime = currentTime - this.lastFrame;\r\n this.lastFrame = currentTime;\r\n accumulator += deltaTime;\r\n\r\n // Fixed timestep: only run loop when enough time has passed\r\n if (accumulator >= frameInterval) {\r\n this.deltaTime = accumulator / 1000;\r\n accumulator = accumulator % frameInterval;\r\n\r\n if (loop) await loop();\r\n }\r\n\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n };\r\n\r\n this.lastFrame = performance.now();\r\n this.animationFrameId = requestAnimationFrame(tick);\r\n }\r\n\r\n public refresh() {\r\n if (this.refreshScheduled) return;\r\n this.refreshScheduled = true;\r\n\r\n requestAnimationFrame(() => {\r\n this.refreshScheduled = false;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n const sprites = [\r\n ...this.sceneMap.get(this.currentScene)!.sprites,\r\n ...this.sceneMap.get('*')!.sprites\r\n ];\r\n sprites.forEach(sprite => {\r\n if (!sprite.hidden)\r\n sprite.draw();\r\n });\r\n });\r\n }\r\n\r\n // Wait functions\r\n\r\n public async wait(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n public async waitUntil(conditionGetter: () => boolean): Promise<void> {\r\n return new Promise(resolve => {\r\n const check = () => {\r\n if (conditionGetter()) resolve();\r\n else setTimeout(check, 1000 / this.maxFPS);\r\n }\r\n check();\r\n });\r\n }\r\n\r\n // Global variables\r\n\r\n public setVariable<T = any>(key: string, value: T) {\r\n this.variableMap.set(key, value);\r\n }\r\n\r\n public getVariable<T = unknown>(key: string) {\r\n return this.variableMap.get(key) as T;\r\n }\r\n\r\n // Events\r\n\r\n public hovering(sprite: Sprite) {\r\n const { mouseX, mouseY } = this;\r\n\r\n const canvasMouseX = mouseX + canvas.width / 2;\r\n const canvasMouseY = canvas.height / 2 - mouseY;\r\n\r\n // Mouse relative to sprite center\r\n const localX = canvasMouseX - (sprite.x + canvas.width / 2);\r\n const localY = canvasMouseY - (canvas.height / 2 - sprite.y);\r\n\r\n // Rotate mouse point by -dir to align with the path's local coordinates\r\n const angle = -TSCMath.toRadians(sprite.dir);\r\n const rotatedX = localX * Math.cos(angle) - localY * Math.sin(angle);\r\n const rotatedY = localX * Math.sin(angle) + localY * Math.cos(angle);\r\n\r\n return ctx.isPointInPath(sprite.getCachedPath(), rotatedX, rotatedY);\r\n }\r\n\r\n public keyPressed(key: string) {\r\n switch (key) {\r\n case 'any': return this.keysPressed.size > 0;\r\n\r\n case 'up': return this.keysPressed.has('ArrowUp');\r\n case 'down': return this.keysPressed.has('ArrowDown');\r\n case 'left': return this.keysPressed.has('ArrowLeft');\r\n case 'right': return this.keysPressed.has('ArrowRight');\r\n\r\n case 'space': return this.keysPressed.has(' ');\r\n\r\n default: return this.keysPressed.has(key);\r\n }\r\n }\r\n\r\n // Sound\r\n\r\n public playSound(src: string) {\r\n const audio = new Audio(src);\r\n this.sounds.push(audio);\r\n\r\n audio.play();\r\n\r\n return audio;\r\n }\r\n\r\n public stopSound(sound: HTMLAudioElement) {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n this.sounds = this.sounds.filter(s => s !== sound);\r\n }\r\n\r\n public stopAllSounds() {\r\n this.sounds.forEach(sound => {\r\n sound.pause();\r\n sound.currentTime = 0;\r\n });\r\n this.sounds = [];\r\n }\r\n}","import { io, Socket } from 'socket.io-client';\r\n\r\nexport default class Multiplayer {\r\n\r\n private static instance: Multiplayer;\r\n private socket: Socket;\r\n\r\n public static connect(serverURL: string = 'http://localhost:3000') {\r\n if (!this.instance)\r\n this.instance = new Multiplayer(serverURL);\r\n\r\n return this.instance;\r\n }\r\n\r\n public disconnect() {\r\n this.socket.disconnect();\r\n }\r\n\r\n private constructor(serverURL: string) {\r\n this.socket = io(serverURL);\r\n }\r\n\r\n // Methods\r\n\r\n public broadcast<T = unknown>(eventName: string, data: T) {\r\n this.socket.emit(eventName, data);\r\n }\r\n\r\n public on<T = unknown>(eventName: string, callback: (data: T) => void) {\r\n this.socket.on(eventName, callback);\r\n }\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '@main/canvas.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Engine from '@main/Engine.ts';\r\n\r\nexport interface RectangleOptions extends SpriteOptions {\r\n width?: number;\r\n height?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Rectangle extends Sprite {\r\n\r\n public discriminant = 'rectangle';\r\n public tags = new Set(['rectangle']);\r\n\r\n public width: number;\r\n public height: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RectangleOptions): this {\r\n return new Rectangle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n width: this.width,\r\n height: this.height,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RectangleOptions) {\r\n super(options);\r\n\r\n this.width = options?.width ?? 50;\r\n this.height = options?.height ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { ctx, canvas, penCtx } from '@main/canvas.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Engine from '@main/Engine.ts';\r\n\r\nexport interface SquareOptions extends SpriteOptions {\r\n sideLength?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Square extends Sprite {\r\n\r\n public discriminant = 'square';\r\n public tags = new Set(['square']);\r\n\r\n public sideLength: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const s = this.sideLength / 2;\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const size = 2 * (Math.abs(s * cos) + Math.abs(s * sin)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: size,\r\n height: size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.sideLength / 2 * this.size,\r\n -this.sideLength / 2 * this.size,\r\n this.sideLength * this.size,\r\n this.sideLength * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: SquareOptions): this {\r\n return new Square(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sideLength: this.sideLength,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSideLength(sideLength: number) {\r\n this.sideLength = sideLength;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: SquareOptions) {\r\n super(options);\r\n this.sideLength = options?.sideLength ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Engine from '@main/Engine.ts';\r\n\r\nexport interface OvalOptions extends SpriteOptions {\r\n radX?: number;\r\n radY?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Oval extends Sprite {\r\n\r\n public discriminant = 'oval';\r\n public tags = new Set(['oval']);\r\n\r\n public radX: number;\r\n public radY: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const rX = this.radX;\r\n const rY = this.radY;\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(rX * cos) + Math.abs(rY * sin)) * this.size;\r\n const height = 2 * (Math.abs(rX * sin) + Math.abs(rY * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radX * this.size,\r\n this.radY * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: OvalOptions): this {\r\n return new Oval(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radX: this.radX,\r\n radY: this.radY,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadX(radX: number) {\r\n this.radX = radX;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadY(radY: number) {\r\n this.radY = radY;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: OvalOptions) {\r\n super(options);\r\n\r\n this.radX = options?.radX ?? 25;\r\n this.radY = options?.radY ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '@main/canvas.ts';\r\n\r\nexport interface CircleOptions extends SpriteOptions {\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Circle extends Sprite {\r\n\r\n public discriminant = 'circle';\r\n public tags = new Set(['circle']);\r\n\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.ellipse(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.radius * this.size,\r\n 0, 0,\r\n Math.PI * 2\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CircleOptions): this {\r\n return new Circle(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CircleOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '@main/canvas.ts';\r\n\r\nexport interface ArcOptions extends SpriteOptions {\r\n radius?: number;\r\n angle?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class Arc extends Sprite {\r\n\r\n public discriminant = 'arc';\r\n public tags = new Set(['arc']);\r\n\r\n public radius: number;\r\n public angle: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.arc(\r\n 0, 0,\r\n this.radius * this.size,\r\n this.toRadians(this.angle / 2 - 90),\r\n this.toRadians(-this.angle / 2 - 90)\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ArcOptions): this {\r\n return new Arc(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n radius: this.radius,\r\n angle: this.angle,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAngle(angle: number) {\r\n this.angle = angle;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: ArcOptions) {\r\n super(options);\r\n\r\n this.radius = options?.radius ?? 25;\r\n this.angle = options?.angle ?? 270;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface RegularPolygonOptions extends SpriteOptions {\r\n sides?: number;\r\n radius?: number;\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class RegularPolygon extends Sprite {\r\n\r\n public discriminant = 'regularpolygon';\r\n public tags = new Set(['regularpolygon']);\r\n\r\n public sides: number;\r\n public radius: number;\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.radius * 2 * this.size,\r\n height: this.radius * 2 * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n const step = (2 * Math.PI) / this.sides;\r\n\r\n path.moveTo(this.radius * this.size, 0);\r\n for (let i = 1; i < this.sides; i++)\r\n path.lineTo(\r\n this.radius * Math.cos(step * i) * this.size,\r\n this.radius * Math.sin(step * i) * this.size\r\n );\r\n \r\n path.closePath();\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(TSCMath.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: RegularPolygonOptions): this {\r\n return new RegularPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n sides: this.sides,\r\n radius: this.radius,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setSides(sides: number) {\r\n this.sides = sides;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setRadius(radius: number) {\r\n this.radius = radius;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: RegularPolygonOptions) {\r\n super(options);\r\n\r\n this.sides = options?.sides ?? 5;\r\n this.radius = options?.radius ?? 50;\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.draw();\r\n }\r\n\r\n}","import Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Engine from '@main/Engine.ts';\r\n\r\nexport interface CustomPolygonOptions extends SpriteOptions {\r\n vertices?: Vec2[];\r\n color?: string;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class CustomPolygon extends Sprite {\r\n\r\n public discriminant = 'custompolygon';\r\n public tags = new Set(['custompolygon']);\r\n\r\n public vertices: Vec2[];\r\n public color: string;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n if (this.vertices.length === 0) {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n for (const v of this.vertices) {\r\n\r\n // Rotate\r\n const rx = v[0] * cos - v[1] * sin;\r\n const ry = v[0] * sin + v[1] * cos;\r\n\r\n // Translate\r\n const fx = this.x + rx;\r\n const fy = this.y + ry;\r\n\r\n if (fx < minX) minX = fx;\r\n if (fx > maxX) maxX = fx;\r\n if (fy < minY) minY = fy;\r\n if (fy > maxY) maxY = fy;\r\n }\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n const x = minX + width / 2;\r\n const y = minY + height / 2;\r\n\r\n return {\r\n x: x * this.size,\r\n y: y * this.size,\r\n width: width * this.size,\r\n height: height * this.size\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n \r\n if (this.vertices.length < 2) return path;\r\n\r\n const vertices = this.vertices as [Vec2, Vec2, ...Vec2[]];\r\n const [first, ...rest] = vertices;\r\n\r\n path.moveTo(first[0] * this.size, -first[1] * this.size);\r\n for (const v of rest) path.lineTo(v[0] * this.size, -v[1] * this.size);\r\n\r\n path.closePath();\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true): void {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n const path = this.getCachedPath();\r\n\r\n c.fillStyle = this.color;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.fill(path)\r\n if (this.outlineWidth)\r\n c.stroke(path);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: CustomPolygonOptions): this {\r\n return new CustomPolygon(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n vertices: this.vertices,\r\n color: this.color,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n public setVertices(vertices: Vec2[]) {\r\n this.vertices = vertices;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n constructor(options?: CustomPolygonOptions) {\r\n super(options);\r\n\r\n this.vertices = options?.vertices ?? [];\r\n this.color = options?.color ?? 'black';\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n\r\n}","import { canvas, penCtx } from '@main/canvas.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Engine from '@main/Engine.ts';\r\n\r\nexport interface PenOptions extends SpriteOptions {\r\n drawing?: boolean;\r\n penSize?: number;\r\n color?: string;\r\n}\r\n\r\nexport default class Pen extends Sprite {\r\n\r\n public discriminant = 'pen';\r\n public tags = new Set(['pen']);\r\n\r\n public drawing: boolean;\r\n public penSize: number;\r\n public color: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width: this.penSize * this.size * 2,\r\n height: this.penSize * this.size * 2\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n return new Path2D();\r\n }\r\n public draw() {}\r\n\r\n public create(options?: PenOptions): this {\r\n return new Pen(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n drawing: this.drawing,\r\n penSize: this.penSize,\r\n color: this.color\r\n };\r\n }\r\n\r\n public up() {\r\n this.drawing = false;\r\n }\r\n\r\n public down() {\r\n this.drawing = true;\r\n }\r\n\r\n public stamp(sprite: Sprite) {\r\n sprite.draw(true);\r\n }\r\n\r\n public eraseAll() {\r\n penCtx.clearRect(0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n public dot() {\r\n penCtx.fillStyle = this.color;\r\n penCtx.fillRect(\r\n this.x - this.penSize / 2 + canvas.width / 2,\r\n -this.y - this.penSize / 2 + canvas.height / 2,\r\n this.penSize,\r\n this.penSize\r\n );\r\n }\r\n\r\n public drawSprite(sprite: Sprite) {\r\n sprite.draw(true);\r\n Engine.init().removeSprite(sprite);\r\n }\r\n\r\n private drawLine(lastX: number, lastY: number) {\r\n penCtx.beginPath();\r\n\r\n penCtx.moveTo(lastX + canvas.width / 2, -lastY + canvas.height / 2);\r\n penCtx.lineTo(this.x + canvas.width / 2, -this.y + canvas.height / 2);\r\n\r\n penCtx.lineWidth = this.penSize;\r\n penCtx.strokeStyle = this.color;\r\n penCtx.stroke();\r\n }\r\n\r\n // Overriding methods to include drawing\r\n\r\n public override move(steps: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += steps * Math.sin(TSCMath.toRadians(this.dir));\r\n this.y += steps * Math.cos(TSCMath.toRadians(this.dir));\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setX(x: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override setY(y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override goTo(x: number, y: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x = x;\r\n this.y = y;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeX(dX: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.x += dX;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n public override changeY(dY: number) {\r\n const lastX = this.x;\r\n const lastY = this.y;\r\n\r\n this.y += dY;\r\n if (this.drawing)\r\n this.drawLine(lastX, lastY);\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: PenOptions) {\r\n super(options);\r\n \r\n this.drawing = options?.drawing ?? false;\r\n this.penSize = options?.penSize ?? 5;\r\n this.color = options?.color ?? 'black';\r\n }\r\n}","import { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface TextOptions extends SpriteOptions {\r\n content?: string | number;\r\n color?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n align?: CanvasTextAlign;\r\n baseline?: CanvasTextBaseline;\r\n}\r\n\r\nexport default class Text extends Sprite {\r\n\r\n public discriminant = 'text';\r\n public tags = new Set(['text']);\r\n\r\n public content: string | number;\r\n public color: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n public align: CanvasTextAlign;\r\n public baseline: CanvasTextBaseline;\r\n\r\n private font: string;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = metrics.width / 2; // half-width\r\n const h = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const width = metrics.width * this.size;\r\n const height = (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent) * this.size;\r\n\r\n ctx.restore();\r\n\r\n path.rect(-width / 2, -height / 2, width, height);\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.color;\r\n c.textAlign = this.align;\r\n c.textBaseline = this.baseline;\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: TextOptions): this {\r\n return new Text(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions,\r\n content: this.content,\r\n color: this.color,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n align: this.align,\r\n baseline: this.baseline\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setColor(color: string) {\r\n this.color = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setAlign(align: CanvasTextAlign) {\r\n this.align = align;\r\n this.refresh();\r\n }\r\n\r\n public setBaseline(baseline: CanvasTextBaseline) {\r\n this.baseline = baseline;\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.color = options?.color ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n this.align = options?.align ?? 'center';\r\n this.baseline = options?.baseline ?? 'middle';\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface ButtonOptions extends SpriteOptions {\r\n content?: string | number;\r\n fontColor?: string;\r\n fontFamily?: string;\r\n fontSize?: number;\r\n\r\n width?: number;\r\n height?: number;\r\n backgroundColor?: string;\r\n\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n}\r\n\r\nexport default class Button extends Sprite {\r\n\r\n public discriminant = 'button';\r\n public tags = new Set(['button']);\r\n\r\n public content: string | number;\r\n public fontColor: string;\r\n public fontFamily: string;\r\n public fontSize: number;\r\n\r\n private font: string;\r\n\r\n public width: number;\r\n public height: number;\r\n public backgroundColor: string;\r\n\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n ctx.save();\r\n \r\n ctx.font = this.font;\r\n\r\n const metrics = ctx.measureText(String(this.content));\r\n const w = Math.max(metrics.width, this.width) / 2; // half-width\r\n const h = Math.max(metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent, this.height) / 2; // half-height\r\n\r\n ctx.restore();\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * (Math.abs(w * cos) + Math.abs(h * sin)) * this.size;\r\n const height = 2 * (Math.abs(w * sin) + Math.abs(h * cos)) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.fillStyle = this.backgroundColor;\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n\r\n const path = this.getCachedPath();\r\n \r\n c.fill(path);\r\n if (this.outlineWidth) c.stroke(path);\r\n\r\n c.font = this.font;\r\n c.fillStyle = this.fontColor;\r\n c.textAlign = 'center';\r\n c.textBaseline = 'middle';\r\n\r\n c.fillText(String(this.content), 0, 0);\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ButtonOptions): this {\r\n return new Button(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n content: this.content,\r\n fontColor: this.fontColor,\r\n fontFamily: this.fontFamily,\r\n fontSize: this.fontSize,\r\n width: this.width,\r\n height: this.height,\r\n backgroundColor: this.backgroundColor,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setContent(content: string | number) {\r\n this.content = content;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setBackgroundColor(color: string) {\r\n this.backgroundColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontColor(color: string) {\r\n this.fontColor = color;\r\n this.refresh();\r\n }\r\n\r\n public setFontSize(fontSize: number) {\r\n this.fontSize = fontSize;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setFontFamily(fontFamily: string) {\r\n this.fontFamily = fontFamily;\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ButtonOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? '';\r\n this.fontColor = options?.fontColor ?? 'black';\r\n this.fontFamily = options?.fontFamily ?? 'Arial';\r\n this.fontSize = options?.fontSize ?? 16;\r\n\r\n this.font = `${this.fontSize}px ${this.fontFamily}`;\r\n\r\n this.width = options?.width ?? String(this.content).length * this.fontSize + 10;\r\n this.height = options?.height ?? this.fontSize + 10;\r\n this.backgroundColor = options?.backgroundColor ?? 'rgb(204, 204, 204)';\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n\r\n this.draw();\r\n }\r\n}","import { canvas } from '@main/canvas.ts';\r\nimport Text, { type TextOptions } from './Text.ts';\r\n\r\nexport default class Watermark extends Text {\r\n\r\n public override tags = new Set(['text', 'watermark']);\r\n\r\n public override create(options?: TextOptions): this {\r\n return new Watermark(options) as this;\r\n }\r\n\r\n constructor(options?: TextOptions) {\r\n super(options);\r\n\r\n this.content = options?.content ?? 'Made with TScratch';\r\n this.x = options?.x ?? -canvas.width / 2 + 5,\r\n this.y = options?.y ?? canvas.height / 2 - 5,\r\n this.align = options?.align ?? 'left',\r\n this.baseline = options?.baseline ?? 'top'\r\n\r\n this.draw();\r\n }\r\n}","import { canvas, ctx, penCtx } from '@main/canvas.ts';\r\nimport Engine from '@main/Engine.ts';\r\nimport Sprite, { type BoundingBox, type SpriteOptions } from '@main/Sprite.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface ImageSpriteOptions extends SpriteOptions {\r\n costumes?: string[];\r\n costumeNumber?: number;\r\n width?: number;\r\n height?: number;\r\n outlineColor?: string;\r\n outlineWidth?: number;\r\n};\r\n\r\nexport default class ImageSprite extends Sprite {\r\n\r\n public discriminant = 'imagesprite';\r\n public tags = new Set(['imagesprite']);\r\n\r\n public costumes: string[];\r\n public costumeNumber: number;\r\n public width: number;\r\n public height: number;\r\n public outlineColor: string;\r\n public outlineWidth: number;\r\n\r\n private imgBitmap: ImageBitmap | null = null;\r\n protected img: HTMLImageElement;\r\n\r\n public getBoundingBox(): BoundingBox {\r\n\r\n const w = this.width / 2; // half-width\r\n const h = this.height / 2; // half-height\r\n\r\n const cos = TSCMath.cos(this.dir);\r\n const sin = TSCMath.sin(this.dir);\r\n\r\n const width = 2 * Math.sqrt((w * cos)**2 + (h * sin)**2) * this.size;\r\n const height = 2 * Math.sqrt((w * sin)**2 + (h * cos)**2) * this.size;\r\n\r\n return {\r\n x: this.x,\r\n y: this.y,\r\n width, height\r\n };\r\n }\r\n\r\n public getPath(): Path2D {\r\n const path = new Path2D();\r\n\r\n path.rect(\r\n -this.width / 2 * this.size,\r\n -this.height / 2 * this.size,\r\n this.width * this.size,\r\n this.height * this.size\r\n );\r\n\r\n return path;\r\n }\r\n\r\n public draw(stamping?: true) {\r\n const c = stamping ? penCtx : ctx;\r\n\r\n c.save();\r\n\r\n const cX = this.x + canvas.width / 2;\r\n const cY = -this.y + canvas.height / 2;\r\n c.translate(cX, cY);\r\n c.rotate(this.toRadians(this.dir));\r\n c.translate(-this.pivot[0], this.pivot[1]);\r\n\r\n c.strokeStyle = this.outlineColor;\r\n c.lineWidth = this.outlineWidth;\r\n c.drawImage(\r\n this.imgBitmap ?? this.img,\r\n 0, 0,\r\n this.img.width,\r\n this.img.height,\r\n -this.width / 2,\r\n -this.height / 2,\r\n this.width, this.height\r\n );\r\n if (this.outlineWidth)\r\n c.stroke(this.getCachedPath());\r\n\r\n c.restore();\r\n }\r\n\r\n public create(options?: ImageSpriteOptions): this {\r\n return new ImageSprite(options) as this;\r\n }\r\n\r\n protected getCreateOptions() {\r\n return {\r\n ...super.getCreateOptions(),\r\n costumes: this.costumes,\r\n costumeNumber: this.costumeNumber,\r\n width: this.width,\r\n height: this.height,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: this.outlineWidth\r\n };\r\n }\r\n\r\n // Methods\r\n\r\n public setCostume(costumeNumber: number) {\r\n this.costumeNumber = costumeNumber < this.costumes.length && costumeNumber >= 0\r\n ? costumeNumber\r\n : 0;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public nextCostume() {\r\n this.costumeNumber = (this.costumeNumber + 1) % this.costumes.length;\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public previousCostume() {\r\n this.costumeNumber--;\r\n if (this.costumeNumber < 0) this.costumeNumber = this.costumes.length - 1;\r\n\r\n this.img.src = this.costumes[this.costumeNumber]!;\r\n this.img.onload = () => {\r\n this.imgBitmap = null;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.refresh()\r\n };\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.invalidatePath();\r\n this.refresh();\r\n }\r\n\r\n // Constructor\r\n\r\n constructor(options?: ImageSpriteOptions) {\r\n super(options);\r\n\r\n this.costumes = options?.costumes ?? [];\r\n this.costumeNumber = options?.costumeNumber && options.costumeNumber < this.costumes.length && options.costumeNumber >= 0\r\n ? options.costumeNumber\r\n : 0;\r\n\r\n this.img = new Image();\r\n this.img.src = this.costumes[this.costumeNumber] ?? '';\r\n\r\n this.width = options?.width ?? 0;\r\n this.height = options?.height ?? 0;\r\n\r\n this.outlineColor = options?.outlineColor ?? 'black';\r\n this.outlineWidth = options?.outlineWidth ?? 0;\r\n \r\n this.img.onload = () => {\r\n if (!options?.width) this.width = this.img.width;\r\n if (!options?.height) this.height = this.img.height;\r\n createImageBitmap(this.img).then(bitmap => {\r\n this.imgBitmap = bitmap;\r\n });\r\n this.draw();\r\n };\r\n }\r\n}","import { canvas } from '@main/canvas.ts';\r\nimport Engine from '@main/Engine.ts';\r\nimport Circle, { type CircleOptions } from '@sprites/Circle.ts';\r\nimport type { RigidBodyOptions } from './RigidBodyOptions.ts';\r\n\r\nexport interface RigidCircleOptions extends CircleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidCircle extends Circle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['circle', 'rigidbody']);\r\n\r\n public gravity: number;\r\n public vX: number;\r\n public vY: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n\r\n public update() {\r\n\r\n this.vY += this.gravity;\r\n this.vY *= this.drag;\r\n this.vX *= this.drag;\r\n\r\n const x = this.x + this.vX;\r\n const y = this.y + this.vY;\r\n\r\n const localCircles = Engine.init().sceneMap.get(this.scene)!.sprites.filter(s => s.discriminant === 'circle');\r\n const globalCircles = Engine.init().sceneMap.get('*')!.sprites.filter(s => s.discriminant === 'circle');\r\n const circles = [...localCircles, ...globalCircles] as Circle[];\r\n\r\n const steps = Math.ceil(this.distanceTo(x, y) / (2 * this.radius));\r\n\r\n for (let i = 0; i < steps; i++) {\r\n for (const circle of circles) {\r\n if (this.distanceTo(circle.x, circle.y) < this.radius + circle.radius) {\r\n\r\n const nx = this.x - circle.x;\r\n const ny = this.y - circle.y;\r\n const dist = Math.sqrt(nx * nx + ny * ny);\r\n\r\n // Avoid division by zero\r\n if (dist === 0) continue;\r\n\r\n const nxn = nx / dist;\r\n const nyn = ny / dist;\r\n\r\n // Dot product of velocity and normal\r\n const dot = this.vX * nxn + this.vY * nyn;\r\n\r\n // Reflect velocity along normal and apply bounceLoss\r\n this.vX = (this.vX - 2 * dot * nxn) * this.bounceLoss;\r\n this.vY = (this.vY - 2 * dot * nyn) * this.bounceLoss;\r\n\r\n this.changeX(this.vX);\r\n this.changeY(this.vY);\r\n\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.goTo(x, y);\r\n\r\n // Bounce off canvas edges\r\n const cX = canvas.width / 2;\r\n const cY = canvas.height / 2;\r\n\r\n if (this.x - this.radius < -cX) {\r\n this.setX(-cX + this.radius);\r\n this.vX = Math.abs(this.vX) * this.bounceLoss;\r\n } else if (this.x + this.radius > cX) {\r\n this.setX(cX - this.radius);\r\n this.vX = -Math.abs(this.vX) * this.bounceLoss;\r\n }\r\n\r\n if (this.y - this.radius < -cY) {\r\n this.setY(-cY + this.radius);\r\n this.vY = Math.abs(this.vY) * this.bounceLoss;\r\n } else if (this.y + this.radius > cY) {\r\n this.setY(cY - this.radius);\r\n this.vY = -Math.abs(this.vY) * this.bounceLoss;\r\n }\r\n }\r\n\r\n constructor(options?: RigidCircleOptions) {\r\n super(options);\r\n\r\n this.gravity = options?.gravity ?? -1.8;\r\n this.drag = options?.drag ?? 0.96;\r\n this.bounceLoss = options?.bounceLoss ?? 0.9;\r\n this.vX = options?.vX ?? 0;\r\n this.vY = options?.vY ?? 0;\r\n }\r\n}","export interface Camera3DOptions {\r\n x: number;\r\n y: number;\r\n z: number;\r\n dirX: number;\r\n dirY: number;\r\n dirZ: number;\r\n}\r\n\r\nexport default class Camera3D {\r\n\r\n public x = 0;\r\n public y = 0;\r\n public z = 0;\r\n public dirX = 0;\r\n public dirY = 0;\r\n public dirZ = 0;\r\n\r\n constructor(options?: Camera3DOptions) {\r\n this.x = options?.x ?? 0;\r\n this.y = options?.y ?? 0;\r\n this.z = options?.z ?? 0;\r\n this.dirX = options?.dirX ?? 0;\r\n this.dirY = options?.dirY ?? 0;\r\n this.dirZ = options?.dirZ ?? 0;\r\n }\r\n}","import Engine from '@main/Engine.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport { canvas } from '@main/canvas.ts';\r\nimport Pen, { type PenOptions } from '@sprites/Pen.ts';\r\nimport type Object3D from './Object3D.ts';\r\nimport type { Vec2, Vec3 } from '@ctypes/Vectors.ts';\r\nimport type Camera3D from './Camera3D.ts';\r\n\r\nexport interface Renderer3DOptions extends PenOptions {\r\n objects: Object3D[];\r\n camera: Camera3D;\r\n}\r\n\r\nexport default abstract class Renderer3D extends Pen {\r\n\r\n public FOV = 60;\r\n public ASPECT = canvas.width / canvas.height;\r\n public Z_NEAR = 0.01;\r\n\r\n public SPEED = 2;\r\n public SENSITIVITY = 225;\r\n\r\n public camera: Camera3D;\r\n\r\n public objects: Object3D[];\r\n\r\n constructor(options: Renderer3DOptions) {\r\n super(options);\r\n this.objects = options.objects;\r\n this.camera = options.camera;\r\n }\r\n\r\n // Render (run every frame)\r\n public abstract render(): void;\r\n\r\n // Controls\r\n public registerControls() {\r\n\r\n const engine = Engine.init();\r\n\r\n const dt = engine.deltaTime;\r\n\r\n const sinY = TSCMath.sin(this.camera.dirY);\r\n const cosY = TSCMath.cos(this.camera.dirY);\r\n\r\n if (engine.keyPressed('w')) {\r\n this.camera.x += this.SPEED * sinY * dt;\r\n this.camera.z += this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('a')) {\r\n this.camera.x -= this.SPEED * cosY * dt;\r\n this.camera.z += this.SPEED * sinY * dt;\r\n }\r\n if (engine.keyPressed('s')) {\r\n this.camera.x -= this.SPEED * sinY * dt;\r\n this.camera.z -= this.SPEED * cosY * dt;\r\n }\r\n if (engine.keyPressed('d')) {\r\n this.camera.x += this.SPEED * cosY * dt;\r\n this.camera.z -= this.SPEED * sinY * dt;\r\n }\r\n\r\n if (engine.keyPressed('e'))\r\n this.camera.y += this.SPEED * dt;\r\n if (engine.keyPressed('q'))\r\n this.camera.y -= this.SPEED * dt;\r\n\r\n if (engine.keyPressed('up'))\r\n this.camera.dirX += this.SENSITIVITY * dt;\r\n if (engine.keyPressed('down'))\r\n this.camera.dirX -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('left'))\r\n this.camera.dirY -= this.SENSITIVITY * dt;\r\n if (engine.keyPressed('right'))\r\n this.camera.dirY += this.SENSITIVITY * dt;\r\n\r\n const maxPitch = 89;\r\n this.camera.dirX = Math.max(-maxPitch, Math.min(maxPitch, this.camera.dirX));\r\n }\r\n\r\n // Perspective projection\r\n protected project(vertices: Vec3[]): Vec2[] {\r\n\r\n const f = 1 / TSCMath.tan(this.FOV / 2);\r\n\r\n return vertices.map(v => {\r\n const x = v[0];\r\n const y = v[1];\r\n const z = v[2] < this.Z_NEAR ? this.Z_NEAR : v[2];\r\n\r\n // Perspective divide for x and y\r\n const xp = canvas.width / 2 * (x * f) / (z * this.ASPECT);\r\n const yp = canvas.height / 2 * (y * f) / z;\r\n\r\n return [xp, yp];\r\n });\r\n }\r\n}","import type { Vec3 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\nimport Renderer3D from './Renderer3D.ts';\r\n\r\nexport default class WireframeRenderer3D extends Renderer3D {\r\n\r\n // Render (run every frame)\r\n public render() {\r\n const sinX = TSCMath.sin(this.camera.dirX);\r\n const cosX = TSCMath.cos(this.camera.dirX);\r\n const sinY = TSCMath.sin(this.camera.dirY);\r\n const cosY = TSCMath.cos(this.camera.dirY);\r\n const sinZ = TSCMath.sin(this.camera.dirZ);\r\n const cosZ = TSCMath.cos(this.camera.dirZ);\r\n\r\n for (const obj of this.objects) {\r\n\r\n const projected = this.project(\r\n obj.vertices.map(v => {\r\n let x = v[0] * obj.size + obj.x - this.camera.x;\r\n let y = v[1] * obj.size + obj.y - this.camera.y;\r\n let z = v[2] * obj.size + obj.z - this.camera.z;\r\n\r\n // Y (yaw)\r\n let x1 = x * cosY - z * sinY;\r\n let z1 = x * sinY + z * cosY;\r\n\r\n // X (pitch)\r\n let y2 = y * cosX - z1 * sinX;\r\n let z2 = y * sinX + z1 * cosX;\r\n\r\n // Z (roll)\r\n let x3 = x1 * cosZ - y2 * sinZ;\r\n let y3 = x1 * sinZ + y2 * cosZ;\r\n\r\n return [x3, y3, z2] as Vec3;\r\n })\r\n );\r\n\r\n this.color = obj.color || 'black';\r\n \r\n for (const f of obj.faces) {\r\n \r\n const [x, y] = projected[f[0]]!;\r\n this.goTo(x, y);\r\n this.down();\r\n \r\n for (const vIndex of f) {\r\n const [x, y] = projected[vIndex]!;\r\n this.goTo(x, y);\r\n }\r\n \r\n this.goTo(x, y);\r\n this.up();\r\n }\r\n }\r\n }\r\n}","import TSCMath from '@main/TSCMath.ts';\r\nimport CustomPolygon from '@sprites/CustomPolygon.ts';\r\nimport type { Vec3 } from '@ctypes/Vectors.ts';\r\nimport Renderer3D from './Renderer3D.ts';\r\n\r\ntype FaceDepth = {\r\n face: number[];\r\n depth: number;\r\n};\r\n\r\nexport default class SolidRenderer3D extends Renderer3D {\r\n\r\n public AMBIENT_LIGHT_INTENSITY = 0.25;\r\n public DIRECTED_LIGHT_INTENSITY = 0.75;\r\n public DIRECTED_LIGHT_DIR: Vec3 = [0, 1, 0];\r\n\r\n // Render (run every frame)\r\n public render() {\r\n const sinX = TSCMath.sin(this.camera.dirX);\r\n const cosX = TSCMath.cos(this.camera.dirX);\r\n const sinY = TSCMath.sin(this.camera.dirY);\r\n const cosY = TSCMath.cos(this.camera.dirY);\r\n const sinZ = TSCMath.sin(this.camera.dirZ);\r\n const cosZ = TSCMath.cos(this.camera.dirZ);\r\n\r\n // Calculate the lighting normal relative to the cameras rotation\r\n let lx = this.DIRECTED_LIGHT_DIR[0];\r\n let ly = this.DIRECTED_LIGHT_DIR[1];\r\n let lz = this.DIRECTED_LIGHT_DIR[2];\r\n\r\n // yaw\r\n const lx1 = lx * cosY - lz * sinY;\r\n const lz1 = lx * sinY + lz * cosY;\r\n\r\n // pitch\r\n const ly2 = ly * cosX - lz1 * sinX;\r\n const lz2 = ly * sinX + lz1 * cosX;\r\n\r\n // roll\r\n const lx3 = lx1 * cosZ - ly2 * sinZ;\r\n const ly3 = lx1 * sinZ + ly2 * cosZ;\r\n\r\n const lightDir = TSCMath.normalize([lx3, ly3, lz2]);\r\n\r\n for (const obj of this.objects) {\r\n\r\n const { h, s, l } = SolidRenderer3D.stringToHSL(obj.color || 'black');\r\n\r\n // Camera relative vertices\r\n const cameraVerts: Vec3[] = obj.vertices.map(v => {\r\n let x = v[0] * obj.size + obj.x - this.camera.x;\r\n let y = v[1] * obj.size + obj.y - this.camera.y;\r\n let z = v[2] * obj.size + obj.z - this.camera.z;\r\n\r\n // yaw (Y)\r\n const x1 = x * cosY - z * sinY;\r\n const z1 = x * sinY + z * cosY;\r\n\r\n // pitch (X)\r\n const y2 = y * cosX - z1 * sinX;\r\n const z2 = y * sinX + z1 * cosX;\r\n\r\n // roll (Z)\r\n const x3 = x1 * cosZ - y2 * sinZ;\r\n const y3 = x1 * sinZ + y2 * cosZ;\r\n\r\n return [x3, y3, z2];\r\n });\r\n\r\n // Face depth calculation\r\n const faces: FaceDepth[] = obj.faces.map(face => {\r\n let z = 0;\r\n for (const i of face) z += cameraVerts[i]![2];\r\n return { face, depth: z / face.length };\r\n });\r\n\r\n // Painter's algorithm (face sorting)\r\n faces.sort((a, b) => b.depth - a.depth);\r\n\r\n const projected = this.project(cameraVerts);\r\n\r\n // Render faces\r\n for (const { face } of faces) {\r\n\r\n // Calculate face normal using Newell's method (works for polygons with any number of vertices)\r\n let nx = 0, ny = 0, nz = 0;\r\n for (let i = 0; i < face.length; i++) {\r\n const v1 = cameraVerts[face[i]!]!;\r\n const v2 = cameraVerts[face[(i + 1) % face.length]!]!;\r\n nx += (v1[1] - v2[1]) * (v1[2] + v2[2]);\r\n ny += (v1[2] - v2[2]) * (v1[0] + v2[0]);\r\n nz += (v1[0] - v2[0]) * (v1[1] + v2[1]);\r\n }\r\n const normal = TSCMath.normalize([nx, ny, nz] as Vec3);\r\n\r\n // Calculate lighting: dot product between normal and light direction\r\n const diffuse = Math.max(0, TSCMath.dot(normal, lightDir));\r\n const brightness =\r\n this.AMBIENT_LIGHT_INTENSITY +\r\n diffuse * this.DIRECTED_LIGHT_INTENSITY;\r\n\r\n // Adjust the brightness\r\n const litL = Math.min(100, Math.max(5, l + brightness * 50));\r\n const color = `hsl(${h}, ${s}%, ${litL}%)`;\r\n\r\n // Draw the polygon\r\n const vertices = face.map(vIndex => projected[vIndex]!);\r\n this.drawSprite(new CustomPolygon({ vertices, color }));\r\n }\r\n }\r\n }\r\n\r\n // String -> HSL conversion helper\r\n public static stringToHSL(color: string) {\r\n\r\n // String to RGB\r\n const el = document.createElement('div');\r\n el.style.color = color;\r\n\r\n document.body.appendChild(el);\r\n const rgb = getComputedStyle(el).color;\r\n document.body.removeChild(el);\r\n\r\n let [r, g, b] = rgb.match(/\\d+/g)!.map(Number) as [number, number, number];\r\n\r\n // RGB to HSL\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h = 0;\r\n let s = 0;\r\n let l = (max + min) / 2;\r\n\r\n if (max === min)\r\n h = s = 0; // achromatic\r\n else {\r\n const d = max - min;\r\n s = l > 0.5\r\n ? d / (2 - max - min)\r\n : d / (max + min);\r\n\r\n switch (max) {\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n }\r\n h *= 60;\r\n }\r\n\r\n return { h, s: s * 100, l: l * 100 };\r\n }\r\n}","import TSCMath from '@main/TSCMath.ts';\r\nimport type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nexport interface Object3DOptions {\r\n vertices: Vec3[];\r\n faces: [number, number, ...number[]][];\r\n\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n\r\n dirX?: number;\r\n dirY?: number;\r\n dirZ?: number;\r\n\r\n color?: string;\r\n\r\n size?: number;\r\n}\r\n\r\nexport default class Object3D {\r\n\r\n public x: number;\r\n public y: number;\r\n public z: number;\r\n\r\n public dirX: number;\r\n public dirY: number;\r\n public dirZ: number;\r\n\r\n public color: string;\r\n\r\n public size: number;\r\n\r\n public vertices: Vec3[];\r\n public faces: [number, number, ...number[]][];\r\n\r\n constructor(options: Object3DOptions) {\r\n this.vertices = options.vertices;\r\n this.faces = options.faces;\r\n\r\n this.x = options.x ?? 0;\r\n this.y = options.y ?? 0;\r\n this.z = options.z ?? 2;\r\n\r\n this.dirX = options.dirX ?? 0;\r\n this.dirY = options.dirY ?? 0;\r\n this.dirZ = options.dirZ ?? 0;\r\n\r\n this.color = options.color ?? 'black';\r\n\r\n this.size = options.size ?? 1;\r\n }\r\n\r\n public rotateX(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [_, y, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![1] = y * cos - z * sin;\r\n this.vertices[i]![2] = y * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateY(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, _, z] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos + z * sin;\r\n this.vertices[i]![2] = -x * sin + z * cos;\r\n }\r\n }\r\n\r\n public rotateZ(deg: number) {\r\n const cos = TSCMath.cos(deg);\r\n const sin = TSCMath.sin(deg);\r\n\r\n for (let i = 0; i < this.vertices.length; i++) {\r\n const [x, y, _] = this.vertices[i]!;\r\n\r\n this.vertices[i]![0] = x * cos - y * sin;\r\n this.vertices[i]![1] = x * sin + y * cos;\r\n }\r\n }\r\n\r\n public pointX(deg: number) {\r\n const delta = deg - this.dirX;\r\n this.dirX = deg;\r\n this.rotateX(delta);\r\n }\r\n\r\n public pointY(deg: number) {\r\n const delta = deg - this.dirY;\r\n this.dirY = deg;\r\n this.rotateY(delta);\r\n }\r\n\r\n public pointZ(deg: number) {\r\n const delta = deg - this.dirZ;\r\n this.dirZ = deg;\r\n this.rotateZ(delta);\r\n }\r\n\r\n // Parses an .obj file\r\n public static loadObj(data: string) {\r\n\r\n const lines = data.split('\\n');\r\n\r\n // Vertices\r\n const vertices = lines\r\n .filter(l => l.startsWith('v '))\r\n .map(l => l.split(' ').slice(1).map(parseFloat)) as Vec3[];\r\n\r\n // Faces\r\n const faces = lines\r\n .filter(l => l.startsWith('f '))\r\n .map(l => l.split(' ').slice(1).map(\r\n f => parseInt(f.split('/')[0]!) - 1\r\n )) as [number, number, ...number[]][];\r\n\r\n return { vertices, faces };\r\n }\r\n}","export const tetrahedronFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2],\r\n [0, 3, 1],\r\n [0, 2, 3],\r\n [1, 3, 2]\r\n];\r\n\r\nexport default tetrahedronFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nexport const tetrahedronVertices: Vec3[] = [\r\n [ 1, 1, 1],\r\n [-1, -1, 1],\r\n [-1, 1, -1],\r\n [ 1, -1, -1]\r\n];\r\n\r\nexport default tetrahedronVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport tetrahedronFaces from './faces/tetrahedron.ts';\r\nimport tetrahedronVertices from './vertices/tetrahedron.ts';\r\n\r\nexport default class Tetrahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: tetrahedronVertices,\r\n faces: tetrahedronFaces\r\n });\r\n }\r\n}","const cuboidFaces: [number, number, ...number[]][] = [\r\n [0, 1, 2, 3],\r\n [4, 5, 6, 7],\r\n [3, 2, 6, 7],\r\n [0, 1, 5, 4],\r\n [0, 3, 7, 4],\r\n [1, 2, 6, 5]\r\n];\r\n\r\nexport default cuboidFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nexport default function getCuboidVertices(width: number, height: number, length: number): Vec3[] {\r\n\r\n return [\r\n // Bottom\r\n [-0.5 * width, -0.5 * height, -0.5 * length],\r\n [0.5 * width, -0.5 * height, -0.5 * length],\r\n [0.5 * width, -0.5 * height, 0.5 * length],\r\n [-0.5 * width, -0.5 * height, 0.5 * length],\r\n // Top\r\n [-0.5 * width, 0.5 * height, -0.5 * length],\r\n [0.5 * width, 0.5 * height, -0.5 * length],\r\n [0.5 * width, 0.5 * height, 0.5 * length],\r\n [-0.5 * width, 0.5 * height, 0.5 * length]\r\n ];\r\n}","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport cuboidFaces from './faces/cuboid.ts';\r\nimport getCuboidVertices from './vertices/cuboid.ts';\r\n\r\nexport default class Cube extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: getCuboidVertices(1, 1, 1),\r\n faces: cuboidFaces\r\n });\r\n }\r\n}","export const octahedronFaces: [number, number, ...number[]][] = [\r\n [0, 2, 4],\r\n [2, 1, 4],\r\n [1, 3, 4],\r\n [3, 0, 4],\r\n\r\n [2, 0, 5],\r\n [1, 2, 5],\r\n [3, 1, 5],\r\n [0, 3, 5]\r\n];\r\n\r\nexport default octahedronFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nexport const octahedronVerticesVertices: Vec3[] = [\r\n [ 1, 0, 0],\r\n [-1, 0, 0],\r\n [ 0, 1, 0],\r\n [ 0, -1, 0],\r\n [ 0, 0, 1],\r\n [ 0, 0, -1]\r\n];\r\n\r\nexport default octahedronVerticesVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport octahedronFaces from './faces/octahedron.ts';\r\nimport octahedronVertices from './vertices/octahedron.ts';\r\n\r\nexport default class Octahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: octahedronVertices,\r\n faces: octahedronFaces\r\n });\r\n }\r\n}","const icosahedronFaces: [number, number, number][] = [\r\n [0, 4, 8], [0, 8, 9], [0, 9, 6], [0, 6, 1], [0, 1, 4],\r\n [3, 10, 5], [3, 5, 2], [3, 2, 7], [3, 7, 11], [3, 11, 10],\r\n [4, 1, 6], [4, 6, 9],\r\n [8, 4, 10], [8, 10, 5], \r\n [9, 8, 2], [9, 2, 7], \r\n [6, 9, 7], [6, 7, 11],\r\n [1, 6, 11], [1, 11, 10] \r\n];\r\n\r\nexport default icosahedronFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nconst phi = (1 + Math.sqrt(5)) / 2;\r\nconst a = 0.5 / phi;\r\nconst b = 0.5;\r\n\r\nconst icosahedronVertices: Vec3[] = [\r\n // (0, ±1, ±φ)\r\n [0, -b, -a * phi], [0, -b, a * phi], [0, b, -a * phi], [0, b, a * phi],\r\n // (±1, ±φ, 0)\r\n [-b, -a * phi, 0], [-b, a * phi, 0], [b, -a * phi, 0], [b, a * phi, 0],\r\n // (±φ, 0, ±1)\r\n [-a * phi, 0, -b], [a * phi, 0, -b], [-a * phi, 0, b], [a * phi, 0, b]\r\n];\r\n\r\nexport default icosahedronVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport icosahedronFaces from './faces/icosahedron.ts';\r\nimport icosahedronVertices from './vertices/icosahedron.ts';\r\n\r\nexport default class Icosahedron extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: icosahedronVertices,\r\n faces: icosahedronFaces\r\n });\r\n }\r\n}","const icosphereFaces: [number, number, number][] = [\r\n [0, 13, 12], [1, 13, 15], [0, 12, 17], [0, 17, 19], [0, 19, 16],\r\n [1, 15, 22], [2, 14, 24], [3, 18, 26], [4, 20, 28], [5, 21, 30],\r\n [1, 22, 25], [2, 24, 27], [3, 26, 29], [4, 28, 31], [5, 30, 23],\r\n [6, 32, 37], [7, 33, 39], [8, 34, 40], [9, 35, 41], [10, 36, 38],\r\n [38, 41, 11], [38, 36, 41], [36, 9, 41], [41, 40, 11], [41, 35, 40],\r\n [35, 8, 40], [40, 39, 11], [40, 34, 39], [34, 7, 39], [39, 37, 11],\r\n [39, 33, 37], [33, 6, 37], [37, 38, 11], [37, 32, 38], [32, 10, 38],\r\n [23, 36, 10], [23, 30, 36], [30, 9, 36], [31, 35, 9], [31, 28, 35],\r\n [28, 8, 35], [29, 34, 8], [29, 26, 34], [26, 7, 34], [27, 33, 7],\r\n [27, 24, 33], [24, 6, 33], [25, 32, 6], [25, 22, 32], [22, 10, 32],\r\n [30, 31, 9], [30, 21, 31], [21, 4, 31], [28, 29, 8], [28, 20, 29],\r\n [20, 3, 29], [26, 27, 7], [26, 18, 27], [18, 2, 27], [24, 25, 6],\r\n [24, 14, 25], [14, 1, 25], [22, 23, 10], [22, 15, 23], [15, 5, 23],\r\n [16, 21, 5], [16, 19, 21], [19, 4, 21], [19, 20, 4], [19, 17, 20],\r\n [17, 3, 20], [17, 18, 3], [17, 12, 18], [12, 2, 18], [15, 16, 5],\r\n [15, 13, 16], [13, 0, 16], [12, 14, 2], [12, 13, 14], [13, 1, 14]\r\n];\r\n\r\nexport default icosphereFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nconst icosphereVertices: Vec3[] = [\r\n [0.000000, -1.000000, 0.000000], [0.723607, -0.447220, 0.525725], [-0.276388, -0.447220, 0.850649],\r\n [-0.894426, -0.447216, 0.000000], [-0.276388, -0.447220, -0.850649], [0.723607, -0.447220, -0.525725],\r\n [0.276388, 0.447220, 0.850649], [-0.723607, 0.447220, 0.525725], [-0.723607, 0.447220, -0.525725],\r\n [0.276388, 0.447220, -0.850649], [0.894426, 0.447216, 0.000000], [0.000000, 1.000000, 0.000000],\r\n [-0.162456, -0.850654, 0.499995], [0.425323, -0.850654, 0.309011], [0.262869, -0.525738, 0.809012],\r\n [0.850648, -0.525736, 0.000000], [0.425323, -0.850654, -0.309011], [-0.525730, -0.850652, 0.000000],\r\n [-0.688189, -0.525736, 0.499997], [-0.162456, -0.850654, -0.499995], [-0.688189, -0.525736, -0.499997],\r\n [0.262869, -0.525738, -0.809012], [0.951058, 0.000000, 0.309013], [0.951058, 0.000000, -0.309013],\r\n [0.000000, 0.000000, 1.000000], [0.587786, 0.000000, 0.809017], [-0.951058, 0.000000, 0.309013],\r\n [-0.587786, 0.000000, 0.809017], [-0.587786, 0.000000, -0.809017], [-0.951058, 0.000000, -0.309013],\r\n [0.587786, 0.000000, -0.809017], [0.000000, 0.000000, -1.000000], [0.688189, 0.525736, 0.499997],\r\n [-0.262869, 0.525738, 0.809012], [-0.850648, 0.525736, 0.000000], [-0.262869, 0.525738, -0.809012],\r\n [0.688189, 0.525736, -0.499997], [0.162456, 0.850654, 0.499995], [0.525730, 0.850652, 0.000000],\r\n [-0.425323, 0.850654, 0.309011], [-0.425323, 0.850654, -0.309011], [0.162456, 0.850654, -0.499995]\r\n];\r\n\r\nexport default icosphereVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport icosphereFaces from './faces/icosphere.ts';\r\nimport icosphereVertices from './vertices/icosphere.ts';\r\n\r\nexport default class Icosphere extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: icosphereVertices,\r\n faces: icosphereFaces\r\n });\r\n }\r\n}","const monkeyFaces: [number, number, ...number[]][] = [\r\n [46,0,2,44],[3,1,47,45],[44,2,4,42],\r\n [5,3,45,43],[2,8,6,4],[7,9,3,5],\r\n [0,10,8,2],[9,11,1,3],[10,12,14,8],\r\n [15,13,11,9],[8,14,16,6],[17,15,9,7],\r\n [14,20,18,16],[19,21,15,17],[12,22,20,14],\r\n [21,23,13,15],[22,24,26,20],[27,25,23,21],\r\n [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]\r\n]\r\n\r\nexport default monkeyFaces;","import type { Vec3 } from '@ctypes/Vectors.ts';\r\n\r\nconst monkeyVertices: Vec3[] = [\r\n [0.4375,0.164062,0.765625],\r\n [-0.4375,0.164062,0.765625],\r\n [0.5,0.09375,0.6875],\r\n [-0.5,0.09375,0.6875],\r\n [0.546875,0.054688,0.578125],\r\n [-0.546875,0.054688,0.578125],\r\n [0.351562,-0.023438,0.617188],\r\n [-0.351562,-0.023438,0.617188],\r\n [0.351562,0.03125,0.71875],\r\n [-0.351562,0.03125,0.71875],\r\n [0.351562,0.132812,0.78125],\r\n [-0.351562,0.132812,0.78125],\r\n [0.273438,0.164062,0.796875],\r\n [-0.273438,0.164062,0.796875],\r\n [0.203125,0.09375,0.742188],\r\n [-0.203125,0.09375,0.742188],\r\n [0.15625,0.054688,0.648438],\r\n [-0.15625,0.054688,0.648438],\r\n [0.078125,0.242188,0.65625],\r\n [-0.078125,0.242188,0.65625],\r\n [0.140625,0.242188,0.742188],\r\n [-0.140625,0.242188,0.742188],\r\n [0.242188,0.242188,0.796875],\r\n [-0.242188,0.242188,0.796875],\r\n [0.273438,0.328125,0.796875],\r\n [-0.273438,0.328125,0.796875],\r\n [0.203125,0.390625,0.742188],\r\n [-0.203125,0.390625,0.742188]\r\n ,[0.15625,0.4375,0.648438],[-0.15625,0.4375,0.648438],[0.351562,0.515625,0.617188],\r\n [-0.351562,0.515625,0.617188],[0.351562,0.453125,0.71875],[-0.351562,0.453125,0.71875],\r\n [0.351562,0.359375,0.78125],[-0.351562,0.359375,0.78125],[0.4375,0.328125,0.765625],\r\n [-0.4375,0.328125,0.765625],[0.5,0.390625,0.6875],[-0.5,0.390625,0.6875],\r\n [0.546875,0.4375,0.578125],[-0.546875,0.4375,0.578125],[0.625,0.242188,0.5625],\r\n [-0.625,0.242188,0.5625],[0.5625,0.242188,0.671875],[-0.5625,0.242188,0.671875],\r\n [0.46875,0.242188,0.757812],[-0.46875,0.242188,0.757812],[0.476562,0.242188,0.773438],\r\n [-0.476562,0.242188,0.773438],[0.445312,0.335938,0.78125],[-0.445312,0.335938,0.78125],\r\n [0.351562,0.375,0.804688],[-0.351562,0.375,0.804688],[0.265625,0.335938,0.820312],\r\n [-0.265625,0.335938,0.820312],[0.226562,0.242188,0.820312],[-0.226562,0.242188,0.820312],\r\n [0.265625,0.15625,0.820312],[-0.265625,0.15625,0.820312],[0.351562,0.242188,0.828125],\r\n [-0.351562,0.242188,0.828125],[0.351562,0.117188,0.804688],[-0.351562,0.117188,0.804688],\r\n [0.445312,0.15625,0.78125],[-0.445312,0.15625,0.78125],[0,0.429688,0.742188],[0,0.351562,0.820312],\r\n [0,-0.679688,0.734375],[0,-0.320312,0.78125],[0,-0.1875,0.796875],[0,-0.773438,0.71875],[0,0.40625,0.601562],[0,0.570312,0.570312],[0,0.898438,-0.546875],[0,0.5625,-0.851562],[0,0.070312,-0.828125],[0,-0.382812,-0.351562],[0.203125,-0.1875,0.5625],[-0.203125,-0.1875,0.5625],[0.3125,-0.4375,0.570312],[-0.3125,-0.4375,0.570312],[0.351562,-0.695312,0.570312],[-0.351562,-0.695312,0.570312],[0.367188,-0.890625,0.53125],[-0.367188,-0.890625,0.53125],[0.328125,-0.945312,0.523438],[-0.328125,-0.945312,0.523438],[0.179688,-0.96875,0.554688],[-0.179688,-0.96875,0.554688],[0,-0.984375,0.578125],[0.4375,-0.140625,0.53125],[-0.4375,-0.140625,0.53125],[0.632812,-0.039062,0.539062],[-0.632812,-0.039062,0.539062],[0.828125,0.148438,0.445312],[-0.828125,0.148438,0.445312],[0.859375,0.429688,0.59375],[-0.859375,0.429688,0.59375],[0.710938,0.484375,0.625],[-0.710938,0.484375,0.625],[0.492188,0.601562,0.6875],[-0.492188,0.601562,0.6875],[0.320312,0.757812,0.734375],[-0.320312,0.757812,0.734375],[0.15625,0.71875,0.757812],[-0.15625,0.71875,0.757812],[0.0625,0.492188,0.75],[-0.0625,0.492188,0.75],[0.164062,0.414062,0.773438],[-0.164062,0.414062,0.773438],[0.125,0.304688,0.765625],[-0.125,0.304688,0.765625],[0.203125,0.09375,0.742188],[-0.203125,0.09375,0.742188],[0.375,0.015625,0.703125],[-0.375,0.015625,0.703125],[0.492188,0.0625,0.671875],[-0.492188,0.0625,0.671875],[0.625,0.1875,0.648438],[-0.625,0.1875,0.648438],[0.640625,0.296875,0.648438],[-0.640625,0.296875,0.648438],[0.601562,0.375,0.664062],[-0.601562,0.375,0.664062],[0.429688,0.4375,0.71875],[-0.429688,0.4375,0.71875],[0.25,0.46875,0.757812],[-0.25,0.46875,0.757812],[0,-0.765625,0.734375],[0.109375,-0.71875,0.734375],[-0.109375,-0.71875,0.734375],[0.117188,-0.835938,0.710938],[-0.117188,-0.835938,0.710938],[0.0625,-0.882812,0.695312],[-0.0625,-0.882812,0.695312],[0,-0.890625,0.6875],[0,-0.195312,0.75],[0,-0.140625,0.742188],[0.101562,-0.148438,0.742188],[-0.101562,-0.148438,0.742188],[0.125,-0.226562,0.75],[-0.125,-0.226562,0.75],[0.085938,-0.289062,0.742188],[-0.085938,-0.289062,0.742188],[0.398438,-0.046875,0.671875],[-0.398438,-0.046875,0.671875],[0.617188,0.054688,0.625],[-0.617188,0.054688,0.625],[0.726562,0.203125,0.601562],[-0.726562,0.203125,0.601562],[0.742188,0.375,0.65625],[-0.742188,0.375,0.65625],[0.6875,0.414062,0.726562],[-0.6875,0.414062,0.726562],[0.4375,0.546875,0.796875],[-0.4375,0.546875,0.796875],[0.3125,0.640625,0.835938],[-0.3125,0.640625,0.835938],[0.203125,0.617188,0.851562],[-0.203125,0.617188,0.851562],[0.101562,0.429688,0.84375],[-0.101562,0.429688,0.84375],[0.125,-0.101562,0.8125],[-0.125,-0.101562,0.8125],[0.210938,-0.445312,0.710938],[-0.210938,-0.445312,0.710938],[0.25,-0.703125,0.6875],[-0.25,-0.703125,0.6875],[0.265625,-0.820312,0.664062],[-0.265625,-0.820312,0.664062],[0.234375,-0.914062,0.632812],[-0.234375,-0.914062,0.632812],[0.164062,-0.929688,0.632812],[-0.164062,-0.929688,0.632812],[0,-0.945312,0.640625],[0,0.046875,0.726562],[0,0.210938,0.765625],[0.328125,0.476562,0.742188],[-0.328125,0.476562,0.742188],[0.164062,0.140625,0.75],[-0.164062,0.140625,0.75],[0.132812,0.210938,0.757812],[-0.132812,0.210938,0.757812],[0.117188,-0.6875,0.734375],[-0.117188,-0.6875,0.734375],[0.078125,-0.445312,0.75],[-0.078125,-0.445312,0.75],[0,-0.445312,0.75],[0,-0.328125,0.742188],[0.09375,-0.273438,0.78125],[-0.09375,-0.273438,0.78125],[0.132812,-0.226562,0.796875],[-0.132812,-0.226562,0.796875],[0.109375,-0.132812,0.78125],[-0.109375,-0.132812,0.78125],[0.039062,-0.125,0.78125],[-0.039062,-0.125,0.78125],[0,-0.203125,0.828125],[0.046875,-0.148438,0.8125],[-0.046875,-0.148438,0.8125],[0.09375,-0.15625,0.8125],[-0.09375,-0.15625,0.8125],[0.109375,-0.226562,0.828125],[-0.109375,-0.226562,0.828125],[0.078125,-0.25,0.804688],[-0.078125,-0.25,0.804688],[0,-0.289062,0.804688],[0.257812,-0.3125,0.554688],[-0.257812,-0.3125,0.554688],[0.164062,-0.242188,0.710938],[-0.164062,-0.242188,0.710938],[0.179688,-0.3125,0.710938],[-0.179688,-0.3125,0.710938],[0.234375,-0.25,0.554688],[-0.234375,-0.25,0.554688],[0,-0.875,0.6875],[0.046875,-0.867188,0.6875],[-0.046875,-0.867188,0.6875],[0.09375,-0.820312,0.710938],[-0.09375,-0.820312,0.710938],[0.09375,-0.742188,0.726562],[-0.09375,-0.742188,0.726562],[0,-0.78125,0.65625],[0.09375,-0.75,0.664062],[-0.09375,-0.75,0.664062],[0.09375,-0.8125,0.640625],[-0.09375,-0.8125,0.640625],[0.046875,-0.851562,0.632812],[-0.046875,-0.851562,0.632812],[0,-0.859375,0.632812],[0.171875,0.21875,0.78125],[-0.171875,0.21875,0.78125],[0.1875,0.15625,0.773438],[-0.1875,0.15625,0.773438],[0.335938,0.429688,0.757812],[-0.335938,0.429688,0.757812],[0.273438,0.421875,0.773438],[-0.273438,0.421875,0.773438],[0.421875,0.398438,0.773438],[-0.421875,0.398438,0.773438],[0.5625,0.351562,0.695312],[-0.5625,0.351562,0.695312],[0.585938,0.289062,0.6875],[-0.585938,0.289062,0.6875],[0.578125,0.195312,0.679688],[-0.578125,0.195312,0.679688],[0.476562,0.101562,0.71875],[-0.476562,0.101562,0.71875],[0.375,0.0625,0.742188],[-0.375,0.0625,0.742188],[0.226562,0.109375,0.78125],[-0.226562,0.109375,0.78125],[0.179688,0.296875,0.78125],[-0.179688,0.296875,0.78125],[0.210938,0.375,0.78125],[-0.210938,0.375,0.78125],[0.234375,0.359375,0.757812],[-0.234375,0.359375,0.757812],[0.195312,0.296875,0.757812],[-0.195312,0.296875,0.757812],[0.242188,0.125,0.757812],[-0.242188,0.125,0.757812],[0.375,0.085938,0.726562],[-0.375,0.085938,0.726562],[0.460938,0.117188,0.703125],[-0.460938,0.117188,0.703125],[0.546875,0.210938,0.671875],[-0.546875,0.210938,0.671875],[0.554688,0.28125,0.671875],[-0.554688,0.28125,0.671875],[0.53125,0.335938,0.679688],[-0.53125,0.335938,0.679688],[0.414062,0.390625,0.75],[-0.414062,0.390625,0.75],[0.28125,0.398438,0.765625],[-0.28125,0.398438,0.765625],[0.335938,0.40625,0.75],[-0.335938,0.40625,0.75],[0.203125,0.171875,0.75],[-0.203125,0.171875,0.75],[0.195312,0.226562,0.75],[-0.195312,0.226562,0.75],[0.109375,0.460938,0.609375],[-0.109375,0.460938,0.609375],[0.195312,0.664062,0.617188],[-0.195312,0.664062,0.617188],[0.335938,0.6875,0.59375],[-0.335938,0.6875,0.59375],[0.484375,0.554688,0.554688],[-0.484375,0.554688,0.554688],[0.679688,0.453125,0.492188],[-0.679688,0.453125,0.492188],[0.796875,0.40625,0.460938],[-0.796875,0.40625,0.460938],[0.773438,0.164062,0.375],[-0.773438,0.164062,0.375],[0.601562,0,0.414062],[-0.601562,0,0.414062],[0.4375,-0.09375,0.46875],[-0.4375,-0.09375,0.46875],[0,0.898438,0.289062],[0,0.984375,-0.078125],[0,-0.195312,-0.671875],[0,-0.460938,0.1875],[0,-0.976562,0.460938],[0,-0.804688,0.34375],[0,-0.570312,0.320312],[0,-0.484375,0.28125],[0.851562,0.234375,0.054688],[-0.851562,0.234375,0.054688],[0.859375,0.320312,-0.046875],[-0.859375,0.320312,-0.046875],[0.773438,0.265625,-0.4375],[-0.773438,0.265625,-0.4375],[0.460938,0.4375,-0.703125],[-0.460938,0.4375,-0.703125],[0.734375,-0.046875,0.070312],[-0.734375,-0.046875,0.070312],[0.59375,-0.125,-0.164062],[-0.59375,-0.125,-0.164062],[0.640625,-0.007812,-0.429688],[-0.640625,-0.007812,-0.429688],[0.335938,0.054688,-0.664062],[-0.335938,0.054688,-0.664062],[0.234375,-0.351562,0.40625],[-0.234375,-0.351562,0.40625],[0.179688,-0.414062,0.257812],[-0.179688,-0.414062,0.257812],[0.289062,-0.710938,0.382812],[-0.289062,-0.710938,0.382812],[0.25,-0.5,0.390625],[-0.25,-0.5,0.390625],[0.328125,-0.914062,0.398438],[-0.328125,-0.914062,0.398438],[0.140625,-0.757812,0.367188],[-0.140625,-0.757812,0.367188],[0.125,-0.539062,0.359375],[-0.125,-0.539062,0.359375],[0.164062,-0.945312,0.4375],[-0.164062,-0.945312,0.4375],[0.21875,-0.28125,0.429688],[-0.21875,-0.28125,0.429688],[0.210938,-0.226562,0.46875],[-0.210938,-0.226562,0.46875],[0.203125,-0.171875,0.5],[-0.203125,-0.171875,0.5],[0.210938,-0.390625,0.164062],[-0.210938,-0.390625,0.164062],[0.296875,-0.3125,-0.265625],[-0.296875,-0.3125,-0.265625],[0.34375,-0.148438,-0.539062],[-0.34375,-0.148438,-0.539062],[0.453125,0.867188,-0.382812],[-0.453125,0.867188,-0.382812],[0.453125,0.929688,-0.070312],[-0.453125,0.929688,-0.070312],[0.453125,0.851562,0.234375],[-0.453125,0.851562,0.234375],[0.460938,0.523438,0.429688],[-0.460938,0.523438,0.429688],[0.726562,0.40625,0.335938],[-0.726562,0.40625,0.335938],[0.632812,0.453125,0.28125],[-0.632812,0.453125,0.28125],[0.640625,0.703125,0.054688],[-0.640625,0.703125,0.054688],[0.796875,0.5625,0.125],[-0.796875,0.5625,0.125],[0.796875,0.617188,-0.117188],[-0.796875,0.617188,-0.117188],[0.640625,0.75,-0.195312],[-0.640625,0.75,-0.195312],[0.640625,0.679688,-0.445312],[-0.640625,0.679688,-0.445312],[0.796875,0.539062,-0.359375],[-0.796875,0.539062,-0.359375],[0.617188,0.328125,-0.585938],[-0.617188,0.328125,-0.585938],[0.484375,0.023438,-0.546875],[-0.484375,0.023438,-0.546875],[0.820312,0.328125,-0.203125],[-0.820312,0.328125,-0.203125],[0.40625,-0.171875,0.148438],[-0.40625,-0.171875,0.148438],[0.429688,-0.195312,-0.210938],[-0.429688,-0.195312,-0.210938],[0.890625,0.40625,-0.234375],[-0.890625,0.40625,-0.234375],[0.773438,-0.140625,-0.125],[-0.773438,-0.140625,-0.125],[1.039062,-0.101562,-0.328125],[-1.039062,-0.101562,-0.328125],[1.28125,0.054688,-0.429688],[-1.28125,0.054688,-0.429688],[1.351562,0.320312,-0.421875],[-1.351562,0.320312,-0.421875],[1.234375,0.507812,-0.421875],[-1.234375,0.507812,-0.421875],[1.023438,0.476562,-0.3125],[-1.023438,0.476562,-0.3125],[1.015625,0.414062,-0.289062],[-1.015625,0.414062,-0.289062],[1.1875,0.4375,-0.390625],[-1.1875,0.4375,-0.390625],[1.265625,0.289062,-0.40625],[-1.265625,0.289062,-0.40625],[1.210938,0.078125,-0.40625],[-1.210938,0.078125,-0.40625],[1.03125,-0.039062,-0.304688],[-1.03125,-0.039062,-0.304688],[0.828125,-0.070312,-0.132812],[-0.828125,-0.070312,-0.132812],[0.921875,0.359375,-0.21875],[-0.921875,0.359375,-0.21875],[0.945312,0.304688,-0.289062],[-0.945312,0.304688,-0.289062],[0.882812,-0.023438,-0.210938],[-0.882812,-0.023438,-0.210938],[1.039062,0,-0.367188],[-1.039062,0,-0.367188],[1.1875,0.09375,-0.445312],[-1.1875,0.09375,-0.445312],[1.234375,0.25,-0.445312],[-1.234375,0.25,-0.445312],[1.171875,0.359375,-0.4375],[-1.171875,0.359375,-0.4375],[1.023438,0.34375,-0.359375],[-1.023438,0.34375,-0.359375],[0.84375,0.289062,-0.210938],[-0.84375,0.289062,-0.210938],[0.835938,0.171875,-0.273438],[-0.835938,0.171875,-0.273438],[0.757812,0.09375,-0.273438],[-0.757812,0.09375,-0.273438],[0.820312,0.085938,-0.273438],[-0.820312,0.085938,-0.273438],[0.84375,0.015625,-0.273438],[-0.84375,0.015625,-0.273438],[0.8125,-0.015625,-0.273438],[-0.8125,-0.015625,-0.273438],[0.726562,0,-0.070312],[-0.726562,0,-0.070312],[0.71875,-0.023438,-0.171875],[-0.71875,-0.023438,-0.171875],[0.71875,0.039062,-0.1875],[-0.71875,0.039062,-0.1875],[0.796875,0.203125,-0.210938],[-0.796875,0.203125,-0.210938],[0.890625,0.242188,-0.265625],[-0.890625,0.242188,-0.265625],[0.890625,0.234375,-0.320312],[-0.890625,0.234375,-0.320312],[0.8125,-0.015625,-0.320312],[-0.8125,-0.015625,-0.320312],[0.851562,0.015625,-0.320312],[-0.851562,0.015625,-0.320312],[0.828125,0.078125,-0.320312],[-0.828125,0.078125,-0.320312],[0.765625,0.09375,-0.320312],[-0.765625,0.09375,-0.320312],[0.84375,0.171875,-0.320312],[-0.84375,0.171875,-0.320312],[1.039062,0.328125,-0.414062],[-1.039062,0.328125,-0.414062],[1.1875,0.34375,-0.484375],[-1.1875,0.34375,-0.484375],[1.257812,0.242188,-0.492188],[-1.257812,0.242188,-0.492188],[1.210938,0.085938,-0.484375],[-1.210938,0.085938,-0.484375],[1.046875,0,-0.421875],[-1.046875,0,-0.421875],[0.882812,-0.015625,-0.265625],[-0.882812,-0.015625,-0.265625],[0.953125,0.289062,-0.34375],[-0.953125,0.289062,-0.34375],[0.890625,0.109375,-0.328125],[-0.890625,0.109375,-0.328125],[0.9375,0.0625,-0.335938],[-0.9375,0.0625,-0.335938],[1,0.125,-0.367188],[-1,0.125,-0.367188],[0.960938,0.171875,-0.351562],[-0.960938,0.171875,-0.351562],[1.015625,0.234375,-0.375],[-1.015625,0.234375,-0.375],[1.054688,0.1875,-0.382812],[-1.054688,0.1875,-0.382812],[1.109375,0.210938,-0.390625],[-1.109375,0.210938,-0.390625],[1.085938,0.273438,-0.390625],[-1.085938,0.273438,-0.390625],[1.023438,0.4375,-0.484375],[-1.023438,0.4375,-0.484375],[1.25,0.46875,-0.546875],[-1.25,0.46875,-0.546875],[1.367188,0.296875,-0.5],[-1.367188,0.296875,-0.5],[1.3125,0.054688,-0.53125],[-1.3125,0.054688,-0.53125],[1.039062,-0.085938,-0.492188],[-1.039062,-0.085938,-0.492188],[0.789062,-0.125,-0.328125],[-0.789062,-0.125,-0.328125],[0.859375,0.382812,-0.382812],[-0.859375,0.382812,-0.382812]\r\n];\r\n\r\nexport default monkeyVertices;","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport monkeyFaces from './faces/monkey.ts';\r\nimport monkeyVertices from './vertices/monkey.ts';\r\n\r\nexport default class Monkey extends Object3D {\r\n\r\n constructor(options?: Partial<Object3DOptions>) {\r\n super({\r\n ...options,\r\n vertices: monkeyVertices,\r\n faces: monkeyFaces\r\n });\r\n }\r\n}","import Object3D, { type Object3DOptions } from '../Object3D.ts';\r\nimport cuboidFaces from './faces/cuboid.ts';\r\nimport getCuboidVertices from './vertices/cuboid.ts';\r\n\r\nexport interface CuboidOptions extends Object3DOptions {\r\n width: number;\r\n height: number;\r\n length: number;\r\n}\r\n\r\nexport default class Cuboid extends Object3D {\r\n\r\n public width: number;\r\n public height: number;\r\n public length: number;\r\n\r\n constructor(options?: Partial<CuboidOptions>) {\r\n super({\r\n ...options,\r\n vertices: getCuboidVertices(\r\n options?.width ?? 1,\r\n options?.height ?? 1,\r\n options?.length ?? 1\r\n ),\r\n faces: cuboidFaces\r\n });\r\n\r\n this.width = options?.width ?? 1;\r\n this.height = options?.height ?? 1;\r\n this.length = options?.length ?? 1;\r\n }\r\n\r\n private computeVertices() {\r\n this.vertices = getCuboidVertices(this.width, this.height, this.length);\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.computeVertices();\r\n }\r\n\r\n public setHeight(height: number) {\r\n this.height = height;\r\n this.computeVertices();\r\n }\r\n\r\n public setLength(length: number) {\r\n this.length = length;\r\n this.computeVertices();\r\n }\r\n}"],"mappings":"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AC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EACnC,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EACxC,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EACxC,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI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AAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,MAAO,SAAU,MAAO,EAAE,CAAC,OAAQ,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,SAAU,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,MAAO,QAAS,GAAI,EAAE,CAAC,OAAQ,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,OAAQ,EAAE,CAAC,SAAU,MAAO,OAAQ,EAAE,CAAC,KAAM,MAAO,OAAQ,EAAE,CAAC,MAAO,MAAO,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,IAAK,OAAQ,OAAQ,EAAE,CAAC,KAAM,OAAQ,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,MAAO,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,KAAM,EAAE,CAAC,EAAE,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,KAAM,SAAU,GAAI,EAAE,CAAC,MAAO,SAAU,GAAI,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,MAAO,EAAE,CAAC,SAAU,KAAM,MAAO,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,KAAM,SAAU,KAAM,EAAE,CAAC,MAAO,SAAU,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,IAAK,SAAU,KAAM,EAAE,CAAC,KAAM,SAAU,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,GAAI,EAAE,CAAC,SAAU,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,GAAI,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,EAAE,MAAO,KAAM,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,OAAQ,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,EAAE,QAAS,MAAO,EAAE,CAAC,OAAQ,KAAM,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,MAAO,EAAE,CAAC,SAAU,OAAQ,MAAO,EAAE,CAAC,MAAO,OAAQ,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,KAAM,EAAE,CAAC,SAAU,QAAS,KAAM,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,KAAM,MAAO,OAAQ,EAAE,CAAC,MAAO,MAAO,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,KAAM,MAAO,EAAE,CAAC,SAAU,KAAM,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,KAAM,OAAQ,EAAE,CAAC,SAAU,KAAM,OAAQ,EAAE,CAAC,KAAM,QAAS,OAAQ,EAAE,CAAC,MAAO,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,GAAI,EAAE,CAAC,SAAU,OAAQ,GAAI,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,GAAI,EAAE,CAAC,SAAU,QAAS,GAAI,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,MAAO,EAAE,CAAC,SAAU,MAAO,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,IAAK,EAAE,CAAC,SAAU,QAAS,IAAK,EAAE,CAAC,QAAS,EAAE,OAAQ,EAAE,CAAC,SAAU,EAAE,OAAQ,EAAE,CAAC,MAAO,QAAS,MAAO,EAAE,CAAC,OAAQ,QAAS,MAAO,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,EAAE,QAAS,QAAS,EAAE,CAAC,EAAE,SAAU,QAAS,EAAE,CAAC,EAAE,SAAU,KAAM,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,MAAO,EAAE,CAAC,EAAE,SAAU,OAAQ,EAAE,CAAC,EAAE,SAAU,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,MAAO,QAAS,EAAE,CAAC,SAAU,MAAO,QAAS,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,OAAQ,MAAO,QAAS,EAAE,CAAC,QAAS,MAAO,QAAS,EAAE,CAAC,QAAS,SAAU,QAAS,EAAE,CAAC,SAAU,SAAU,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,IAAK,IAAK,OAAQ,EAAE,CAAC,KAAM,IAAK,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,KAAM,SAAU,OAAQ,EAAE,CAAC,MAAO,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,KAAM,EAAE,CAAC,SAAU,SAAU,KAAM,EAAE,CAAC,OAAQ,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,QAAS,SAAU,EAAG,EAAE,CAAC,SAAU,SAAU,EAAG,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,OAAQ,QAAS,EAAE,CAAC,SAAU,OAAQ,QAAS,EAAE,CAAC,OAAQ,SAAU,QAAS,EAAE,CAAC,QAAS,SAAU,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,OAAQ,OAAQ,EAAE,CAAC,SAAU,OAAQ,OAAQ,EAAE,CAAC,QAAS,QAAS,MAAO,EAAE,CAAC,SAAU,QAAS,MAAO,EAAE,CAAC,QAAS,QAAS,OAAQ,EAAE,CAAC,SAAU,QAAS,OAAQ,EAAE,CAAC,QAAS,MAAO,IAAK,EAAE,CAAC,SAAU,MAAO,IAAK,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,CAAC,SAAU,QAAS,QAAS,EAAE,CAAC,QAAS,IAAK,QAAS,EAAE,CAAC,SAAU,IAAK,QAAS,EAAE,CAAC,QAAS,QAAS,QAAS,EAAE,C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","names":["client_exports","__export","Arc","Button","Camera3D","Circle","Cube","Cuboid","CustomPolygon","Engine","Icosahedron","Icosphere","ImageSprite","Monkey","Multiplayer","Object3D","Octahedron","Oval","Pen","Rectangle","RegularPolygon","Renderer3D","RigidCircle","SolidRenderer3D","Sprite","Square","TSCMath","Tetrahedron","Text","Watermark","WireframeRenderer3D","aspectRatio","canvas","ctx","client_default","scale","setAspectRatio","setScale","__toCommonJS","canvas","ctx","penCanvas","penCtx","aspectRatio","scale","updateSize","setScale","newScale","setAspectRatio","newAspectRatio","Sprite","_Sprite","Engine","options","sprite","bBox1","bBox2","b1Left","b1Top","b1Right","b1Bottom","b2Left","b2Top","b2Right","b2Bottom","xMin","yMin","xMax","yMax","width","height","ctx","drawSprite","color","dx","dy","img1","img2","i","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","TSCMath","_TSCMath","min","max","v","d","n","a","b","i","sum","deg","rad","val","Engine","_Engine","penCanvas","e","scene","loop","sprite","layer","targetIndex","s","maxFPS","frameInterval","accumulator","tick","currentTime","deltaTime","ctx","canvas","ms","resolve","conditionGetter","check","key","value","mouseX","mouseY","canvasMouseX","canvasMouseY","localX","localY","angle","TSCMath","rotatedX","rotatedY","src","audio","sound","import_socket","Multiplayer","_Multiplayer","serverURL","eventName","data","callback","Rectangle","_Rectangle","Sprite","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Square","_Square","Sprite","s","cos","TSCMath","sin","size","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","sideLength","color","Oval","_Oval","Sprite","rX","rY","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radX","radY","color","Circle","_Circle","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","color","Arc","_Arc","Sprite","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","angle","color","RegularPolygon","_RegularPolygon","Sprite","path","step","i","stamping","c","penCtx","ctx","cX","canvas","cY","TSCMath","options","sides","radius","color","CustomPolygon","_CustomPolygon","Sprite","cos","TSCMath","sin","minX","maxX","minY","maxY","v","rx","ry","fx","fy","width","height","x","y","path","vertices","first","rest","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","options","sprite","penCtx","canvas","Engine","lastX","lastY","steps","TSCMath","x","y","dX","dY","Text","_Text","Sprite","metrics","ctx","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","align","baseline","Button","_Button","Sprite","ctx","metrics","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","cX","canvas","cY","options","content","color","fontSize","fontFamily","Watermark","_Watermark","Text","options","canvas","ImageSprite","_ImageSprite","Sprite","w","h","cos","TSCMath","sin","width","height","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","costumeNumber","bitmap","RigidCircle","Circle","x","y","localCircles","Engine","s","globalCircles","circles","steps","i","circle","nx","ny","dist","nxn","nyn","dot","cX","canvas","cY","options","Camera3D","options","Renderer3D","Pen","canvas","options","engine","Engine","dt","sinY","TSCMath","cosY","maxPitch","vertices","f","v","x","y","z","xp","yp","WireframeRenderer3D","Renderer3D","sinX","TSCMath","cosX","sinY","cosY","sinZ","cosZ","obj","projected","v","x","y","z","x1","z1","y2","z2","x3","y3","f","vIndex","SolidRenderer3D","_SolidRenderer3D","Renderer3D","sinX","TSCMath","cosX","sinY","cosY","sinZ","cosZ","lx","ly","lz","lx1","lz1","ly2","lz2","lx3","ly3","lightDir","obj","h","s","l","cameraVerts","x","y","z","x1","z1","y2","z2","x3","y3","faces","face","i","a","b","projected","nx","ny","nz","v1","v2","normal","diffuse","brightness","litL","color","vertices","vIndex","CustomPolygon","el","rgb","r","g","max","min","d","Object3D","options","deg","cos","TSCMath","sin","i","_","y","z","x","delta","data","lines","vertices","l","faces","f","tetrahedronFaces","tetrahedron_default","tetrahedronVertices","tetrahedron_default","Tetrahedron","Object3D","options","tetrahedron_default","cuboidFaces","cuboid_default","getCuboidVertices","width","height","length","Cube","Object3D","options","getCuboidVertices","cuboid_default","octahedronFaces","octahedron_default","octahedronVerticesVertices","octahedron_default","Octahedron","Object3D","options","octahedron_default","icosahedronFaces","icosahedron_default","phi","a","b","icosahedronVertices","icosahedron_default","Icosahedron","Object3D","options","icosahedron_default","icosphereFaces","icosphere_default","icosphereVertices","icosphere_default","Icosphere","Object3D","options","icosphere_default","monkeyFaces","monkey_default","monkeyVertices","monkey_default","Monkey","Object3D","options","monkey_default","Cuboid","Object3D","options","getCuboidVertices","cuboid_default","width","height","length","TScratch","Engine","Sprite","TSCMath","Multiplayer","Rectangle","Square","Oval","Circle","Arc","RegularPolygon","CustomPolygon","Pen","Text","Button","Watermark","ImageSprite","RigidCircle","Camera3D","Renderer3D","WireframeRenderer3D","SolidRenderer3D","Object3D","Tetrahedron","Cube","Octahedron","Icosahedron","Icosphere","Monkey","Cuboid","scale","aspectRatio","setScale","setAspectRatio","canvas","ctx","client_default"]}
|