tscratch 0.8.4 → 0.8.6

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/client/index.ts","../../src/client/main/canvas.ts","../../src/client/main/TSCMath.ts","../../src/client/main/Sprite.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/RigidRectangle.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 RigidRectangle, { type RigidRectangleOptions } from '@sprites/physics/RigidRectangle.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 { RigidBody, RigidBodyOptions } from '@sprites/physics/RigidBody.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 RigidRectangle,\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 RigidRectangle,\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 RigidBody,\r\n type RigidBodyOptions,\r\n type RigidRectangleOptions,\r\n\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\npenCanvas.id = 'pen-canvas';\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 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 x scalar multiplication\r\n public static multiply(a: Vec2, b: Vec2): Vec2;\r\n public static multiply(a: Vec3, b: Vec3): Vec3;\r\n public static multiply(a: Vec4, b: Vec4): Vec4;\r\n public static multiply(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 Engine from './Engine.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from './TSCMath.ts';\r\n\r\nexport interface CollisionData {\r\n contact: Vec2;\r\n normal: Vec2;\r\n displacement: number;\r\n}\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 cachedBoundingBox: BoundingBox | null = null;\r\n private pathDirty = true;\r\n private boundingBoxDirty = 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 // Geometry caching\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\r\n protected invalidateBoundingBox() {\r\n this.boundingBoxDirty = true;\r\n this.cachedBoundingBox = 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 public getCachedBoundingBox(): BoundingBox {\r\n if (this.boundingBoxDirty || !this.cachedBoundingBox) {\r\n this.cachedBoundingBox = this.getBoundingBox();\r\n this.boundingBoxDirty = false;\r\n }\r\n return this.cachedBoundingBox;\r\n }\r\n\r\n // Initialization\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): CollisionData | null {\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 null;\r\n\r\n // AABB (bounding boxes)\r\n const bBox1 = this.getCachedBoundingBox();\r\n const bBox2 = sprite.getCachedBoundingBox();\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 null;\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 null;\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 let sumX = 0;\r\n let sumY = 0;\r\n let count = 0;\r\n const overlapPixels: number[] = [];\r\n\r\n for (let i = 3; i < img1.length; i += 4) {\r\n if (img1[i]! > 0 && img2[i]! > 0) {\r\n \r\n const pixelIndex = i / 4;\r\n overlapPixels.push(pixelIndex);\r\n\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n\r\n sumX += px;\r\n sumY += py;\r\n count++;\r\n }\r\n }\r\n\r\n if (count === 0) return null;\r\n\r\n // Compute collision data\r\n\r\n // Contact point\r\n const localX = sumX / count;\r\n const localY = sumY / count;\r\n\r\n const contact: Vec2 = [\r\n xMin + localX,\r\n yMax - localY // undo Y flip\r\n ];\r\n\r\n // Normal\r\n let nx = 0;\r\n let ny = 0;\r\n\r\n for (const pixelIndex of overlapPixels) {\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n \r\n // We look at the \"distance\" of this overlap pixel from the center of the overlap\r\n // to find the 'bias' of the collision area\r\n nx += (px - localX);\r\n ny += (py - localY); \r\n }\r\n\r\n // If the pixel cloud is too uniform, fall back to center-to-contact logic\r\n if (Math.abs(nx) < 0.01 && Math.abs(ny) < 0.01) {\r\n nx = this.x - contact[0];\r\n ny = this.y - contact[1];\r\n }\r\n\r\n const n: Vec2 = [nx, -ny]; // Note the -ny to fix coordinate flip\r\n const normal: Vec2 = TSCMath.magnitude(n) > 0 ? TSCMath.normalize(n) : n;\r\n\r\n // Ensure orientation\r\n const dx = this.x - sprite.x;\r\n const dy = this.y - sprite.y;\r\n if (dx * normal[0] + dy * normal[1] < 0) {\r\n normal[0] *= -1;\r\n normal[1] *= -1;\r\n }\r\n\r\n // Penetration\r\n let displacement = -Infinity;\r\n\r\n for (const pixelIndex of overlapPixels) {\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n\r\n const wx = xMin + px;\r\n const wy = yMax - py;\r\n\r\n const d =\r\n (wx - contact[0]) * normal[0] +\r\n (wy - contact[1]) * normal[1];\r\n\r\n displacement = Math.max(displacement, d);\r\n }\r\n\r\n return { contact, normal, displacement };\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.invalidateBoundingBox();\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.invalidateBoundingBox();\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 { 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\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.invalidateBoundingBox();\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.invalidateBoundingBox();\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\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.invalidateBoundingBox();\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\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.invalidateBoundingBox();\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.invalidateBoundingBox();\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 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.invalidateBoundingBox();\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 '@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.invalidateBoundingBox();\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.invalidateBoundingBox();\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 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.invalidateBoundingBox();\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.invalidateBoundingBox();\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\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.invalidateBoundingBox();\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 // Type-safe pen layer sprite drawing method\r\n public static drawSprite<\r\n SpriteClass extends new (options?: SpriteOptions) => Sprite\r\n >(\r\n spriteClass: SpriteClass, options?: ConstructorParameters<SpriteClass>[0]\r\n ) {\r\n const sprite = new spriteClass(options ?? {});\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 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.invalidateBoundingBox();\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.invalidateBoundingBox();\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.invalidateBoundingBox();\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 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.invalidateBoundingBox();\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.invalidateBoundingBox();\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.invalidateBoundingBox();\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 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.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.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.loadImageBitmap();\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.loadImageBitmap();\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.loadImageBitmap();\r\n }\r\n\r\n public setWidth(width: number) {\r\n this.width = width;\r\n this.invalidatePath();\r\n this.invalidateBoundingBox();\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.invalidateBoundingBox();\r\n this.refresh();\r\n }\r\n\r\n // Bitmap loading\r\n private loadImageBitmap() {\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 // Constructor\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 Rectangle, { type RectangleOptions } from '@sprites/Rectangle.ts';\r\nimport type { RigidBody, RigidBodyOptions } from './RigidBody.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface RigidRectangleOptions extends RectangleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidRectangle extends Rectangle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['rectangle', 'rigidbody']);\r\n\r\n public obstacles: RigidBody[];\r\n\r\n public isStatic: boolean;\r\n\r\n public gravity: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n public velocity: Vec2;\r\n public angularVelocity: number;\r\n public inertia: number;\r\n\r\n public update(stepFactor = 1): void {\r\n\r\n if (this.isStatic) return;\r\n \r\n // 1. Apply Basic Forces\r\n this.velocity[1] += this.gravity * stepFactor;\r\n\r\n // 2. Integration (Movement)\r\n this.changeX(this.velocity[0] * stepFactor);\r\n this.changeY(this.velocity[1] * stepFactor);\r\n this.turn(-TSCMath.toDegrees(this.angularVelocity) * stepFactor);\r\n\r\n // 3. Collision Detection & Resolution\r\n for (const target of this.obstacles) {\r\n\r\n const collisionData = this.touching(target);\r\n\r\n if (collisionData) {\r\n const { contact, normal, displacement } = collisionData;\r\n\r\n // --- POSITIONAL CORRECTION (Anti-clipping) ---\r\n const slop = 0.05; // Allowance to prevent jitter\r\n const distance = Math.max(displacement - slop, 0);\r\n\r\n // If target is static, 'this' moves the full distance.\r\n // If target is dynamic, we only move 'this' to avoid the \"double-push\" \r\n // that happens when both objects run their update loops.\r\n const ratio = target.isStatic ? 1.0 : 0.5;\r\n\r\n const pushX = normal[0] * distance * ratio;\r\n const pushY = normal[1] * distance * ratio;\r\n\r\n this.changeX(pushX);\r\n this.changeY(pushY);\r\n \r\n if (!target.isStatic) {\r\n target.changeX(-pushX);\r\n target.changeY(-pushY);\r\n }\r\n\r\n // --- IMPULSE SETUP ---\r\n const r1: Vec2 = [contact[0] - this.x, contact[1] - this.y];\r\n const r2: Vec2 = [contact[0] - target.x, contact[1] - target.y];\r\n\r\n // Velocity at the exact point of contact\r\n const v1: Vec2 = [\r\n this.velocity[0] - this.angularVelocity * r1[1],\r\n this.velocity[1] + this.angularVelocity * r1[0]\r\n ];\r\n \r\n const targetVel = target.velocity;\r\n const targetAV = target.angularVelocity;\r\n \r\n const v2: Vec2 = [\r\n targetVel[0] - targetAV * r2[1],\r\n targetVel[1] + targetAV * r2[0]\r\n ];\r\n\r\n const relVel: Vec2 = [v1[0] - v2[0], v1[1] - v2[1]];\r\n const velAlongNormal = relVel[0] * normal[0] + relVel[1] * normal[1];\r\n\r\n // Only resolve if objects are moving towards each other\r\n if (velAlongNormal < 0) {\r\n const friction = 0.3;\r\n\r\n // --- NORMAL IMPULSE ---\r\n const r1n = r1[0] * normal[1] - r1[1] * normal[0];\r\n const r2n = r2[0] * normal[1] - r2[1] * normal[0];\r\n \r\n // If target is static, it has 0 inverse mass (doesn't move).\r\n const massTerm = target.isStatic ? 1 : 2; \r\n const targetInertiaTerm = target.isStatic ? 0 : (r2n * r2n / target.inertia);\r\n \r\n const invMassSum = massTerm + (r1n * r1n / this.inertia) + targetInertiaTerm;\r\n \r\n const j = -(1 + this.bounceLoss) * velAlongNormal / invMassSum;\r\n const impulse: Vec2 = [normal[0] * j, normal[1] * j];\r\n\r\n // --- TANGENT IMPULSE ---\r\n const tangent: Vec2 = [-normal[1], normal[0]];\r\n const velAlongTangent = relVel[0] * tangent[0] + relVel[1] * tangent[1];\r\n \r\n const r1t = r1[0] * tangent[1] - r1[1] * tangent[0];\r\n const r2t = r2[0] * tangent[1] - r2[1] * tangent[0];\r\n const targetInertiaTermT = target.isStatic ? 0 : (r2t * r2t / target.inertia);\r\n \r\n const invMassSumT = massTerm + (r1t * r1t / this.inertia) + targetInertiaTermT;\r\n \r\n const jt = -velAlongTangent * friction / invMassSumT;\r\n const fImpulse: Vec2 = [tangent[0] * jt, tangent[1] * jt];\r\n\r\n const totalImpX = impulse[0] + fImpulse[0];\r\n const totalImpY = impulse[1] + fImpulse[1];\r\n\r\n // Update Self\r\n this.velocity[0] += totalImpX;\r\n this.velocity[1] += totalImpY;\r\n this.angularVelocity += (r1[0] * totalImpY - r1[1] * totalImpX) / this.inertia;\r\n\r\n // Update Obstacle only if NOT static\r\n if (!target.isStatic) {\r\n target.velocity[0] -= totalImpX;\r\n target.velocity[1] -= totalImpY;\r\n target.angularVelocity -= (r2[0] * totalImpY - r2[1] * totalImpX) / target.inertia;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n constructor(options?: RigidRectangleOptions) {\r\n super(options);\r\n\r\n this.obstacles = options?.obstacles ?? [];\r\n\r\n this.isStatic = options?.isStatic ?? false;\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.92;\r\n this.velocity = options?.velocity ?? [0, 0];\r\n this.angularVelocity = options?.angularVelocity ?? 0;\r\n this.inertia = options?.inertia ?? 700;\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\nimport Pen from '@sprites/Pen.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 Pen.drawSprite(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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C,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,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,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI,EAAG,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,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,EAAG,EAAE,CACpE,EAEOC,GAAQD,GCjBf,IAAME,GAA4B,CAC9B,CAAC,EAAU,GAAW,CAAQ,EAAG,CAAC,QAAU,QAAW,OAAQ,EAAG,CAAC,SAAW,QAAW,OAAQ,EACjG,CAAC,SAAW,SAAW,CAAQ,EAAG,CAAC,SAAW,QAAW,QAAS,EAAG,CAAC,QAAU,QAAW,QAAS,EACpG,CAAC,QAAU,OAAU,OAAQ,EAAG,CAAC,SAAW,OAAU,OAAQ,EAAG,CAAC,SAAW,OAAU,QAAS,EAChG,CAAC,QAAU,OAAU,QAAS,EAAG,CAAC,QAAU,QAAU,CAAQ,EAAG,CAAC,EAAU,EAAU,CAAQ,EAC9F,CAAC,SAAW,SAAW,OAAQ,EAAG,CAAC,QAAU,SAAW,OAAQ,EAAG,CAAC,QAAU,SAAW,OAAQ,EACjG,CAAC,QAAU,SAAW,CAAQ,EAAG,CAAC,QAAU,SAAW,QAAS,EAAG,CAAC,QAAW,SAAW,CAAQ,EAClG,CAAC,SAAW,SAAW,OAAQ,EAAG,CAAC,SAAW,SAAW,QAAS,EAAG,CAAC,SAAW,SAAW,QAAS,EACrG,CAAC,QAAU,SAAW,QAAS,EAAG,CAAC,QAAU,EAAU,OAAQ,EAAG,CAAC,QAAU,EAAU,QAAS,EAChG,CAAC,EAAU,EAAU,CAAQ,EAAG,CAAC,QAAU,EAAU,OAAQ,EAAG,CAAC,SAAW,EAAU,OAAQ,EAC9F,CAAC,SAAW,EAAU,OAAQ,EAAG,CAAC,SAAW,EAAU,QAAS,EAAG,CAAC,SAAW,EAAU,QAAS,EAClG,CAAC,QAAU,EAAU,QAAS,EAAG,CAAC,EAAU,EAAU,EAAS,EAAG,CAAC,QAAU,QAAU,OAAQ,EAC/F,CAAC,SAAW,QAAU,OAAQ,EAAG,CAAC,SAAW,QAAU,CAAQ,EAAG,CAAC,SAAW,QAAU,QAAS,EACjG,CAAC,QAAU,QAAU,QAAS,EAAG,CAAC,QAAU,QAAU,OAAQ,EAAG,CAAC,OAAU,QAAU,CAAQ,EAC9F,CAAC,SAAW,QAAU,OAAQ,EAAG,CAAC,SAAW,QAAU,QAAS,EAAG,CAAC,QAAU,QAAU,QAAS,CACrG,EAEOC,GAAQD,GCff,IAAqBE,GAArB,cAAuCC,CAAS,CAE5C,YAAYC,EAAoC,CAC5C,MAAM,CACF,GAAGA,EACH,SAAUC,GACV,MAAOA,EACX,CAAC,CACL,CACJ,ECbA,IAAMC,GAA+C,CACjD,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAClC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAC9B,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EACjC,CAAC,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,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AE,CAAC,EAAE,OAAQ,OAAQ,EAAE,CAAC,EAAE,QAAS,OAAQ,EAAE,CAAC,EAAE,QAAS,QAAS,EAAE,CAAC,EAAE,MAAO,QAAS,EAAE,CAAC,EAAE,QAAS,QAAS,EAAE,CAAC,EAAE,SAAU,QAAS,EAAE,CAAC,QAAS,OAAQ,KAAM,EAAE,CAAC,SAAU,OAAQ,KAAM,EAAE,CAAC,MAAO,OAAQ,OAAQ,EAAE,CAAC,OAAQ,OAAQ,OAAQ,EAAE,CAAC,QAAS,SAAU,OAAQ,EAAE,CAAC,SAAU,SAAU,OAAQ,EAAE,CAAC,QAAS,SAAU,MAAO,EAAE,CAAC,SAAU,SAAU,MAAO,EAAE,CAAC,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,EA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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","RigidRectangle","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","TSCMath","_TSCMath","min","max","v","d","n","a","b","i","sum","deg","rad","val","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","sumX","sumY","count","overlapPixels","i","pixelIndex","px","py","localX","localY","contact","nx","ny","n","normal","TSCMath","displacement","wx","wy","d","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","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","rx","ry","fx","fy","width","height","x","path","vertices","first","rest","v","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","options","sprite","penCtx","canvas","spriteClass","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","RigidRectangle","Rectangle","stepFactor","TSCMath","target","collisionData","contact","normal","displacement","distance","ratio","pushX","pushY","r1","r2","v1","targetVel","targetAV","v2","relVel","velAlongNormal","r1n","r2n","massTerm","targetInertiaTerm","invMassSum","j","impulse","tangent","velAlongTangent","r1t","r2t","targetInertiaTermT","invMassSumT","jt","fImpulse","totalImpX","totalImpY","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","v","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","Pen","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","RigidRectangle","Camera3D","Renderer3D","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/TSCMath.ts","../../src/client/main/Sprite.ts","../../src/client/main/Engine.ts","../../src/client/types/assert.ts","../../src/client/main/perlin/Perlin.ts","../../src/client/main/perlin/Perlin1.ts","../../src/client/main/perlin/Perlin2.ts","../../src/client/main/ik/InverseKinematics.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/RigidRectangle.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\nimport Perlin1D from '@main/perlin/Perlin1.ts';\r\nimport Perlin2D from '@main/perlin/Perlin2.ts';\r\nimport InverseKinematics from '@main/ik/InverseKinematics.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 RigidRectangle, { type RigidRectangleOptions } from '@sprites/physics/RigidRectangle.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 { RigidBody, RigidBodyOptions } from '@sprites/physics/RigidBody.ts';\r\n\r\nconst TScratch = {\r\n // Main\r\n Engine,\r\n Sprite,\r\n TSCMath,\r\n Perlin1D,\r\n Perlin2D,\r\n InverseKinematics,\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 RigidRectangle,\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 Perlin1D,\r\n Perlin2D,\r\n InverseKinematics,\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 RigidRectangle,\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 RigidBody,\r\n type RigidBodyOptions,\r\n type RigidRectangleOptions,\r\n\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\npenCanvas.id = 'pen-canvas';\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 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 x scalar multiplication\r\n public static multiply(a: Vec2, b: Vec2): Vec2;\r\n public static multiply(a: Vec3, b: Vec3): Vec3;\r\n public static multiply(a: Vec4, b: Vec4): Vec4;\r\n public static multiply(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 Engine from './Engine.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from './TSCMath.ts';\r\n\r\nexport interface CollisionData {\r\n contact: Vec2;\r\n normal: Vec2;\r\n displacement: number;\r\n}\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 = 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 // Geometry caching\r\n\r\n protected invalidatePath() {\r\n this.pathDirty = true;\r\n this.cachedPath = null;\r\n }\r\n\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\r\n\r\n // Initialization\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): CollisionData | null {\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 null;\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 null;\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 null;\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 - must match draw() transform exactly:\r\n // translate to (x,y), rotate, then translate(-pivot). Use position, not bBox center.\r\n const drawSprite = (sprite: Sprite, color: string) => {\r\n ctx.save();\r\n\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 ctx.translate(-sprite.pivot[0] * sprite.size, sprite.pivot[1] * sprite.size);\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 let sumX = 0;\r\n let sumY = 0;\r\n let count = 0;\r\n const overlapPixels: number[] = [];\r\n\r\n for (let i = 3; i < img1.length; i += 4) {\r\n if (img1[i]! > 0 && img2[i]! > 0) {\r\n \r\n const pixelIndex = i / 4;\r\n overlapPixels.push(pixelIndex);\r\n\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n\r\n sumX += px;\r\n sumY += py;\r\n count++;\r\n }\r\n }\r\n\r\n if (count === 0) return null;\r\n\r\n // Compute collision data\r\n\r\n // Contact point\r\n const localX = sumX / count;\r\n const localY = sumY / count;\r\n\r\n const contact: Vec2 = [\r\n xMin + localX,\r\n yMax - localY // undo Y flip\r\n ];\r\n\r\n // Normal\r\n let nx = 0;\r\n let ny = 0;\r\n\r\n for (const pixelIndex of overlapPixels) {\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n \r\n // We look at the \"distance\" of this overlap pixel from the center of the overlap\r\n // to find the 'bias' of the collision area\r\n nx += (px - localX);\r\n ny += (py - localY); \r\n }\r\n\r\n // If the pixel cloud is too uniform, fall back to center-to-contact logic\r\n if (Math.abs(nx) < 0.01 && Math.abs(ny) < 0.01) {\r\n nx = this.x - contact[0];\r\n ny = this.y - contact[1];\r\n }\r\n\r\n const n: Vec2 = [nx, -ny]; // Note the -ny to fix coordinate flip\r\n const normal: Vec2 = TSCMath.magnitude(n) > 0 ? TSCMath.normalize(n) : n;\r\n\r\n // Ensure orientation\r\n const dx = this.x - sprite.x;\r\n const dy = this.y - sprite.y;\r\n if (dx * normal[0] + dy * normal[1] < 0) {\r\n normal[0] *= -1;\r\n normal[1] *= -1;\r\n }\r\n\r\n // Penetration\r\n let displacement = -Infinity;\r\n\r\n for (const pixelIndex of overlapPixels) {\r\n const px = pixelIndex % width;\r\n const py = Math.floor(pixelIndex / width);\r\n\r\n const wx = xMin + px;\r\n const wy = yMax - py;\r\n\r\n const d =\r\n (wx - contact[0]) * normal[0] +\r\n (wy - contact[1]) * normal[1];\r\n\r\n displacement = Math.max(displacement, d);\r\n }\r\n\r\n return { contact, normal, displacement };\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\r\n // Helpers\r\n\r\n protected getDrawOffset(): [number, number] {\r\n const [x, y] = this.pivot;\r\n const sin = TSCMath.sin(this.dir);\r\n const cos = TSCMath.cos(this.dir);\r\n\r\n const rx = -x * cos - y * sin;\r\n const ry = -x * sin + y * cos;\r\n\r\n return [rx * this.size, ry * this.size];\r\n }\r\n}","import { canvas, ctx } 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 canvas.addEventListener('mousemove', e => {\r\n this.mouseX = e.clientX - canvas.offsetLeft - canvas.width / 2;\r\n this.mouseY = -(e.clientY - canvas.offsetTop - canvas.height / 2);\r\n });\r\n canvas.addEventListener('mousedown', () => {\r\n this.mouseDown = true;\r\n });\r\n canvas.addEventListener('mouseup', () => {\r\n this.mouseDown = false;\r\n });\r\n canvas.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}","export default function assert(condition: boolean, message: string): asserts condition {\r\n if (!condition)\r\n throw new Error(message);\r\n}","import assert from \"@ctypes/assert.ts\";\r\n\r\nexport default abstract class Perlin {\r\n\r\n public amplitude = 1;\r\n public gradientCount = 100;\r\n\r\n public abstract regen(): void;\r\n public abstract get(...coords: number[]): number;\r\n\r\n protected fade(t: number) {\r\n return 6 * (t ** 5) - 15 * (t ** 4) + 10 * (t ** 3);\r\n }\r\n\r\n protected lerp(n0: number, n1: number, weight: number) {\r\n return n0 * (1 - weight) + n1 * weight;\r\n }\r\n\r\n protected mod(n: number, modulus: number) {\r\n assert(modulus > 0, 'Modulus must be greater than 0');\r\n\r\n return ((n % modulus) + modulus) % modulus;\r\n }\r\n}","import Perlin from './Perlin.ts';\r\n\r\nexport default class Perlin1D extends Perlin {\r\n\r\n public amplitude = 1;\r\n public gradientCount = 100;\r\n private gradients: number[] = [];\r\n \r\n constructor() {\r\n super();\r\n this.regen();\r\n }\r\n\r\n public regen() {\r\n this.gradients = [];\r\n for (let i = 0; i < this.gradientCount; i++)\r\n this.gradients.push(Math.random() * 2 - 1);\r\n }\r\n \r\n public get(x: number) {\r\n \r\n const x0 = Math.floor(x);\r\n const x1 = x0 + 1;\r\n\r\n const left = this.gradients[this.mod(x0, this.gradientCount)]!;\r\n const right = this.gradients[this.mod(x1, this.gradientCount)]!;\r\n\r\n const dist_l = x - x0;\r\n const dist_r = x - x1;\r\n\r\n const n0 = left * dist_l;\r\n const n1 = right * dist_r\r\n\r\n const faded = this.fade(dist_l);\r\n\r\n return this.lerp(n0, n1, faded) * this.amplitude * 2;\r\n }\r\n}","import Perlin from './Perlin.ts';\r\n\r\nexport default class Perlin2D extends Perlin {\r\n\r\n public amplitude = 1;\r\n public gradientCount = 100;\r\n private gradients: number[][][] = [];\r\n \r\n constructor() {\r\n super();\r\n this.regen();\r\n }\r\n\r\n public regen() {\r\n this.gradients = [];\r\n for (let i = 0; i < this.gradientCount; i++) {\r\n\r\n const row: number[][] = [];\r\n\r\n for (let j = 0; j < this.gradientCount; j++) {\r\n\r\n const x = Math.random() * 2 - 1;\r\n const y = Math.random() * 2 - 1;\r\n\r\n const mag = (x*x + y*y) ** 0.5;\r\n\r\n if (mag !== 0) row.push([x / mag, y / mag]);\r\n else row.push([1, 0]);\r\n }\r\n\r\n this.gradients.push(row);\r\n }\r\n }\r\n \r\n public get(x: number, y: number) {\r\n \r\n const x0 = Math.floor(x);\r\n const y0 = Math.floor(y);\r\n const x1 = x0 + 1;\r\n const y1 = y0 + 1;\r\n\r\n const g_bottom_left = this.gradients[this.mod(y0, this.gradientCount)]![this.mod(x0, this.gradientCount)]!;\r\n const g_bottom_right = this.gradients[this.mod(y0, this.gradientCount)]![this.mod(x1, this.gradientCount)]!;\r\n const g_top_left = this.gradients[this.mod(y1, this.gradientCount)]![this.mod(x0, this.gradientCount)]!;\r\n const g_top_right = this.gradients[this.mod(y1, this.gradientCount)]![this.mod(x1, this.gradientCount)]!;\r\n\r\n const dx0 = x - x0;\r\n const dy0 = y - y0;\r\n const dx1 = x - x1;\r\n const dy1 = y - y1;\r\n\r\n const s_bottom_left = g_bottom_left[0]! * dx0 + g_bottom_left[1]! * dy0;\r\n const s_bottom_right = g_bottom_right[0]! * dx1 + g_bottom_right[1]! * dy0;\r\n const s_top_left = g_top_left[0]! * dx0 + g_top_left[1]! * dy1;\r\n const s_top_right = g_top_right[0]! * dx1 + g_top_right[1]! * dy1;\r\n\r\n const u = this.fade(dx0);\r\n const v = this.fade(dy0);\r\n\r\n const l1 = this.lerp(s_bottom_left, s_bottom_right, u)\r\n const l2 = this.lerp(s_top_left, s_top_right, u)\r\n\r\n return this.lerp(l1, l2, v) * this.amplitude * 2\r\n }\r\n}","import TSCMath from '@main/TSCMath.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\n\r\nexport default class InverseKinematics {\r\n\r\n public links: [number, number, ...number[]];\r\n public angles: [number, number, ...number[]];\r\n public target: Vec2;\r\n\r\n constructor(links: [number, number, ...number[]], target: Vec2) {\r\n this.links = links;\r\n this.target = target;\r\n this.angles = links.map(() => 0) as typeof this.angles;\r\n }\r\n\r\n // Angle getter\r\n public getAngles() {\r\n let cumulative = 0;\r\n\r\n return this.angles.map(a => {\r\n cumulative += a;\r\n return 90 - TSCMath.toDegrees(cumulative); // World space\r\n });\r\n }\r\n\r\n // Vertex getter\r\n public getPoints(): Vec2[] {\r\n\r\n let x = 0;\r\n let y = 0;\r\n\r\n const points: Vec2[] = [];\r\n\r\n for (let i = 0; i < this.links.length; i++) {\r\n\r\n let theta = 0;\r\n\r\n for (let j = 0; j <= i; j++)\r\n theta += this.angles[j]!;\r\n\r\n x += this.links[i]! * Math.cos(theta);\r\n y += this.links[i]! * Math.sin(theta);\r\n points.push([x, y]);\r\n }\r\n\r\n return points;\r\n }\r\n\r\n // -------------------\r\n // Calculations\r\n // -------------------\r\n\r\n // Dot product helper\r\n private static dot(v1: number[], v2: number[]): number {\r\n let s = 0;\r\n\r\n for (let i = 0; i < v1.length; i++)\r\n s += v1[i]! * v2[i]!;\r\n\r\n return s;\r\n }\r\n\r\n // Full camputation\r\n public computeApproximateAngles(iterations: number, error: number, adjustmentRate = 0.25) {\r\n\r\n // If the point is out of reach, the best we can do, is fully extend in that direction\r\n if (TSCMath.magnitude(this.target) >= this.links.reduce((a, b) => a + b, 0)) {\r\n\r\n const targetAngle = Math.atan2(this.target[1], this.target[0]);\r\n this.angles[0] = targetAngle;\r\n\r\n for (let i = 1; i < this.angles.length; i++)\r\n this.angles[i] = 0;\r\n\r\n return;\r\n }\r\n\r\n // Compute\r\n this.angles = Array(this.links.length).fill(0) as typeof this.angles;\r\n\r\n for (let i = 0; i < iterations; i++) {\r\n\r\n this.updateAngles(adjustmentRate);\r\n if (TSCMath.magnitude(this.computeError()) < error) return;\r\n }\r\n }\r\n\r\n // Forward kinematics\r\n public forwardKinematicsPass(): Vec2 {\r\n const points = this.getPoints();\r\n return points[points.length - 1]!;\r\n }\r\n\r\n // Error vector\r\n public computeError(): Vec2 {\r\n const [x, y] = this.forwardKinematicsPass();\r\n return [this.target[0] - x, this.target[1] - y];\r\n }\r\n\r\n // Jacobian\r\n private computeJacobian(): [number[], number[]] {\r\n\r\n const J: [number[], number[]] = [[], []];\r\n\r\n for (let k = 0; k < this.angles.length; k++) {\r\n let dx = 0;\r\n let dy = 0;\r\n\r\n for (let i = k; i < this.links.length; i++) {\r\n\r\n let theta = 0;\r\n for (let j = 0; j <= i; j++)\r\n theta += this.angles[j]!;\r\n\r\n dx += -this.links[i]! * Math.sin(theta);\r\n dy += this.links[i]! * Math.cos(theta);\r\n }\r\n\r\n J[0].push(dx);\r\n J[1].push(dy);\r\n }\r\n\r\n return J;\r\n }\r\n\r\n // Pseudoinverse\r\n private computePseudoinverse(): Vec2[] {\r\n\r\n const J = this.computeJacobian();\r\n\r\n const transpose: Vec2[] = [];\r\n for (let i = 0; i < J[0].length; i++)\r\n transpose.push([J[0][i]!, J[1][i]!]);\r\n\r\n const v1_a = J[0];\r\n const v1_b = J[1];\r\n\r\n const v2_a: number[] = [];\r\n const v2_b: number[] = [];\r\n\r\n for (let i = 0; i < transpose.length; i++) {\r\n v2_a.push(transpose[i]![0]);\r\n v2_b.push(transpose[i]![1]);\r\n }\r\n\r\n const product: [Vec2, Vec2] = [\r\n [InverseKinematics.dot(v1_a, v2_a), InverseKinematics.dot(v1_a, v2_b)],\r\n [InverseKinematics.dot(v1_b, v2_a), InverseKinematics.dot(v1_b, v2_b)]\r\n ];\r\n\r\n const lam = 0.01;\r\n const a = product[0][0] + lam;\r\n const b = product[0][1];\r\n const c = product[1][0];\r\n const d = product[1][1] + lam;\r\n\r\n const det = a * d - b * c;\r\n const mul = 1 / det;\r\n\r\n const inverse: [Vec2, Vec2] = [\r\n [d * mul, -b * mul],\r\n [-c * mul, a * mul]\r\n ];\r\n\r\n const v2_a_vec = inverse[0];\r\n const v2_b_vec = inverse[1];\r\n\r\n const result: Vec2[] = [];\r\n for (const v1 of transpose) {\r\n result.push([\r\n InverseKinematics.dot(v1, v2_a_vec),\r\n InverseKinematics.dot(v1, v2_b_vec)\r\n ]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n // Compute joint updates\r\n private computeJointUpdate(): number[] {\r\n\r\n const err = this.computeError();\r\n const result: number[] = [];\r\n\r\n for (const row of this.computePseudoinverse())\r\n result.push(InverseKinematics.dot(err, row));\r\n \r\n return result;\r\n }\r\n\r\n // Update angles\r\n public updateAngles(adjustmentRate: number): void {\r\n\r\n const delta = this.computeJointUpdate();\r\n\r\n for (let i = 0; i < this.angles.length; i++)\r\n this.angles[i]! += delta[i]! * adjustmentRate;\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\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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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\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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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\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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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 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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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 '@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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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 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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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\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 const off = this.getDrawOffset();\r\n return {\r\n x: x * this.size + off[0],\r\n y: y * this.size + off[1],\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.size, this.pivot[1] * this.size);\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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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 // Type-safe pen layer sprite drawing method\r\n public static drawSprite<\r\n SpriteClass extends new (options?: SpriteOptions) => Sprite\r\n >(\r\n spriteClass: SpriteClass, options?: ConstructorParameters<SpriteClass>[0]\r\n ) {\r\n const sprite = new spriteClass(options ?? {});\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 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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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 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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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.invalidatePath();\r\n }\r\n}","import { canvas, ctx, penCtx } from '@main/canvas.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.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 const off = this.getDrawOffset();\r\n return {\r\n x: this.x + off[0],\r\n y: this.y + off[1],\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.size, this.pivot[1] * this.size);\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.loadImageBitmap();\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.loadImageBitmap();\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.loadImageBitmap();\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 // Bitmap loading\r\n private loadImageBitmap() {\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 // Constructor\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 Rectangle, { type RectangleOptions } from '@sprites/Rectangle.ts';\r\nimport type { RigidBody, RigidBodyOptions } from './RigidBody.ts';\r\nimport type { Vec2 } from '@ctypes/Vectors.ts';\r\nimport TSCMath from '@main/TSCMath.ts';\r\n\r\nexport interface RigidRectangleOptions extends RectangleOptions, Partial<RigidBodyOptions> {}\r\n\r\nexport default class RigidRectangle extends Rectangle implements RigidBodyOptions {\r\n\r\n public tags = new Set(['rectangle', 'rigidbody']);\r\n\r\n public obstacles: RigidBody[];\r\n\r\n public isStatic: boolean;\r\n\r\n public gravity: number;\r\n public drag: number;\r\n public bounceLoss: number;\r\n public velocity: Vec2;\r\n public angularVelocity: number;\r\n public inertia: number;\r\n\r\n public addObstacles(...obstacles: RigidBody[]) {\r\n this.obstacles.push(...obstacles);\r\n }\r\n\r\n public update(stepFactor = 1): void {\r\n\r\n if (this.isStatic) return;\r\n \r\n // 1. Apply Basic Forces\r\n this.velocity[1] += this.gravity * stepFactor;\r\n this.velocity[0] *= this.drag;\r\n this.velocity[1] *= this.drag;\r\n\r\n // 2. Integration (Movement)\r\n this.changeX(this.velocity[0] * stepFactor);\r\n this.changeY(this.velocity[1] * stepFactor);\r\n this.turn(-TSCMath.toDegrees(this.angularVelocity) * stepFactor);\r\n\r\n // 3. Collision Detection & Resolution\r\n for (const target of this.obstacles) {\r\n\r\n const collisionData = this.touching(target);\r\n\r\n if (collisionData) {\r\n const { contact, normal, displacement } = collisionData;\r\n\r\n // --- POSITIONAL CORRECTION (Anti-clipping) ---\r\n const slop = 0.05; // Allowance to prevent jitter\r\n const distance = Math.max(displacement - slop, 0);\r\n\r\n // If target is static, 'this' moves the full distance.\r\n // If target is dynamic, we only move 'this' to avoid the \"double-push\" \r\n // that happens when both objects run their update loops.\r\n const ratio = target.isStatic ? 1.0 : 0.5;\r\n\r\n const pushX = normal[0] * distance * ratio;\r\n const pushY = normal[1] * distance * ratio;\r\n\r\n this.changeX(pushX);\r\n this.changeY(pushY);\r\n \r\n if (!target.isStatic) {\r\n target.changeX(-pushX);\r\n target.changeY(-pushY);\r\n }\r\n\r\n // --- IMPULSE SETUP ---\r\n const r1: Vec2 = [contact[0] - this.x, contact[1] - this.y];\r\n const r2: Vec2 = [contact[0] - target.x, contact[1] - target.y];\r\n\r\n // Velocity at the exact point of contact\r\n const v1: Vec2 = [\r\n this.velocity[0] - this.angularVelocity * r1[1],\r\n this.velocity[1] + this.angularVelocity * r1[0]\r\n ];\r\n \r\n const targetVel = target.velocity;\r\n const targetAV = target.angularVelocity;\r\n \r\n const v2: Vec2 = [\r\n targetVel[0] - targetAV * r2[1],\r\n targetVel[1] + targetAV * r2[0]\r\n ];\r\n\r\n const relVel: Vec2 = [v1[0] - v2[0], v1[1] - v2[1]];\r\n const velAlongNormal = relVel[0] * normal[0] + relVel[1] * normal[1];\r\n\r\n // Only resolve if objects are moving towards each other\r\n if (velAlongNormal < 0) {\r\n const friction = 0.3;\r\n\r\n // --- NORMAL IMPULSE ---\r\n const r1n = r1[0] * normal[1] - r1[1] * normal[0];\r\n const r2n = r2[0] * normal[1] - r2[1] * normal[0];\r\n \r\n // Proper inverse mass calculation\r\n const invMass1 = 1;\r\n const invMass2 = target.isStatic ? 0 : 1;\r\n const r1nSq = r1n * r1n;\r\n const r2nSq = r2n * r2n;\r\n \r\n const invMassSum = invMass1 + invMass2 + (r1nSq / this.inertia) + (target.isStatic ? 0 : r2nSq / target.inertia);\r\n \r\n const j = -(1 + this.bounceLoss) * velAlongNormal / invMassSum;\r\n const impulse: Vec2 = [normal[0] * j, normal[1] * j];\r\n\r\n // --- TANGENT IMPULSE ---\r\n const tangent: Vec2 = [-normal[1], normal[0]];\r\n const velAlongTangent = relVel[0] * tangent[0] + relVel[1] * tangent[1];\r\n \r\n const r1t = r1[0] * tangent[1] - r1[1] * tangent[0];\r\n const r2t = r2[0] * tangent[1] - r2[1] * tangent[0];\r\n const r1tSq = r1t * r1t;\r\n const r2tSq = r2t * r2t;\r\n \r\n const invMassSumT = invMass1 + invMass2 + (r1tSq / this.inertia) + (target.isStatic ? 0 : r2tSq / target.inertia);\r\n \r\n const jt = -velAlongTangent * friction / invMassSumT;\r\n const fImpulse: Vec2 = [tangent[0] * jt, tangent[1] * jt];\r\n\r\n const totalImpX = impulse[0] + fImpulse[0];\r\n const totalImpY = impulse[1] + fImpulse[1];\r\n\r\n // Update Self\r\n this.velocity[0] += totalImpX;\r\n this.velocity[1] += totalImpY;\r\n this.angularVelocity += (r1[0] * totalImpY - r1[1] * totalImpX) / this.inertia;\r\n\r\n // Update Obstacle only if NOT static\r\n if (!target.isStatic) {\r\n target.velocity[0] -= totalImpX;\r\n target.velocity[1] -= totalImpY;\r\n target.angularVelocity -= (r2[0] * totalImpY - r2[1] * totalImpX) / target.inertia;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 4. Apply Drag (velocity dampening)\r\n this.velocity[0] *= this.drag;\r\n this.velocity[1] *= this.drag;\r\n this.angularVelocity *= this.drag;\r\n }\r\n\r\n constructor(options?: RigidRectangleOptions) {\r\n super(options);\r\n\r\n this.obstacles = options?.obstacles ?? [];\r\n\r\n this.isStatic = options?.isStatic ?? false;\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.92;\r\n this.velocity = options?.velocity ?? [0, 0];\r\n this.angularVelocity = options?.angularVelocity ?? 0;\r\n this.inertia = options?.inertia ?? 700;\r\n\r\n this.invalidatePath();\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\r\n protected getRelativeVertices(obj: Object3D): Vec3[] {\r\n\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 return 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}","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(this.getRelativeVertices(obj));\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\nimport Pen from '@sprites/Pen.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 relativeVerts = this.getRelativeVertices(obj);\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 += relativeVerts[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(relativeVerts);\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 = relativeVerts[face[i]!]!;\r\n const v2 = relativeVerts[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 Pen.drawSprite(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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E,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,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,EAAE,EAAG,CAAC,GAAI,GAAI,EAAE,EAAG,CAAC,GAAI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AC,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,GA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,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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","names":["client_exports","__export","Arc","Button","Camera3D","Circle","Cube","Cuboid","CustomPolygon","Engine","Icosahedron","Icosphere","ImageSprite","InverseKinematics","Monkey","Multiplayer","Object3D","Octahedron","Oval","Pen","Perlin1D","Perlin2D","Rectangle","RegularPolygon","Renderer3D","RigidRectangle","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","TSCMath","_TSCMath","min","max","v","d","n","a","b","i","sum","deg","rad","val","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","sumX","sumY","count","overlapPixels","i","pixelIndex","px","py","localX","localY","contact","nx","ny","n","normal","TSCMath","displacement","wx","wy","d","deg","rad","x","y","steps","dir","dX","dY","size","dS","layer","dL","sin","cos","rx","ry","Engine","_Engine","canvas","e","scene","loop","sprite","layer","targetIndex","s","maxFPS","frameInterval","accumulator","tick","currentTime","deltaTime","ctx","ms","resolve","conditionGetter","check","key","value","mouseX","mouseY","canvasMouseX","canvasMouseY","localX","localY","angle","TSCMath","rotatedX","rotatedY","src","audio","sound","assert","condition","message","Perlin","n0","n1","weight","n","modulus","assert","Perlin1D","Perlin","i","x","x0","x1","left","right","dist_l","dist_r","n0","n1","faded","Perlin2D","Perlin","i","row","j","x","y","mag","x0","y0","x1","y1","g_bottom_left","g_bottom_right","g_top_left","g_top_right","dx0","dy0","dx1","dy1","s_bottom_left","s_bottom_right","s_top_left","s_top_right","u","v","l1","l2","InverseKinematics","_InverseKinematics","links","target","cumulative","a","TSCMath","x","y","points","i","theta","j","v1","v2","s","iterations","error","adjustmentRate","b","targetAngle","J","k","dx","dy","transpose","v1_a","v1_b","v2_a","v2_b","product","lam","c","d","mul","inverse","v2_a_vec","v2_b_vec","result","err","row","delta","import_socket","Multiplayer","_Multiplayer","serverURL","eventName","data","callback","Rectangle","_Rectangle","Sprite","w","h","cos","TSCMath","sin","width","height","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Square","_Square","Sprite","s","cos","TSCMath","sin","size","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","sideLength","color","Oval","_Oval","Sprite","rX","rY","cos","TSCMath","sin","width","height","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radX","radY","color","Circle","_Circle","Sprite","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","color","Arc","_Arc","Sprite","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","radius","angle","color","RegularPolygon","_RegularPolygon","Sprite","off","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","off","path","vertices","first","rest","stamping","c","penCtx","ctx","cX","canvas","cY","options","color","Pen","_Pen","Sprite","off","options","sprite","penCtx","canvas","spriteClass","Engine","lastX","lastY","steps","TSCMath","x","y","dX","dY","Text","_Text","Sprite","metrics","ctx","w","h","cos","TSCMath","sin","width","height","off","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","off","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","off","path","stamping","c","penCtx","ctx","cX","canvas","cY","options","costumeNumber","bitmap","RigidRectangle","Rectangle","obstacles","stepFactor","TSCMath","target","collisionData","contact","normal","displacement","distance","ratio","pushX","pushY","r1","r2","v1","targetVel","targetAV","v2","relVel","velAlongNormal","r1n","r2n","invMass1","invMass2","r1nSq","r2nSq","invMassSum","j","impulse","tangent","velAlongTangent","r1t","r2t","r1tSq","r2tSq","invMassSumT","jt","fImpulse","totalImpX","totalImpY","options","Camera3D","options","Renderer3D","Pen","canvas","options","engine","Engine","dt","sinY","TSCMath","cosY","maxPitch","vertices","f","v","x","y","z","xp","yp","obj","sinX","cosX","sinZ","cosZ","x1","z1","y2","z2","x3","y3","WireframeRenderer3D","Renderer3D","sinX","TSCMath","cosX","sinY","cosY","sinZ","cosZ","obj","projected","f","x","vIndex","y","SolidRenderer3D","_SolidRenderer3D","Renderer3D","sinX","TSCMath","cosX","sinY","cosY","sinZ","cosZ","lx","ly","lz","lx1","lz1","ly2","lz2","lx3","ly3","lightDir","obj","h","s","l","relativeVerts","faces","face","z","i","a","b","projected","nx","ny","nz","v1","v2","normal","diffuse","brightness","litL","color","vertices","vIndex","Pen","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","Perlin1D","Perlin2D","InverseKinematics","Multiplayer","Rectangle","Square","Oval","Circle","Arc","RegularPolygon","CustomPolygon","Pen","Text","Button","Watermark","ImageSprite","RigidRectangle","Camera3D","Renderer3D","WireframeRenderer3D","SolidRenderer3D","Object3D","Tetrahedron","Cube","Octahedron","Icosahedron","Icosphere","Monkey","Cuboid","scale","aspectRatio","setScale","setAspectRatio","canvas","ctx","client_default"]}