@opentuah/core 0.1.77

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.
Files changed (127) hide show
  1. package/3d/SpriteResourceManager.d.ts +74 -0
  2. package/3d/SpriteUtils.d.ts +13 -0
  3. package/3d/TextureUtils.d.ts +24 -0
  4. package/3d/ThreeRenderable.d.ts +40 -0
  5. package/3d/WGPURenderer.d.ts +61 -0
  6. package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
  7. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
  8. package/3d/animation/SpriteAnimator.d.ts +124 -0
  9. package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
  10. package/3d/canvas.d.ts +44 -0
  11. package/3d/index.d.ts +12 -0
  12. package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
  13. package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
  14. package/3d/physics/physics-interface.d.ts +27 -0
  15. package/3d.d.ts +2 -0
  16. package/3d.js +2805 -0
  17. package/3d.js.map +22 -0
  18. package/LICENSE +21 -0
  19. package/README.md +59 -0
  20. package/Renderable.d.ts +334 -0
  21. package/animation/Timeline.d.ts +126 -0
  22. package/ansi.d.ts +13 -0
  23. package/assets/javascript/highlights.scm +205 -0
  24. package/assets/javascript/tree-sitter-javascript.wasm +0 -0
  25. package/assets/markdown/highlights.scm +150 -0
  26. package/assets/markdown/injections.scm +27 -0
  27. package/assets/markdown/tree-sitter-markdown.wasm +0 -0
  28. package/assets/markdown_inline/highlights.scm +115 -0
  29. package/assets/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  30. package/assets/typescript/highlights.scm +604 -0
  31. package/assets/typescript/tree-sitter-typescript.wasm +0 -0
  32. package/assets/zig/highlights.scm +284 -0
  33. package/assets/zig/tree-sitter-zig.wasm +0 -0
  34. package/buffer.d.ts +98 -0
  35. package/console.d.ts +140 -0
  36. package/edit-buffer.d.ts +98 -0
  37. package/editor-view.d.ts +73 -0
  38. package/index-cgvb25mm.js +14921 -0
  39. package/index-cgvb25mm.js.map +56 -0
  40. package/index.d.ts +17 -0
  41. package/index.js +9331 -0
  42. package/index.js.map +37 -0
  43. package/lib/KeyHandler.d.ts +61 -0
  44. package/lib/RGBA.d.ts +27 -0
  45. package/lib/ascii.font.d.ts +508 -0
  46. package/lib/border.d.ts +49 -0
  47. package/lib/bunfs.d.ts +7 -0
  48. package/lib/clipboard.d.ts +17 -0
  49. package/lib/data-paths.d.ts +26 -0
  50. package/lib/debounce.d.ts +42 -0
  51. package/lib/env.d.ts +42 -0
  52. package/lib/extmarks-history.d.ts +17 -0
  53. package/lib/extmarks.d.ts +89 -0
  54. package/lib/hast-styled-text.d.ts +17 -0
  55. package/lib/index.d.ts +18 -0
  56. package/lib/keymapping.d.ts +25 -0
  57. package/lib/objects-in-viewport.d.ts +24 -0
  58. package/lib/output.capture.d.ts +24 -0
  59. package/lib/parse.keypress-kitty.d.ts +2 -0
  60. package/lib/parse.keypress.d.ts +26 -0
  61. package/lib/parse.mouse.d.ts +23 -0
  62. package/lib/queue.d.ts +15 -0
  63. package/lib/renderable.validations.d.ts +12 -0
  64. package/lib/scroll-acceleration.d.ts +43 -0
  65. package/lib/selection.d.ts +63 -0
  66. package/lib/singleton.d.ts +7 -0
  67. package/lib/stdin-buffer.d.ts +44 -0
  68. package/lib/styled-text.d.ts +63 -0
  69. package/lib/terminal-capability-detection.d.ts +30 -0
  70. package/lib/terminal-palette.d.ts +43 -0
  71. package/lib/tree-sitter/assets/update.d.ts +11 -0
  72. package/lib/tree-sitter/client.d.ts +47 -0
  73. package/lib/tree-sitter/default-parsers.d.ts +2 -0
  74. package/lib/tree-sitter/download-utils.d.ts +21 -0
  75. package/lib/tree-sitter/index.d.ts +8 -0
  76. package/lib/tree-sitter/parser.worker.d.ts +1 -0
  77. package/lib/tree-sitter/parsers-config.d.ts +38 -0
  78. package/lib/tree-sitter/resolve-ft.d.ts +2 -0
  79. package/lib/tree-sitter/types.d.ts +81 -0
  80. package/lib/tree-sitter-styled-text.d.ts +14 -0
  81. package/lib/validate-dir-name.d.ts +1 -0
  82. package/lib/yoga.options.d.ts +32 -0
  83. package/package.json +67 -0
  84. package/parser.worker.js +855 -0
  85. package/parser.worker.js.map +12 -0
  86. package/post/filters.d.ts +105 -0
  87. package/renderables/ASCIIFont.d.ts +52 -0
  88. package/renderables/Box.d.ts +72 -0
  89. package/renderables/Code.d.ts +66 -0
  90. package/renderables/Diff.d.ts +185 -0
  91. package/renderables/EditBufferRenderable.d.ts +162 -0
  92. package/renderables/FrameBuffer.d.ts +16 -0
  93. package/renderables/Input.d.ts +60 -0
  94. package/renderables/LineNumberRenderable.d.ts +111 -0
  95. package/renderables/Markdown.d.ts +98 -0
  96. package/renderables/ScrollBar.d.ts +77 -0
  97. package/renderables/ScrollBox.d.ts +116 -0
  98. package/renderables/Select.d.ts +115 -0
  99. package/renderables/Slider.d.ts +44 -0
  100. package/renderables/TabSelect.d.ts +96 -0
  101. package/renderables/Text.d.ts +36 -0
  102. package/renderables/TextBufferRenderable.d.ts +103 -0
  103. package/renderables/TextNode.d.ts +91 -0
  104. package/renderables/Textarea.d.ts +114 -0
  105. package/renderables/__tests__/renderable-test-utils.d.ts +7 -0
  106. package/renderables/composition/VRenderable.d.ts +16 -0
  107. package/renderables/composition/constructs.d.ts +35 -0
  108. package/renderables/composition/vnode.d.ts +46 -0
  109. package/renderables/index.d.ts +20 -0
  110. package/renderables/markdown-parser.d.ts +10 -0
  111. package/renderer.d.ts +370 -0
  112. package/syntax-style.d.ts +54 -0
  113. package/testing/mock-keys.d.ts +80 -0
  114. package/testing/mock-mouse.d.ts +38 -0
  115. package/testing/mock-tree-sitter-client.d.ts +23 -0
  116. package/testing/spy.d.ts +7 -0
  117. package/testing/test-recorder.d.ts +61 -0
  118. package/testing/test-renderer.d.ts +23 -0
  119. package/testing.d.ts +6 -0
  120. package/testing.js +670 -0
  121. package/testing.js.map +15 -0
  122. package/text-buffer-view.d.ts +42 -0
  123. package/text-buffer.d.ts +67 -0
  124. package/types.d.ts +120 -0
  125. package/utils.d.ts +14 -0
  126. package/zig-structs.d.ts +42 -0
  127. package/zig.d.ts +326 -0
package/3d.js.map ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/3d/WGPURenderer.ts", "../src/3d/canvas.ts", "../src/3d/ThreeRenderable.ts", "../src/3d/TextureUtils.ts", "../src/3d/SpriteUtils.ts", "../src/3d/animation/SpriteAnimator.ts", "../src/3d/animation/ExplodingSpriteEffect.ts", "../src/3d/animation/SpriteParticleGenerator.ts", "../src/3d/animation/PhysicsExplodingSpriteEffect.ts", "../src/3d/physics/RapierPhysicsAdapter.ts", "../src/3d/physics/PlanckPhysicsAdapter.ts", "../src/3d/SpriteResourceManager.ts", "../src/3d.ts"],
4
+ "sourcesContent": [
5
+ "import { PerspectiveCamera, OrthographicCamera, Color, NoToneMapping, LinearSRGBColorSpace, Scene } from \"three\"\nimport { WebGPURenderer } from \"three/webgpu\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport { RGBA } from \"../lib/RGBA\"\nimport { createWebGPUDevice, setupGlobals } from \"bun-webgpu\"\nimport { CLICanvas, SuperSampleAlgorithm } from \"./canvas\"\nimport { CliRenderEvents, type CliRenderer } from \"../renderer\"\n\nexport enum SuperSampleType {\n NONE = \"none\",\n GPU = \"gpu\",\n CPU = \"cpu\",\n}\n\nexport interface ThreeCliRendererOptions {\n width: number\n height: number\n focalLength?: number\n backgroundColor?: RGBA\n superSample?: SuperSampleType\n alpha?: boolean\n autoResize?: boolean\n libPath?: string\n}\n\nexport class ThreeCliRenderer {\n private outputWidth: number\n private outputHeight: number\n private renderWidth: number\n private renderHeight: number\n private superSample: SuperSampleType\n private backgroundColor: RGBA = RGBA.fromValues(0, 0, 0, 1)\n private alpha: boolean = false\n private threeRenderer?: WebGPURenderer\n private canvas?: CLICanvas\n private device: GPUDevice | null = null\n\n private activeCamera: PerspectiveCamera | OrthographicCamera\n private _aspectRatio: number | null = null\n private doRenderStats: boolean = false\n\n private resizeHandler: (width: number, height: number) => void\n private debugToggleHandler: (enabled: boolean) => void\n private destroyHandler: () => void\n\n // Stats tracking\n private renderTimeMs: number = 0\n private readbackTimeMs: number = 0\n private totalDrawTimeMs: number = 0\n\n private renderMethod: (\n root: Scene,\n camera: PerspectiveCamera | OrthographicCamera,\n buffer: OptimizedBuffer,\n deltaTime: number,\n ) => Promise<void> = () => Promise.resolve()\n\n public get aspectRatio(): number {\n if (this._aspectRatio) return this._aspectRatio\n if (this.cliRenderer.resolution) {\n const pixelAspectRatio = this.cliRenderer.resolution.width / this.cliRenderer.resolution.height\n return pixelAspectRatio\n }\n const terminalWidth = process.stdout.columns\n const terminalHeight = process.stdout.rows\n return terminalWidth / (terminalHeight * 2)\n }\n\n constructor(\n private readonly cliRenderer: CliRenderer,\n options: ThreeCliRendererOptions,\n ) {\n this.outputWidth = options.width\n this.outputHeight = options.height\n this.superSample = options.superSample ?? SuperSampleType.GPU\n\n this.renderWidth = this.outputWidth * (this.superSample !== SuperSampleType.NONE ? 2 : 1)\n this.renderHeight = this.outputHeight * (this.superSample !== SuperSampleType.NONE ? 2 : 1)\n\n this.backgroundColor = options.backgroundColor ?? RGBA.fromValues(0, 0, 0, 1)\n this.alpha = options.alpha ?? false\n\n if (process.env.CELL_ASPECT_RATIO) {\n this._aspectRatio = parseFloat(process.env.CELL_ASPECT_RATIO)\n }\n\n // Create a default active camera\n const fov = options.focalLength ? 2 * Math.atan(this.outputHeight / (2 * options.focalLength)) * (180 / Math.PI) : 1 // Default FOV if focal length not provided\n this.activeCamera = new PerspectiveCamera(\n fov,\n this.aspectRatio,\n 0.1, // near plane\n 1000, // far plane\n )\n this.activeCamera.position.set(0, 0, 3)\n this.activeCamera.up.set(0, 1, 0)\n this.activeCamera.lookAt(0, 0, 0)\n this.activeCamera.updateMatrixWorld()\n\n this.resizeHandler = (width: number, height: number) => {\n this.setSize(width, height, true)\n }\n\n this.debugToggleHandler = (enabled: boolean) => {\n this.doRenderStats = enabled\n }\n\n this.destroyHandler = () => {\n this.destroy()\n }\n\n if (options.autoResize !== false) {\n this.cliRenderer.on(\"resize\", this.resizeHandler)\n }\n\n this.cliRenderer.on(CliRenderEvents.DEBUG_OVERLAY_TOGGLE, this.debugToggleHandler)\n this.cliRenderer.on(CliRenderEvents.DESTROY, this.destroyHandler)\n\n setupGlobals({ libPath: options.libPath })\n }\n\n public toggleDebugStats(): void {\n this.doRenderStats = !this.doRenderStats\n }\n\n async init(): Promise<void> {\n this.device = await createWebGPUDevice()\n this.canvas = new CLICanvas(this.device, this.renderWidth, this.renderHeight, this.superSample)\n\n try {\n this.threeRenderer = new WebGPURenderer({\n canvas: this.canvas as unknown as HTMLCanvasElement,\n device: this.device,\n alpha: this.alpha,\n })\n\n this.setBackgroundColor(this.backgroundColor)\n\n this.threeRenderer.toneMapping = NoToneMapping\n this.threeRenderer.outputColorSpace = LinearSRGBColorSpace\n\n this.threeRenderer.setSize(this.renderWidth, this.renderHeight, false)\n } catch (error) {\n console.error(\"Error creating THREE.WebGPURenderer:\", error)\n throw error\n }\n\n await this.threeRenderer.init().then(() => {\n this.renderMethod = this.doDrawScene.bind(this)\n })\n }\n\n public getSuperSampleAlgorithm(): SuperSampleAlgorithm {\n return this.canvas!.getSuperSampleAlgorithm()\n }\n\n public setSuperSampleAlgorithm(superSampleAlgorithm: SuperSampleAlgorithm): void {\n this.canvas!.setSuperSampleAlgorithm(superSampleAlgorithm)\n }\n\n public saveToFile(filePath: string): Promise<void> {\n return this.canvas!.saveToFile(filePath)\n }\n\n setActiveCamera(camera: PerspectiveCamera | OrthographicCamera): void {\n this.activeCamera = camera\n }\n\n getActiveCamera(): PerspectiveCamera | OrthographicCamera {\n return this.activeCamera\n }\n\n public setBackgroundColor(color: RGBA): void {\n this.backgroundColor = color\n const clearColor = new Color(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b)\n const clearAlpha = this.alpha ? this.backgroundColor.a : 1.0\n this.threeRenderer!.setClearColor(clearColor, clearAlpha)\n }\n\n setSize(width: number, height: number, forceUpdate: boolean = false): void {\n // Check against OUTPUT dimensions\n if (!forceUpdate && this.outputWidth === width && this.outputHeight === height) return\n\n this.outputWidth = width\n this.outputHeight = height\n\n this.renderWidth = this.outputWidth * (this.superSample !== SuperSampleType.NONE ? 2 : 1)\n this.renderHeight = this.outputHeight * (this.superSample !== SuperSampleType.NONE ? 2 : 1)\n\n this.canvas?.setSize(this.renderWidth, this.renderHeight)\n\n this.threeRenderer?.setSize(this.renderWidth, this.renderHeight, false)\n this.threeRenderer?.setViewport(0, 0, this.renderWidth, this.renderHeight)\n\n if (this.activeCamera instanceof PerspectiveCamera) {\n this.activeCamera.aspect = this.aspectRatio\n }\n this.activeCamera.updateProjectionMatrix()\n }\n\n public async drawScene(root: Scene, buffer: OptimizedBuffer, deltaTime: number): Promise<void> {\n await this.renderMethod(root, this.activeCamera, buffer, deltaTime)\n\n if (this.doRenderStats) {\n this.renderStats(buffer)\n }\n }\n\n private rendering: boolean = false\n private destroyed: boolean = false\n async doDrawScene(\n root: Scene,\n camera: PerspectiveCamera | OrthographicCamera,\n buffer: OptimizedBuffer,\n deltaTime: number,\n ): Promise<void> {\n if (this.rendering) {\n console.warn(\"ThreeCliRenderer.drawScene was called concurrently, which is not supported.\")\n return\n }\n if (this.destroyed) {\n return\n }\n try {\n this.rendering = true\n\n const totalStart = performance.now()\n const renderStart = performance.now()\n await this.threeRenderer!.render(root, camera)\n this.renderTimeMs = performance.now() - renderStart\n\n const readbackStart = performance.now()\n await this.canvas!.readPixelsIntoBuffer(buffer)\n this.readbackTimeMs = performance.now() - readbackStart\n\n this.totalDrawTimeMs = performance.now() - totalStart\n } finally {\n this.rendering = false\n }\n }\n\n public toggleSuperSampling(): void {\n if (this.superSample === SuperSampleType.NONE) {\n this.superSample = SuperSampleType.CPU\n } else if (this.superSample === SuperSampleType.CPU) {\n this.superSample = SuperSampleType.GPU\n } else {\n this.superSample = SuperSampleType.NONE\n }\n this.canvas!.setSuperSample(this.superSample)\n this.setSize(this.outputWidth, this.outputHeight, true)\n }\n\n public renderStats(buffer: OptimizedBuffer): void {\n const stats = [\n `WebGPU Renderer Stats:`,\n ` Render: ${this.renderTimeMs.toFixed(2)}ms`,\n ` Readback: ${this.readbackTimeMs.toFixed(2)}ms`,\n ` ├ MapAsync: ${this.canvas!.mapAsyncTimeMs.toFixed(2)}ms`,\n ` └ SS Draw: ${this.canvas!.superSampleDrawTimeMs.toFixed(2)}ms`,\n ` Total Draw: ${this.totalDrawTimeMs.toFixed(2)}ms`,\n ` SuperSample: ${this.superSample}`,\n ` SuperSample Algorithm: ${this.getSuperSampleAlgorithm()}`,\n ]\n const startY = 4\n const startX = 2\n const fg = RGBA.fromValues(0.9, 0.9, 0.9, 1.0)\n const bg = RGBA.fromValues(0.1, 0.1, 0.1, 1.0)\n\n stats.forEach((line, index) => {\n buffer.drawText(line, startX + 1, startY + index, fg, bg)\n })\n }\n\n public destroy(): void {\n this.destroyed = true\n\n this.cliRenderer.off(\"resize\", this.resizeHandler)\n this.cliRenderer.off(CliRenderEvents.DEBUG_OVERLAY_TOGGLE, this.debugToggleHandler)\n\n if (this.canvas) {\n this.canvas.destroy()\n }\n\n if (this.threeRenderer) {\n this.threeRenderer.dispose()\n this.threeRenderer = undefined\n }\n\n this.canvas = undefined\n this.device = null\n this.renderMethod = () => Promise.resolve()\n }\n}\n",
6
+ "import { GPUCanvasContextMock } from \"bun-webgpu\"\nimport { RGBA } from \"../lib/RGBA\"\nimport { SuperSampleType } from \"./WGPURenderer\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport { toArrayBuffer } from \"bun:ffi\"\nimport { Jimp } from \"jimp\"\n\n// @ts-ignore\nimport shaderTemplate from \"./shaders/supersampling.wgsl\" with { type: \"text\" }\n\nconst WORKGROUP_SIZE = 4\nconst SUPERSAMPLING_COMPUTE_SHADER = shaderTemplate.replace(/\\${WORKGROUP_SIZE}/g, WORKGROUP_SIZE.toString())\n\nexport enum SuperSampleAlgorithm {\n STANDARD = 0,\n PRE_SQUEEZED = 1,\n}\n\nexport class CLICanvas {\n private device: GPUDevice\n private readbackBuffer: GPUBuffer | null = null\n private width: number\n private height: number\n private gpuCanvasContext: GPUCanvasContextMock\n\n public superSampleDrawTimeMs: number = 0\n public mapAsyncTimeMs: number = 0\n public superSample: SuperSampleType = SuperSampleType.GPU\n\n // Compute shader super sampling\n private computePipeline: GPUComputePipeline | null = null\n private computeBindGroupLayout: GPUBindGroupLayout | null = null\n private computeOutputBuffer: GPUBuffer | null = null\n private computeParamsBuffer: GPUBuffer | null = null\n private computeReadbackBuffer: GPUBuffer | null = null\n private updateScheduled: boolean = false\n private screenshotGPUBuffer: GPUBuffer | null = null\n private superSampleAlgorithm: SuperSampleAlgorithm = SuperSampleAlgorithm.STANDARD\n private destroyed: boolean = false\n\n constructor(\n device: GPUDevice,\n width: number,\n height: number,\n superSample: SuperSampleType,\n sampleAlgo: SuperSampleAlgorithm = SuperSampleAlgorithm.STANDARD,\n ) {\n this.device = device\n this.width = width\n this.height = height\n this.superSample = superSample\n this.gpuCanvasContext = new GPUCanvasContextMock(this as unknown as HTMLCanvasElement, width, height)\n this.superSampleAlgorithm = sampleAlgo\n }\n\n public destroy(): void {\n this.destroyed = true\n }\n\n public setSuperSampleAlgorithm(superSampleAlgorithm: SuperSampleAlgorithm): void {\n this.superSampleAlgorithm = superSampleAlgorithm\n this.scheduleUpdateComputeBuffers()\n }\n\n public getSuperSampleAlgorithm(): SuperSampleAlgorithm {\n return this.superSampleAlgorithm\n }\n\n getContext(type: string, attrs?: WebGLContextAttributes) {\n if (type === \"webgpu\") {\n this.updateReadbackBuffer(this.width, this.height)\n this.updateComputeBuffers(this.width, this.height)\n return this.gpuCanvasContext\n }\n throw new Error(`getContext not implemented: ${type}`)\n }\n\n setSize(width: number, height: number) {\n this.width = width\n this.height = height\n this.gpuCanvasContext.setSize(width, height)\n this.updateReadbackBuffer(width, height)\n this.scheduleUpdateComputeBuffers()\n }\n\n addEventListener(event: string, listener: any, options?: any) {\n console.error(\"addEventListener mockCanvas\", event, listener, options)\n }\n\n removeEventListener(event: string, listener: any, options?: any) {\n console.error(\"removeEventListener mockCanvas\", event, listener, options)\n }\n\n dispatchEvent(event: Event) {\n console.error(\"dispatchEvent mockCanvas\", event)\n }\n\n public setSuperSample(superSample: SuperSampleType): void {\n this.superSample = superSample\n }\n\n public async saveToFile(filePath: string): Promise<void> {\n const bytesPerPixel = 4 // RGBA\n const unalignedBytesPerRow = this.width * bytesPerPixel\n const alignedBytesPerRow = Math.ceil(unalignedBytesPerRow / 256) * 256\n const textureBufferSize = alignedBytesPerRow * this.height\n\n if (!this.screenshotGPUBuffer || this.screenshotGPUBuffer.size !== textureBufferSize) {\n if (this.screenshotGPUBuffer) {\n this.screenshotGPUBuffer.destroy()\n }\n this.screenshotGPUBuffer = this.device.createBuffer({\n label: \"Screenshot GPU Buffer\",\n size: textureBufferSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n })\n }\n\n const texture = this.gpuCanvasContext.getCurrentTexture()\n\n const commandEncoder = this.device.createCommandEncoder({ label: \"Screenshot Command Encoder\" })\n commandEncoder.copyTextureToBuffer(\n { texture: texture },\n { buffer: this.screenshotGPUBuffer, bytesPerRow: alignedBytesPerRow, rowsPerImage: this.height },\n { width: this.width, height: this.height },\n )\n const commandBuffer = commandEncoder.finish()\n this.device.queue.submit([commandBuffer])\n\n await this.screenshotGPUBuffer.mapAsync(GPUMapMode.READ)\n\n const resultBuffer = this.screenshotGPUBuffer.getMappedRange()\n const pixelData = new Uint8Array(resultBuffer)\n const contextFormat = texture.format\n const isBGRA = contextFormat === \"bgra8unorm\"\n\n // Handle row padding - extract only the actual image data\n const imageData = new Uint8Array(this.width * this.height * 4)\n for (let y = 0; y < this.height; y++) {\n const srcOffset = y * alignedBytesPerRow\n const dstOffset = y * this.width * 4\n\n if (isBGRA) {\n for (let x = 0; x < this.width; x++) {\n const srcPixelOffset = srcOffset + x * 4\n const dstPixelOffset = dstOffset + x * 4\n\n imageData[dstPixelOffset] = pixelData[srcPixelOffset + 2]\n imageData[dstPixelOffset + 1] = pixelData[srcPixelOffset + 1]\n imageData[dstPixelOffset + 2] = pixelData[srcPixelOffset]\n imageData[dstPixelOffset + 3] = pixelData[srcPixelOffset + 3]\n }\n } else {\n imageData.set(pixelData.subarray(srcOffset, srcOffset + this.width * 4), dstOffset)\n }\n }\n\n const image = new Jimp({\n data: Buffer.from(imageData),\n width: this.width,\n height: this.height,\n })\n\n await image.write(filePath as `${string}.${string}`)\n this.screenshotGPUBuffer.unmap()\n }\n\n private async initComputePipeline(): Promise<void> {\n if (this.computePipeline) return\n\n const shaderModule = this.device.createShaderModule({\n label: \"SuperSampling Compute Shader\",\n code: SUPERSAMPLING_COMPUTE_SHADER,\n })\n\n this.computeBindGroupLayout = this.device.createBindGroupLayout({\n label: \"SuperSampling Bind Group Layout\",\n entries: [\n {\n binding: 0,\n visibility: GPUShaderStage.COMPUTE,\n texture: { sampleType: \"float\", viewDimension: \"2d\" },\n },\n {\n binding: 1,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"storage\" },\n },\n {\n binding: 2,\n visibility: GPUShaderStage.COMPUTE,\n buffer: { type: \"uniform\" },\n },\n ],\n })\n\n const pipelineLayout = this.device.createPipelineLayout({\n label: \"SuperSampling Pipeline Layout\",\n bindGroupLayouts: [this.computeBindGroupLayout],\n })\n\n this.computePipeline = this.device.createComputePipeline({\n label: \"SuperSampling Compute Pipeline\",\n layout: pipelineLayout,\n compute: {\n module: shaderModule,\n entryPoint: \"main\",\n },\n })\n\n // Create uniform buffer for parameters (8 bytes - 2 u32s: width, height)\n this.computeParamsBuffer = this.device.createBuffer({\n label: \"SuperSampling Params Buffer\",\n size: 16,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n })\n\n this.updateComputeParams()\n }\n\n private updateComputeParams(): void {\n if (!this.computeParamsBuffer || this.superSample === SuperSampleType.NONE) return\n\n // Update uniform buffer with parameters\n // Note: this.width/height are render dimensions (2x terminal size for super sampling)\n const paramsData = new ArrayBuffer(16)\n const uint32View = new Uint32Array(paramsData)\n\n uint32View[0] = this.width\n uint32View[1] = this.height\n uint32View[2] = this.superSampleAlgorithm\n\n this.device.queue.writeBuffer(this.computeParamsBuffer, 0, paramsData)\n }\n\n private scheduleUpdateComputeBuffers(): void {\n this.updateScheduled = true\n }\n\n private updateComputeBuffers(width: number, height: number): void {\n if (this.superSample === SuperSampleType.NONE) return\n this.updateComputeParams()\n\n // Calculate output buffer size (48 bytes per cell: 2 vec4f + u32 + 3 padding u32s)\n // Must match WGSL calculation exactly: (params.width + 1u) / 2u\n const cellBytesSize = 48 // 16 + 16 + 4 + 4 + 4 + 4 bytes (16-byte aligned)\n const terminalWidthCells = Math.floor((width + 1) / 2)\n const terminalHeightCells = Math.floor((height + 1) / 2)\n const outputBufferSize = terminalWidthCells * terminalHeightCells * cellBytesSize\n\n const oldOutputBuffer = this.computeOutputBuffer\n const oldReadbackBuffer = this.computeReadbackBuffer\n\n if (oldOutputBuffer) {\n oldOutputBuffer.destroy()\n }\n if (oldReadbackBuffer) {\n oldReadbackBuffer.destroy()\n }\n\n // Create new buffers\n this.computeOutputBuffer = this.device.createBuffer({\n label: \"SuperSampling Output Buffer\",\n size: outputBufferSize,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,\n })\n\n this.computeReadbackBuffer = this.device.createBuffer({\n label: \"SuperSampling Readback Buffer\",\n size: outputBufferSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n })\n }\n\n private async runComputeShaderSuperSampling(texture: GPUTexture, buffer: OptimizedBuffer): Promise<void> {\n if (this.destroyed) {\n return\n }\n\n if (this.updateScheduled) {\n this.updateScheduled = false\n await this.device.queue.onSubmittedWorkDone()\n this.updateComputeBuffers(this.width, this.height)\n }\n\n await this.initComputePipeline()\n\n if (\n !this.computePipeline ||\n !this.computeBindGroupLayout ||\n !this.computeOutputBuffer ||\n !this.computeParamsBuffer\n ) {\n throw new Error(\"Compute pipeline not initialized\")\n }\n\n const mapAsyncStart = performance.now()\n const textureView = texture.createView({\n label: \"SuperSampling Input Texture View\",\n })\n\n const bindGroup = this.device.createBindGroup({\n label: \"SuperSampling Bind Group\",\n layout: this.computeBindGroupLayout,\n entries: [\n { binding: 0, resource: textureView },\n { binding: 1, resource: { buffer: this.computeOutputBuffer } },\n { binding: 2, resource: { buffer: this.computeParamsBuffer } },\n ],\n })\n\n const commandEncoder = this.device.createCommandEncoder({ label: \"SuperSampling Command Encoder\" })\n const computePass = commandEncoder.beginComputePass({ label: \"SuperSampling Compute Pass\" })\n computePass.setPipeline(this.computePipeline)\n computePass.setBindGroup(0, bindGroup)\n\n // Must match WGSL calculation exactly: (params.width + 1u) / 2u\n const terminalWidthCells = Math.floor((this.width + 1) / 2)\n const terminalHeightCells = Math.floor((this.height + 1) / 2)\n const dispatchX = Math.ceil(terminalWidthCells / WORKGROUP_SIZE)\n const dispatchY = Math.ceil(terminalHeightCells / WORKGROUP_SIZE)\n\n computePass.dispatchWorkgroups(dispatchX, dispatchY, 1)\n computePass.end()\n\n commandEncoder.copyBufferToBuffer(\n this.computeOutputBuffer,\n 0,\n this.computeReadbackBuffer!,\n 0,\n this.computeOutputBuffer.size,\n )\n\n const commandBuffer = commandEncoder.finish()\n this.device.queue.submit([commandBuffer])\n\n await this.computeReadbackBuffer!.mapAsync(GPUMapMode.READ)\n\n if (this.destroyed) {\n this.computeReadbackBuffer!.unmap()\n return\n }\n\n const resultsPtr = this.computeReadbackBuffer!.getMappedRangePtr()\n const size = this.computeReadbackBuffer!.size\n\n this.mapAsyncTimeMs = performance.now() - mapAsyncStart\n\n const ssStart = performance.now()\n buffer.drawPackedBuffer(resultsPtr, size, 0, 0, terminalWidthCells, terminalHeightCells)\n this.superSampleDrawTimeMs = performance.now() - ssStart\n\n this.computeReadbackBuffer!.unmap()\n }\n\n private updateReadbackBuffer(renderWidth: number, renderHeight: number): void {\n if (this.readbackBuffer) {\n this.readbackBuffer.destroy()\n }\n const bytesPerPixel = 4 // Assuming RGBA8 or BGRA8\n const unalignedBytesPerRow = renderWidth * bytesPerPixel\n const alignedBytesPerRow = Math.ceil(unalignedBytesPerRow / 256) * 256\n const textureBufferSize = alignedBytesPerRow * renderHeight\n this.readbackBuffer = this.device!.createBuffer({\n label: \"Readback Buffer\",\n size: textureBufferSize,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n })\n }\n\n async readPixelsIntoBuffer(buffer: OptimizedBuffer): Promise<void> {\n if (this.destroyed) {\n return\n }\n\n const texture = this.gpuCanvasContext.getCurrentTexture()\n this.gpuCanvasContext.switchTextures()\n\n if (this.superSample === SuperSampleType.GPU) {\n await this.runComputeShaderSuperSampling(texture, buffer)\n return\n }\n\n const textureBuffer = this.readbackBuffer\n if (!textureBuffer) {\n throw new Error(\"Readback buffer not found\")\n }\n\n try {\n const bytesPerPixel = 4 // Assuming RGBA8 or BGRA8\n const unalignedBytesPerRow = this.width * bytesPerPixel\n const alignedBytesPerRow = Math.ceil(unalignedBytesPerRow / 256) * 256\n const contextFormat = texture.format\n\n const commandEncoder = this.device.createCommandEncoder({ label: \"Readback Command Encoder\" })\n commandEncoder.copyTextureToBuffer(\n { texture: texture },\n { buffer: textureBuffer, bytesPerRow: alignedBytesPerRow, rowsPerImage: this.height },\n {\n width: this.width,\n height: this.height,\n },\n )\n const commandBuffer = commandEncoder.finish()\n this.device.queue.submit([commandBuffer])\n\n const mapStart = performance.now()\n await textureBuffer.mapAsync(GPUMapMode.READ, 0, textureBuffer.size)\n this.mapAsyncTimeMs = performance.now() - mapStart\n\n if (this.destroyed) {\n textureBuffer.unmap()\n return\n }\n\n const mappedRangePtr = textureBuffer.getMappedRangePtr(0, textureBuffer.size)\n const bufPtr = mappedRangePtr\n\n if (this.superSample === SuperSampleType.CPU) {\n const format = contextFormat === \"bgra8unorm\" ? \"bgra8unorm\" : \"rgba8unorm\"\n const ssStart = performance.now()\n buffer.drawSuperSampleBuffer(0, 0, bufPtr, textureBuffer.size, format, alignedBytesPerRow)\n this.superSampleDrawTimeMs = performance.now() - ssStart\n } else {\n this.superSampleDrawTimeMs = 0\n const pixelData = new Uint8Array(toArrayBuffer(bufPtr, 0, textureBuffer.size))\n const isBGRA = contextFormat === \"bgra8unorm\"\n const backgroundColor = RGBA.fromValues(0, 0, 0, 1)\n\n for (let y = 0; y < this.height; y++) {\n for (let x = 0; x < this.width; x++) {\n const pixelIndexInPaddedRow = y * alignedBytesPerRow + x * bytesPerPixel\n\n if (pixelIndexInPaddedRow + 3 >= pixelData.length) continue\n\n let rByte, gByte, bByte // Alpha currently ignored\n\n if (isBGRA) {\n bByte = pixelData[pixelIndexInPaddedRow]\n gByte = pixelData[pixelIndexInPaddedRow + 1]\n rByte = pixelData[pixelIndexInPaddedRow + 2]\n } else {\n // Assume RGBA\n rByte = pixelData[pixelIndexInPaddedRow]\n gByte = pixelData[pixelIndexInPaddedRow + 1]\n bByte = pixelData[pixelIndexInPaddedRow + 2]\n }\n\n // Convert to [0-1] range for RGB class\n const r = rByte / 255.0\n const g = gByte / 255.0\n const b = bByte / 255.0\n\n const cellColor = RGBA.fromValues(r, g, b, 1.0)\n\n buffer.setCellWithAlphaBlending(x, y, \"█\", cellColor, backgroundColor)\n }\n }\n }\n } finally {\n textureBuffer.unmap()\n }\n }\n}\n",
7
+ "import { OrthographicCamera, PerspectiveCamera, Scene } from \"three\"\n\nimport { OptimizedBuffer } from \"../buffer\"\nimport { RGBA } from \"../lib/RGBA\"\nimport { Renderable, type RenderableOptions } from \"../Renderable\"\nimport type { CliRenderer } from \"../renderer\"\nimport type { RenderContext } from \"../types\"\nimport { ThreeCliRenderer, type ThreeCliRendererOptions } from \"./WGPURenderer\"\n\nexport interface ThreeRenderableOptions extends RenderableOptions<ThreeRenderable> {\n scene?: Scene | null\n camera?: PerspectiveCamera | OrthographicCamera\n renderer?: Omit<ThreeCliRendererOptions, \"width\" | \"height\" | \"autoResize\">\n autoAspect?: boolean\n}\n\nexport class ThreeRenderable extends Renderable {\n private engine: ThreeCliRenderer\n private scene: Scene | null\n private autoAspect: boolean\n private initPromise: Promise<boolean> | null = null\n private initFailed: boolean = false\n private drawInFlight: boolean = false\n private frameCallback: ((deltaTime: number) => Promise<void>) | null = null\n private frameCallbackRegistered: boolean = false\n private cliRenderer: CliRenderer\n private clearColor: RGBA\n\n constructor(ctx: RenderContext, options: ThreeRenderableOptions) {\n const { scene = null, camera, renderer, autoAspect = true, ...renderableOptions } = options\n super(ctx, { ...renderableOptions, buffered: true, live: options.live ?? true })\n\n const cliRenderer = ctx as CliRenderer\n if (typeof cliRenderer.setFrameCallback !== \"function\" || typeof cliRenderer.removeFrameCallback !== \"function\") {\n throw new Error(\"ThreeRenderable requires a CliRenderer context\")\n }\n\n this.cliRenderer = cliRenderer\n this.scene = scene\n this.autoAspect = autoAspect\n this.clearColor = renderer?.backgroundColor ?? RGBA.fromValues(0, 0, 0, 1)\n\n const { width, height } = this.getRenderSize()\n this.engine = new ThreeCliRenderer(cliRenderer, {\n width,\n height,\n autoResize: false,\n ...renderer,\n })\n\n if (camera) {\n this.engine.setActiveCamera(camera)\n }\n this.updateCameraAspect(width, height)\n\n this.registerFrameCallback()\n }\n\n public get aspectRatio(): number {\n return this.getAspectRatio(this.width, this.height)\n }\n\n public get renderer(): ThreeCliRenderer {\n return this.engine\n }\n\n public getScene(): Scene | null {\n return this.scene\n }\n\n public setScene(scene: Scene | null): void {\n this.scene = scene\n this.requestRender()\n }\n\n public getActiveCamera(): PerspectiveCamera | OrthographicCamera {\n return this.engine.getActiveCamera()\n }\n\n public setActiveCamera(camera: PerspectiveCamera | OrthographicCamera): void {\n this.engine.setActiveCamera(camera)\n this.updateCameraAspect(this.width, this.height)\n this.requestRender()\n }\n\n public setAutoAspect(autoAspect: boolean): void {\n if (this.autoAspect === autoAspect) return\n this.autoAspect = autoAspect\n if (autoAspect) {\n this.updateCameraAspect(this.width, this.height)\n }\n }\n\n protected onResize(width: number, height: number): void {\n if (width > 0 && height > 0) {\n this.engine.setSize(width, height, true)\n this.updateCameraAspect(width, height)\n }\n super.onResize(width, height)\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible || this.isDestroyed) return\n if (this.frameCallbackRegistered) return\n if (this.buffered && !this.frameBuffer) return\n void this.renderToBuffer(buffer, deltaTime / 1000)\n }\n\n protected destroySelf(): void {\n if (this.frameCallback && this.frameCallbackRegistered) {\n this.cliRenderer.removeFrameCallback(this.frameCallback)\n this.frameCallbackRegistered = false\n this.frameCallback = null\n }\n\n this.engine.destroy()\n super.destroySelf()\n }\n\n private registerFrameCallback(): void {\n if (this.frameCallbackRegistered) return\n\n this.frameCallback = async (deltaTime: number) => {\n if (this.isDestroyed || !this.visible || !this.parent) return\n if (!this.scene || !this.frameBuffer) return\n await this.renderToBuffer(this.frameBuffer, deltaTime / 1000)\n }\n\n this.cliRenderer.setFrameCallback(this.frameCallback)\n this.frameCallbackRegistered = true\n }\n\n private async renderToBuffer(buffer: OptimizedBuffer, deltaTime: number): Promise<void> {\n if (!this.scene || this.isDestroyed || this.drawInFlight) return\n\n this.drawInFlight = true\n try {\n const initialized = await this.ensureInitialized()\n if (!initialized || !this.scene) return\n\n if (buffer === this.frameBuffer) {\n buffer.clear(this.clearColor)\n }\n\n await this.engine.drawScene(this.scene, buffer, deltaTime)\n } finally {\n this.drawInFlight = false\n }\n }\n\n private async ensureInitialized(): Promise<boolean> {\n if (this.initFailed) return false\n if (!this.initPromise) {\n this.initPromise = this.engine\n .init()\n .then(() => true)\n .catch((error) => {\n this.initFailed = true\n console.error(\"ThreeRenderable init failed:\", error)\n return false\n })\n }\n return this.initPromise\n }\n\n private updateCameraAspect(width: number, height: number): void {\n if (!this.autoAspect || width <= 0 || height <= 0) return\n\n const camera = this.engine.getActiveCamera()\n if (camera instanceof PerspectiveCamera) {\n camera.aspect = this.getAspectRatio(width, height)\n camera.updateProjectionMatrix()\n }\n }\n\n private getAspectRatio(width: number, height: number): number {\n if (width <= 0 || height <= 0) return 1\n\n const resolution = this.cliRenderer.resolution\n if (resolution && this.cliRenderer.terminalWidth > 0 && this.cliRenderer.terminalHeight > 0) {\n const cellWidth = resolution.width / this.cliRenderer.terminalWidth\n const cellHeight = resolution.height / this.cliRenderer.terminalHeight\n if (cellHeight > 0) {\n return (width * cellWidth) / (height * cellHeight)\n }\n }\n\n return width / (height * 2)\n }\n\n private getRenderSize(): { width: number; height: number } {\n return {\n width: Math.max(1, this.width),\n height: Math.max(1, this.height),\n }\n }\n}\n",
8
+ "import { Color, Texture, DataTexture, NearestFilter, ClampToEdgeWrapping, RGBAFormat, UnsignedByteType } from \"three\"\nimport { Jimp } from \"jimp\"\n\ninterface SimpleImageData {\n data: Uint8ClampedArray\n width: number\n height: number\n}\n\n// Utility class for loading and generating THREE.Texture instances\nexport class TextureUtils {\n /**\n * Loads a texture from a file path using sharp.\n * Returns a THREE.Texture with ImageData attached to its .image property.\n */\n static async loadTextureFromFile(path: string): Promise<DataTexture | null> {\n try {\n const buffer = await Bun.file(path).arrayBuffer()\n const image = await Jimp.read(buffer)\n\n image.flip({ horizontal: false, vertical: true })\n\n const texture = new DataTexture(\n image.bitmap.data,\n image.bitmap.width,\n image.bitmap.height,\n RGBAFormat,\n UnsignedByteType,\n )\n texture.needsUpdate = true\n texture.format = RGBAFormat\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n texture.wrapS = ClampToEdgeWrapping\n texture.wrapT = ClampToEdgeWrapping\n texture.flipY = false // Usually true for webGL, but our sampler flips V\n\n return texture\n } catch (error) {\n console.error(`Failed to load texture from ${path}:`, error)\n return null\n }\n }\n\n /**\n * Alias for loadTextureFromFile for convenience.\n */\n static async fromFile(path: string): Promise<DataTexture | null> {\n return this.loadTextureFromFile(path)\n }\n\n /**\n * Creates a THREE.Texture with a checkerboard pattern.\n */\n static createCheckerboard(\n size: number = 256,\n color1: Color = new Color(1.0, 1.0, 1.0),\n color2: Color = new Color(0.0, 0.0, 0.0),\n checkSize: number = 32,\n ): Texture {\n const data = new Uint8ClampedArray(size * size * 4)\n\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const isEvenX = Math.floor(x / checkSize) % 2 === 0\n const isEvenY = Math.floor(y / checkSize) % 2 === 0\n const color = (isEvenX && isEvenY) || (!isEvenX && !isEvenY) ? color1 : color2\n\n const index = (y * size + x) * 4\n data[index] = Math.floor(color.r * 255)\n data[index + 1] = Math.floor(color.g * 255)\n data[index + 2] = Math.floor(color.b * 255)\n data[index + 3] = 255 // Alpha\n }\n }\n\n const imageData: SimpleImageData = { data, width: size, height: size }\n const texture = new DataTexture(data, size, size, RGBAFormat, UnsignedByteType)\n texture.needsUpdate = true\n texture.format = RGBAFormat\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n texture.wrapS = ClampToEdgeWrapping\n texture.wrapT = ClampToEdgeWrapping\n texture.flipY = false\n\n return texture\n }\n\n /**\n * Creates a THREE.Texture with a gradient pattern.\n */\n static createGradient(\n size: number = 256,\n startColor: Color = new Color(1.0, 0.0, 0.0),\n endColor: Color = new Color(0.0, 0.0, 1.0),\n direction: \"horizontal\" | \"vertical\" | \"radial\" = \"vertical\",\n ): Texture {\n const data = new Uint8ClampedArray(size * size * 4)\n\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n let t = 0\n\n if (direction === \"horizontal\") {\n t = x / (size - 1)\n } else if (direction === \"vertical\") {\n t = y / (size - 1)\n } else if (direction === \"radial\") {\n const dx = x - size / 2\n const dy = y - size / 2\n t = Math.min(1, Math.sqrt(dx * dx + dy * dy) / (size / 2))\n }\n\n const r = startColor.r * (1 - t) + endColor.r * t\n const g = startColor.g * (1 - t) + endColor.g * t\n const b = startColor.b * (1 - t) + endColor.b * t\n\n const index = (y * size + x) * 4\n data[index] = Math.floor(r * 255)\n data[index + 1] = Math.floor(g * 255)\n data[index + 2] = Math.floor(b * 255)\n data[index + 3] = 255 // Alpha\n }\n }\n\n const imageData: SimpleImageData = { data, width: size, height: size }\n const texture = new DataTexture(data, size, size, RGBAFormat, UnsignedByteType)\n texture.needsUpdate = true\n texture.format = RGBAFormat\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n texture.wrapS = ClampToEdgeWrapping\n texture.wrapT = ClampToEdgeWrapping\n texture.flipY = false\n\n return texture\n }\n\n /**\n * Creates a THREE.Texture with a procedural noise pattern.\n */\n static createNoise(\n size: number = 256,\n scale: number = 1,\n octaves: number = 1,\n color1: Color = new Color(1.0, 1.0, 1.0),\n color2: Color = new Color(0.0, 0.0, 0.0),\n ): Texture {\n const data = new Uint8ClampedArray(size * size * 4)\n\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n let noise = 0\n let amplitude = 1\n let frequency = 1\n\n for (let o = 0; o < octaves; o++) {\n const nx = (x * frequency * scale) / size\n const ny = (y * frequency * scale) / size\n const sampleX = Math.sin(nx * 12.9898) * 43758.5453\n const sampleY = Math.cos(ny * 78.233) * 43758.5453\n const sample = Math.sin(sampleX + sampleY) * 0.5 + 0.5\n noise += sample * amplitude\n amplitude *= 0.5\n frequency *= 2\n }\n\n noise = Math.min(1, Math.max(0, noise)) // Normalize\n\n const r = color1.r * noise + color2.r * (1 - noise)\n const g = color1.g * noise + color2.g * (1 - noise)\n const b = color1.b * noise + color2.b * (1 - noise)\n\n const index = (y * size + x) * 4\n data[index] = Math.floor(r * 255)\n data[index + 1] = Math.floor(g * 255)\n data[index + 2] = Math.floor(b * 255)\n data[index + 3] = 255 // Alpha\n }\n }\n\n const imageData: SimpleImageData = { data, width: size, height: size }\n const texture = new DataTexture(data, size, size, RGBAFormat, UnsignedByteType)\n texture.needsUpdate = true\n texture.format = RGBAFormat\n texture.magFilter = NearestFilter\n texture.minFilter = NearestFilter\n texture.wrapS = ClampToEdgeWrapping\n texture.wrapT = ClampToEdgeWrapping\n texture.flipY = false\n\n return texture\n }\n}\n",
9
+ "import { TextureUtils } from \"./TextureUtils\"\nimport { Sprite, SpriteMaterial, DataTexture, type SpriteMaterialParameters } from \"three\"\n\nexport class SheetSprite extends Sprite {\n private _frameIndex: number = 0\n private _numFrames: number = 0\n\n constructor(material: SpriteMaterial, numFrames: number) {\n super(material)\n this._numFrames = numFrames\n this.setIndex(0)\n }\n\n setIndex = (index: number) => {\n this._frameIndex = index\n this.material.map?.repeat.set(1 / this._numFrames, 1)\n this.material.map?.offset.set(this._frameIndex / this._numFrames, 0)\n }\n}\n\nexport class SpriteUtils {\n static async fromFile(\n path: string,\n {\n materialParameters = {\n alphaTest: 0.1,\n depthWrite: true,\n },\n }: {\n materialParameters?: Omit<SpriteMaterialParameters, \"map\">\n } = {},\n ): Promise<Sprite> {\n const texture = await TextureUtils.fromFile(path)\n if (!texture) {\n throw new Error(`Failed to load sprite texture from ${path}`)\n }\n\n const spriteMaterial = new SpriteMaterial({ map: texture, ...materialParameters })\n const sprite = new Sprite(spriteMaterial)\n\n const textureAspectRatio = texture.image.width / texture.image.height\n\n sprite.updateMatrix = function () {\n this.matrix.compose(this.position, this.quaternion, this.scale.clone().setX(this.scale.x * textureAspectRatio))\n }\n\n return sprite\n }\n\n static async sheetFromFile(path: string, numFrames: number): Promise<SheetSprite> {\n const spriteTexture = await TextureUtils.fromFile(path)\n\n if (!spriteTexture) {\n console.error(\"Failed to load sprite texture, exiting.\")\n process.exit(1)\n }\n\n const spriteMaterial = new SpriteMaterial({ map: spriteTexture })\n const sprite = new SheetSprite(spriteMaterial, numFrames)\n\n const singleFrameWidth = spriteTexture.image.width / numFrames\n const singleFrameHeight = spriteTexture.image.height\n const frameAspectRatio = singleFrameWidth / singleFrameHeight\n\n sprite.updateMatrix = function () {\n this.matrix.compose(this.position, this.quaternion, this.scale.clone().setX(this.scale.x * frameAspectRatio))\n }\n\n return sprite\n }\n}\n",
10
+ "import * as THREE from \"three\"\nimport { uniform, texture as tslTexture, uv, float, vec2, bufferAttribute, mix } from \"three/tsl\"\nimport { MeshBasicNodeMaterial, NodeMaterial } from \"three/webgpu\"\nimport type { Scene } from \"three\"\nimport { type SpriteResource, InstanceManager } from \"../SpriteResourceManager\"\n\nexport interface AnimationStateConfig {\n imagePath: string\n sheetNumFrames: number\n\n animNumFrames: number\n animFrameOffset: number\n\n frameDuration?: number\n loop?: boolean\n initialFrame?: number\n flipX?: boolean\n flipY?: boolean\n}\n\nexport type ResolvedAnimationState = Required<AnimationStateConfig> & {\n sheetTilesetWidth: number\n sheetTilesetHeight: number\n texture: THREE.DataTexture\n}\n\nexport interface AnimationDefinition {\n resource: SpriteResource\n animNumFrames?: number\n animFrameOffset?: number\n frameDuration?: number\n loop?: boolean\n initialFrame?: number\n flipX?: boolean\n flipY?: boolean\n}\n\nexport interface SpriteDefinition {\n id?: string\n renderOrder?: number\n depthWrite?: boolean\n maxInstances?: number\n scale?: number\n initialAnimation: string\n animations: Record<string, AnimationDefinition>\n}\n\nconst HIDDEN_MATRIX = new THREE.Matrix4().scale(new THREE.Vector3(0, 0, 0))\n\nconst DEFAULT_FRAME_DURATION = 100\nconst DEFAULT_INITIAL_FRAME = 0\nconst DEFAULT_SCALE = 1.0\nconst DEFAULT_FLIP_X = false\nconst DEFAULT_FLIP_Y = false\n\nclass Animation {\n public readonly name: string\n public state: ResolvedAnimationState\n private resource: SpriteResource\n public instanceIndex: number\n private instanceManager: InstanceManager\n private frameAttribute: THREE.InstancedBufferAttribute\n private flipAttribute: THREE.InstancedBufferAttribute\n\n public currentLocalFrame: number\n public timeAccumulator: number\n public isPlaying: boolean\n private _isActive: boolean = false\n\n constructor(\n name: string,\n state: ResolvedAnimationState,\n resource: SpriteResource,\n instanceIndex: number,\n instanceManager: InstanceManager,\n frameAttribute: THREE.InstancedBufferAttribute,\n flipAttribute: THREE.InstancedBufferAttribute,\n ) {\n this.name = name\n this.state = state\n this.resource = resource\n this.instanceIndex = instanceIndex\n this.instanceManager = instanceManager\n this.frameAttribute = frameAttribute\n this.flipAttribute = flipAttribute\n\n this.currentLocalFrame = state.initialFrame\n this.timeAccumulator = 0\n this.isPlaying = true\n\n this.instanceManager.mesh.setMatrixAt(this.instanceIndex, HIDDEN_MATRIX)\n const absoluteFrame = this.state.animFrameOffset + this.currentLocalFrame\n this.frameAttribute.setX(this.instanceIndex, absoluteFrame)\n this.flipAttribute.setXY(this.instanceIndex, this.state.flipX ? 1.0 : 0.0, this.state.flipY ? 1.0 : 0.0)\n }\n\n activate(worldTransform: THREE.Matrix4): void {\n this._isActive = true\n this.isPlaying = true // Start playing when activated\n this.currentLocalFrame = this.state.initialFrame // Reset to initial frame\n this.timeAccumulator = 0\n this.updateVisuals(worldTransform) // Apply transform and set frame\n // Ensure frame attribute is updated upon activation\n const absoluteFrame = this.state.animFrameOffset + this.currentLocalFrame\n this.frameAttribute.setX(this.instanceIndex, absoluteFrame)\n this.frameAttribute.needsUpdate = true // Mark manager for update\n this.flipAttribute.setXY(this.instanceIndex, this.state.flipX ? 1.0 : 0.0, this.state.flipY ? 1.0 : 0.0)\n this.flipAttribute.needsUpdate = true\n }\n\n deactivate(): void {\n this._isActive = false\n this.isPlaying = false\n this.instanceManager.mesh.setMatrixAt(this.instanceIndex, HIDDEN_MATRIX)\n }\n\n updateVisuals(worldTransform: THREE.Matrix4): void {\n if (!this._isActive) return\n this.instanceManager.mesh.setMatrixAt(this.instanceIndex, worldTransform)\n }\n\n updateTime(deltaTimeMs: number): boolean {\n // Returns true if frame attribute was updated\n if (!this.isPlaying || !this._isActive) return false\n\n this.timeAccumulator += deltaTimeMs\n let needsFrameAttributeUpdate = false\n\n if (this.timeAccumulator >= this.state.frameDuration) {\n const framesToAdvance = Math.floor(this.timeAccumulator / this.state.frameDuration)\n this.timeAccumulator %= this.state.frameDuration\n\n const oldLocalFrame = this.currentLocalFrame\n let nextLocalFrame = this.currentLocalFrame + framesToAdvance\n\n if (nextLocalFrame >= this.state.animNumFrames) {\n if (this.state.loop) {\n this.currentLocalFrame = nextLocalFrame % this.state.animNumFrames\n } else {\n this.currentLocalFrame = this.state.animNumFrames - 1\n this.isPlaying = false\n }\n } else {\n this.currentLocalFrame = nextLocalFrame\n }\n\n if (this.currentLocalFrame !== oldLocalFrame || !this.isPlaying) {\n const absoluteFrame = this.state.animFrameOffset + this.currentLocalFrame\n this.frameAttribute.setX(this.instanceIndex, absoluteFrame)\n this.frameAttribute.needsUpdate = true\n needsFrameAttributeUpdate = true\n }\n }\n return needsFrameAttributeUpdate\n }\n\n play(): void {\n if (!this._isActive) return\n this.isPlaying = true\n }\n\n stop(): void {\n this.isPlaying = false\n }\n\n goToFrame(localFrame: number): void {\n if (!this._isActive) return\n const targetLocalFrame = Math.max(0, Math.min(localFrame, this.state.animNumFrames - 1))\n if (this.currentLocalFrame !== targetLocalFrame) {\n this.currentLocalFrame = targetLocalFrame\n this.timeAccumulator = 0\n const absoluteFrame = this.state.animFrameOffset + this.currentLocalFrame\n this.frameAttribute.setX(this.instanceIndex, absoluteFrame)\n this.frameAttribute.needsUpdate = true // Mark manager for update\n }\n }\n\n setFrameDuration(newFrameDuration: number): void {\n if (newFrameDuration > 0) {\n this.state = { ...this.state, frameDuration: newFrameDuration }\n }\n }\n\n getResource(): SpriteResource {\n return this.resource\n }\n\n releaseInstanceSlot(): void {\n this.instanceManager.releaseInstanceSlot(this.instanceIndex)\n }\n}\n\nexport class TiledSprite {\n public readonly id: string\n private animator: SpriteAnimator\n private _animations: Map<string, Animation>\n private _currentAnimation: Animation\n private _transformObject: THREE.Object3D\n\n private _reusableMatrix: THREE.Matrix4\n private _reusableAnimGeomScale: THREE.Vector3\n private _isVisibleState: boolean = true\n private originalDefinition: SpriteDefinition\n\n constructor(\n id: string,\n userSpriteDefinition: SpriteDefinition,\n animator: SpriteAnimator,\n animationInstanceParams: Array<{\n name: string\n state: ResolvedAnimationState\n resource: SpriteResource\n index: number\n instanceManager: InstanceManager\n frameAttribute: THREE.InstancedBufferAttribute\n flipAttribute: THREE.InstancedBufferAttribute\n }>,\n ) {\n this.id = id\n this.originalDefinition = userSpriteDefinition\n this.animator = animator\n this._transformObject = new THREE.Object3D()\n this._reusableMatrix = new THREE.Matrix4()\n this._reusableAnimGeomScale = new THREE.Vector3()\n\n const initialScale = userSpriteDefinition.scale ?? DEFAULT_SCALE\n this._transformObject.scale.set(initialScale, initialScale, initialScale)\n\n this._animations = new Map()\n for (const params of animationInstanceParams) {\n const anim = new Animation(\n params.name,\n params.state,\n params.resource,\n params.index,\n params.instanceManager,\n params.frameAttribute,\n params.flipAttribute,\n )\n this._animations.set(params.name, anim)\n }\n\n const initialAnim = this._animations.get(userSpriteDefinition.initialAnimation)\n if (!initialAnim) {\n throw new Error(\n `[TiledSprite] Initial animation \"${userSpriteDefinition.initialAnimation}\" not found for sprite \"${this.id}\".`,\n )\n }\n this._currentAnimation = initialAnim\n const initialWorldMatrix = this._calculateAnimationWorldMatrix(this._currentAnimation.state)\n this._currentAnimation.activate(initialWorldMatrix)\n this._isVisibleState = true\n }\n\n private _calculateAnimationWorldMatrix(animState: ResolvedAnimationState): THREE.Matrix4 {\n const matrix = this._reusableMatrix\n const animGeomScale = this._reusableAnimGeomScale\n const worldHeight = this._transformObject.scale.y\n const frameAspectRatio = animState.sheetTilesetWidth / animState.sheetNumFrames / animState.sheetTilesetHeight\n const worldWidth = worldHeight * frameAspectRatio\n animGeomScale.set(worldWidth, worldHeight, this._transformObject.scale.z)\n matrix.compose(this._transformObject.position, this._transformObject.quaternion, animGeomScale)\n return matrix\n }\n\n public get currentAnimation(): Animation {\n return this._currentAnimation\n }\n\n private updateCurrentAnimationVisuals(): void {\n if (this._isVisibleState) {\n const currentAnim = this.currentAnimation\n if (currentAnim) {\n const finalMatrix = this._calculateAnimationWorldMatrix(currentAnim.state)\n currentAnim.updateVisuals(finalMatrix)\n }\n }\n }\n\n setPosition(position: THREE.Vector3): void {\n this._transformObject.position.copy(position)\n this.updateCurrentAnimationVisuals()\n }\n\n setRotation(rotation: THREE.Quaternion): void {\n this._transformObject.quaternion.copy(rotation)\n this.updateCurrentAnimationVisuals()\n }\n\n setScale(scale: THREE.Vector3): void {\n this._transformObject.scale.copy(scale)\n this.updateCurrentAnimationVisuals()\n }\n\n getScale(): THREE.Vector3 {\n return this._transformObject.scale.clone()\n }\n\n setTransform(position: THREE.Vector3, rotation: THREE.Quaternion, newScale: THREE.Vector3): void {\n this._transformObject.position.copy(position)\n this._transformObject.quaternion.copy(rotation)\n this._transformObject.scale.copy(newScale)\n this.updateCurrentAnimationVisuals()\n }\n\n play(): void {\n this.currentAnimation.play()\n }\n stop(): void {\n this.currentAnimation.stop()\n }\n goToFrame(frame: number): void {\n this.currentAnimation.goToFrame(frame)\n }\n setFrameDuration(newFrameDuration: number): void {\n this.currentAnimation.setFrameDuration(newFrameDuration)\n }\n\n isPlaying(): boolean {\n return this.currentAnimation.isPlaying\n }\n\n async setAnimation(animationName: string): Promise<void> {\n const newAnim = this._animations.get(animationName)\n if (!newAnim) {\n throw new Error(`[TiledSprite] Animation \"${animationName}\" not found for sprite \"${this.id}\".`)\n }\n\n const switchingToSameAnimation = this._currentAnimation.name === animationName\n const oldAnim = this._currentAnimation\n\n if (!switchingToSameAnimation || !this._isVisibleState) {\n oldAnim?.deactivate()\n }\n\n this._currentAnimation = newAnim\n\n if (this._isVisibleState) {\n const finalMatrix = this._calculateAnimationWorldMatrix(newAnim.state)\n newAnim.activate(finalMatrix)\n } else {\n newAnim.deactivate()\n }\n }\n\n update(deltaTime: number): void {\n if (this.visible) {\n this.currentAnimation.updateTime(deltaTime)\n }\n }\n\n destroy(): void {\n this._animations.forEach((anim) => {\n anim.deactivate()\n anim.releaseInstanceSlot()\n })\n this._animations.clear()\n this._isVisibleState = false\n }\n\n getCurrentAnimationName(): string {\n return this._currentAnimation.name\n }\n\n getWorldTransform(): THREE.Matrix4 {\n return this._calculateAnimationWorldMatrix(this._currentAnimation.state)\n }\n\n getWorldPlaneSize(): THREE.Vector2 {\n const animState = this._currentAnimation.state\n const worldHeight = this._transformObject.scale.y\n const frameActualWidthPx = animState.sheetTilesetWidth / animState.sheetNumFrames\n const frameAspectRatio = frameActualWidthPx / animState.sheetTilesetHeight\n const worldWidth = worldHeight * frameAspectRatio\n return new THREE.Vector2(worldWidth, worldHeight)\n }\n\n get visible(): boolean {\n return this._isVisibleState\n }\n\n set visible(value: boolean) {\n if (this._isVisibleState === value) {\n return\n }\n this._isVisibleState = value\n if (value) {\n const finalMatrix = this._calculateAnimationWorldMatrix(this._currentAnimation.state)\n this._currentAnimation.activate(finalMatrix)\n } else {\n this._currentAnimation.deactivate()\n }\n }\n\n public get definition(): SpriteDefinition {\n return this.originalDefinition\n }\n\n public get currentTransform(): {\n position: THREE.Vector3\n quaternion: THREE.Quaternion\n scale: THREE.Vector3\n } {\n return {\n position: this._transformObject.position.clone(),\n quaternion: this._transformObject.quaternion.clone(),\n scale: this._transformObject.scale.clone(),\n }\n }\n}\n\ninterface SpriteAnimatorInstanceManager {\n instanceManager: InstanceManager\n frameAttribute: THREE.InstancedBufferAttribute\n flipAttribute: THREE.InstancedBufferAttribute\n uvTileSize: THREE.Vector2\n}\n\nexport class SpriteAnimator {\n private instances: Map<string, TiledSprite> = new Map()\n private _idCounter = 0\n private instanceManagers: Map<string, SpriteAnimatorInstanceManager> = new Map()\n\n constructor(private scene: Scene) {}\n\n private createSpriteAnimationMaterial(\n resource: SpriteResource,\n frameAttribute: THREE.InstancedBufferAttribute,\n flipAttribute: THREE.InstancedBufferAttribute,\n materialFactory: () => NodeMaterial,\n ): NodeMaterial {\n const texture = resource.texture\n const sheetProps = resource.sheetProperties\n\n const uvTileWidth = 1.0 / sheetProps.sheetNumFrames\n const uvTileHeight = 1.0\n const uvTileSize = new THREE.Vector2(uvTileWidth, uvTileHeight)\n\n const tileSizeUniform = uniform(uvTileSize)\n const epsilon = float(0.000001)\n\n const baseUV = uv()\n const oneFloat = float(1.0)\n\n const a_frameIndex = bufferAttribute(frameAttribute)\n const a_flip = bufferAttribute(flipAttribute)\n\n const calculatedTileCoordX = a_frameIndex.mul(tileSizeUniform.x)\n const calculatedTileCoord = vec2(calculatedTileCoordX, float(0))\n\n const flippedX = mix(baseUV.x, oneFloat.sub(baseUV.x), a_flip.x)\n const flippedY = mix(baseUV.y, oneFloat.sub(baseUV.y), a_flip.y)\n const finalLocalUV = vec2(flippedX, flippedY)\n\n const mapNode = tslTexture(texture)\n const finalUV = finalLocalUV.mul(tileSizeUniform).min(tileSizeUniform.sub(epsilon)).add(calculatedTileCoord)\n const sampledColor = mapNode.sample(finalUV)\n\n const material = materialFactory()\n material.colorNode = sampledColor\n\n return material\n }\n\n private getOrCreateInstanceManager(\n resource: SpriteResource,\n maxInstances: number,\n renderOrder: number,\n depthWrite: boolean,\n materialFactory: () => NodeMaterial,\n ): SpriteAnimatorInstanceManager {\n const key = `${resource.sheetProperties.imagePath}_${maxInstances}_${renderOrder}_${depthWrite}`\n let manager = this.instanceManagers.get(key)\n\n if (!manager) {\n const geometry = new THREE.PlaneGeometry(1, 1)\n const frameArray = new Float32Array(maxInstances)\n const frameAttribute = new THREE.InstancedBufferAttribute(frameArray, 1)\n frameAttribute.setUsage(THREE.DynamicDrawUsage)\n\n const flipArray = new Float32Array(maxInstances * 2)\n const flipAttribute = new THREE.InstancedBufferAttribute(flipArray, 2)\n flipAttribute.setUsage(THREE.DynamicDrawUsage)\n\n const material = this.createSpriteAnimationMaterial(resource, frameAttribute, flipAttribute, materialFactory)\n\n geometry.setAttribute(\"a_frameIndexInstanced\", frameAttribute)\n geometry.setAttribute(\"a_flipInstanced\", flipAttribute)\n\n for (let i = 0; i < maxInstances; i++) {\n flipAttribute.setXY(i, 0.0, 0.0)\n }\n flipAttribute.needsUpdate = true\n\n const instanceManager = resource.createInstanceManager(geometry, material, {\n maxInstances,\n renderOrder,\n depthWrite,\n name: `SpriteAnimator_${key}`,\n })\n\n const uvTileWidth = 1.0 / resource.sheetProperties.sheetNumFrames\n const uvTileSize = new THREE.Vector2(uvTileWidth, 1.0)\n\n manager = {\n instanceManager,\n frameAttribute,\n flipAttribute,\n uvTileSize,\n }\n\n this.instanceManagers.set(key, manager)\n }\n\n return manager\n }\n\n async createSprite(\n userSpriteDefinition: SpriteDefinition,\n materialFactory?: () => NodeMaterial,\n ): Promise<TiledSprite> {\n const id = userSpriteDefinition.id ?? `sprite_${this._idCounter++}`\n const animationInstanceParams: Array<{\n name: string\n state: ResolvedAnimationState\n resource: SpriteResource\n index: number\n instanceManager: InstanceManager\n frameAttribute: THREE.InstancedBufferAttribute\n flipAttribute: THREE.InstancedBufferAttribute\n }> = []\n\n const resolvedMaterialFactory =\n materialFactory ??\n (() =>\n new MeshBasicNodeMaterial({\n transparent: true,\n alphaTest: 0.1,\n depthWrite: true,\n }))\n\n // Track instance managers as we encounter resources\n const resourceManagers = new Map<SpriteResource, SpriteAnimatorInstanceManager>()\n\n for (const animName in userSpriteDefinition.animations) {\n const animDef = userSpriteDefinition.animations[animName]\n const resource = animDef.resource\n\n // Get or create instance manager for this resource\n let managerInfo = resourceManagers.get(resource)\n if (!managerInfo) {\n const maxInstances = userSpriteDefinition.maxInstances ?? 1024\n const renderOrder = userSpriteDefinition.renderOrder ?? 0\n const depthWrite = userSpriteDefinition.depthWrite ?? true\n managerInfo = this.getOrCreateInstanceManager(\n resource,\n maxInstances,\n renderOrder,\n depthWrite,\n resolvedMaterialFactory,\n )\n resourceManagers.set(resource, managerInfo)\n }\n\n const instanceIndex = managerInfo.instanceManager.acquireInstanceSlot()\n\n const resolvedState: ResolvedAnimationState = {\n imagePath: resource.sheetProperties.imagePath,\n sheetTilesetWidth: resource.sheetProperties.sheetTilesetWidth,\n sheetTilesetHeight: resource.sheetProperties.sheetTilesetHeight,\n sheetNumFrames: resource.sheetProperties.sheetNumFrames,\n animNumFrames: animDef.animNumFrames ?? resource.sheetProperties.sheetNumFrames,\n animFrameOffset: animDef.animFrameOffset ?? 0,\n frameDuration: animDef.frameDuration ?? DEFAULT_FRAME_DURATION,\n loop: animDef.loop ?? true,\n initialFrame: animDef.initialFrame ?? DEFAULT_INITIAL_FRAME,\n flipX: animDef.flipX ?? DEFAULT_FLIP_X,\n flipY: animDef.flipY ?? DEFAULT_FLIP_Y,\n texture: resource.texture,\n }\n\n animationInstanceParams.push({\n name: animName,\n state: resolvedState,\n resource,\n index: instanceIndex,\n instanceManager: managerInfo.instanceManager,\n frameAttribute: managerInfo.frameAttribute,\n flipAttribute: managerInfo.flipAttribute,\n })\n }\n\n if (\n !userSpriteDefinition.initialAnimation ||\n !userSpriteDefinition.animations[userSpriteDefinition.initialAnimation]\n ) {\n let found = false\n for (const p of animationInstanceParams) if (p.name === userSpriteDefinition.initialAnimation) found = true\n if (!found) {\n for (const params of animationInstanceParams) {\n params.instanceManager.releaseInstanceSlot(params.index)\n }\n throw new Error(\n `[SpriteAnimator] initialAnimation \"${userSpriteDefinition.initialAnimation}\" not found or invalid for sprite \"${id}\".`,\n )\n }\n }\n const tiledSprite = new TiledSprite(id, userSpriteDefinition, this, animationInstanceParams)\n this.instances.set(id, tiledSprite)\n return tiledSprite\n }\n\n update(deltaTime: number): void {\n for (const sprite of this.instances.values()) {\n sprite.update(deltaTime)\n }\n }\n\n removeSprite(id: string): void {\n const sprite = this.instances.get(id)\n if (sprite) {\n sprite.destroy()\n this.instances.delete(id)\n }\n }\n\n removeAllSprites(): void {\n const ids = Array.from(this.instances.keys())\n for (const id of ids) {\n this.removeSprite(id)\n }\n }\n}\n",
11
+ "import * as THREE from \"three\"\nimport {\n uniform,\n attribute,\n texture as tslTexture,\n uv,\n float,\n vec2,\n vec3,\n vec4,\n step,\n max,\n sin,\n cos,\n positionLocal,\n mat3,\n} from \"three/tsl\"\nimport { MeshBasicNodeMaterial, NodeMaterial } from \"three/webgpu\"\nimport type { TiledSprite, SpriteDefinition, SpriteAnimator } from \"./SpriteAnimator\"\nimport type { SpriteResource } from \"../SpriteResourceManager\"\n\nexport interface ExplosionEffectParameters {\n numRows: number\n numCols: number\n durationMs: number\n strength: number\n strengthVariation: number\n gravity: number\n gravityScale: number\n fadeOut: boolean\n angularVelocityMin: THREE.Vector3\n angularVelocityMax: THREE.Vector3\n initialVelocityYBoost: number\n zVariationStrength: number\n materialFactory: () => NodeMaterial\n}\n\nexport const DEFAULT_EXPLOSION_PARAMETERS: ExplosionEffectParameters = {\n numRows: 5,\n numCols: 5,\n durationMs: 2000,\n strength: 5,\n strengthVariation: 0.5,\n gravity: 9.8,\n gravityScale: 0.15,\n fadeOut: true,\n angularVelocityMin: new THREE.Vector3(-Math.PI, -Math.PI, -Math.PI),\n angularVelocityMax: new THREE.Vector3(Math.PI, Math.PI, Math.PI),\n initialVelocityYBoost: 1.0,\n zVariationStrength: 0.3,\n materialFactory: () =>\n new MeshBasicNodeMaterial({\n transparent: true,\n alphaTest: 0.01,\n side: THREE.DoubleSide,\n depthWrite: true,\n }),\n}\n\nexport interface ExplosionCreationData {\n resource: SpriteResource\n frameUvOffset: THREE.Vector2\n frameUvSize: THREE.Vector2\n spriteWorldTransform: THREE.Matrix4\n}\n\nexport interface SpriteRecreationData {\n definition: SpriteDefinition\n currentTransform: {\n position: THREE.Vector3\n quaternion: THREE.Quaternion\n scale: THREE.Vector3\n }\n}\n\nexport interface ExplosionHandle {\n readonly effect: ExplodingSpriteEffect\n readonly recreationData: SpriteRecreationData\n hasBeenRestored: boolean\n restoreSprite: (spriteAnimator: SpriteAnimator) => Promise<TiledSprite | null>\n}\n\nexport class ExplodingSpriteEffect {\n private static baseMaterialCache: Map<string, NodeMaterial> = new Map()\n private scene: THREE.Scene\n private resource: SpriteResource\n private frameUvOffset: THREE.Vector2\n private frameUvSize: THREE.Vector2\n private spriteWorldTransform: THREE.Matrix4\n private params: ExplosionEffectParameters\n\n private instancedMesh!: THREE.InstancedMesh\n private material!: NodeMaterial\n private numParticles: number\n\n private uniformRefs!: { time: any; duration: any; gravity: any }\n\n public isActive: boolean = true\n private timeElapsedMs: number = 0\n\n constructor(\n scene: THREE.Scene,\n resource: SpriteResource,\n frameUvOffset: THREE.Vector2,\n frameUvSize: THREE.Vector2,\n spriteWorldTransform: THREE.Matrix4,\n userParams?: Partial<ExplosionEffectParameters>,\n ) {\n this.scene = scene\n this.resource = resource\n this.frameUvOffset = frameUvOffset\n this.frameUvSize = frameUvSize\n this.spriteWorldTransform = spriteWorldTransform\n this.params = { ...DEFAULT_EXPLOSION_PARAMETERS, ...userParams }\n\n this.numParticles = this.params.numRows * this.params.numCols\n const materialFactory = userParams?.materialFactory ?? DEFAULT_EXPLOSION_PARAMETERS.materialFactory\n\n this._createGPUParticles(materialFactory)\n }\n\n private _createGPUParticles(materialFactory: () => NodeMaterial): void {\n if (this.numParticles === 0) return\n\n const particleUnitWidth = 1.0 / this.params.numCols\n const particleUnitHeight = 1.0 / this.params.numRows\n\n const poolKey = `${this.params.numRows}x${this.params.numCols}`\n\n this._createGPUMaterial(materialFactory)\n\n this.instancedMesh = this.resource.meshPool.acquireMesh(poolKey, {\n geometry: () => {\n const geometry = new THREE.PlaneGeometry(particleUnitWidth, particleUnitHeight)\n geometry.setAttribute(\n \"a_particleData\",\n new THREE.InstancedBufferAttribute(new Float32Array(this.numParticles * 4), 4),\n )\n geometry.setAttribute(\n \"a_velocity\",\n new THREE.InstancedBufferAttribute(new Float32Array(this.numParticles * 4), 4),\n )\n geometry.setAttribute(\n \"a_angularVel\",\n new THREE.InstancedBufferAttribute(new Float32Array(this.numParticles * 4), 4),\n )\n geometry.setAttribute(\n \"a_uvOffset\",\n new THREE.InstancedBufferAttribute(new Float32Array(this.numParticles * 4), 4),\n )\n return geometry\n },\n material: this.material,\n maxInstances: this.numParticles,\n name: `ExplodingSprite_${poolKey}`,\n })\n\n const particleData: Float32Array = this.instancedMesh.geometry.getAttribute(\"a_particleData\").array as Float32Array\n const velocityData: Float32Array = this.instancedMesh.geometry.getAttribute(\"a_velocity\").array as Float32Array\n const angularVelData: Float32Array = this.instancedMesh.geometry.getAttribute(\"a_angularVel\").array as Float32Array\n const uvOffsetData: Float32Array = this.instancedMesh.geometry.getAttribute(\"a_uvOffset\").array as Float32Array\n\n const spriteWorldCenter = new THREE.Vector3().setFromMatrixPosition(this.spriteWorldTransform)\n\n let particleIndex = 0\n for (let r = 0; r < this.params.numRows; r++) {\n for (let c = 0; c < this.params.numCols; c++) {\n const localParticlePosX = (c + 0.5) * particleUnitWidth - 0.5\n const localParticlePosY = (r + 0.5) * particleUnitHeight - 0.5\n\n const initialLocalPosition = new THREE.Vector3(localParticlePosX, localParticlePosY, 0)\n const worldPosition = initialLocalPosition.clone().applyMatrix4(this.spriteWorldTransform)\n\n let velocityDir = worldPosition.clone().sub(spriteWorldCenter)\n if (velocityDir.lengthSq() < 0.0001) {\n velocityDir.set(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5)\n }\n velocityDir.normalize()\n\n const strengthVariationRange = this.params.strengthVariation\n const minStrengthFactor = 1.0 - strengthVariationRange * 0.5\n const maxStrengthFactor = 1.0 + strengthVariationRange * 0.5\n const strengthFactor = minStrengthFactor + Math.random() * (maxStrengthFactor - minStrengthFactor)\n const strength = this.params.strength * strengthFactor * 0.1\n const velocity = velocityDir.multiplyScalar(strength)\n\n if (\n Math.abs(this.spriteWorldTransform.elements[10]) < 0.1 &&\n Math.abs(this.spriteWorldTransform.elements[11]) < 0.1\n ) {\n velocity.z += (Math.random() - 0.5) * strength * this.params.zVariationStrength\n }\n\n velocity.y += this.params.strength * this.params.initialVelocityYBoost * Math.random()\n\n const angularVelocity = new THREE.Vector3(\n THREE.MathUtils.randFloat(this.params.angularVelocityMin.x, this.params.angularVelocityMax.x),\n THREE.MathUtils.randFloat(this.params.angularVelocityMin.y, this.params.angularVelocityMax.y),\n THREE.MathUtils.randFloat(this.params.angularVelocityMin.z, this.params.angularVelocityMax.z),\n )\n\n const lifeVariation = 0.8 + Math.random() * 0.4\n const randomSeed = Math.random()\n\n const u0 = this.frameUvOffset.x + (c / this.params.numCols) * this.frameUvSize.x\n const v0 = this.frameUvOffset.y + (r / this.params.numRows) * this.frameUvSize.y\n const uSize = this.frameUvSize.x / this.params.numCols\n const vSize = this.frameUvSize.y / this.params.numRows\n\n const baseIndex = particleIndex * 4\n\n particleData[baseIndex] = localParticlePosX\n particleData[baseIndex + 1] = localParticlePosY\n particleData[baseIndex + 2] = randomSeed\n particleData[baseIndex + 3] = lifeVariation\n\n velocityData[baseIndex] = velocity.x\n velocityData[baseIndex + 1] = velocity.y\n velocityData[baseIndex + 2] = velocity.z\n velocityData[baseIndex + 3] = 0.0\n\n angularVelData[baseIndex] = angularVelocity.x\n angularVelData[baseIndex + 1] = angularVelocity.y\n angularVelData[baseIndex + 2] = angularVelocity.z\n angularVelData[baseIndex + 3] = 0.0\n\n uvOffsetData[baseIndex] = u0\n uvOffsetData[baseIndex + 1] = v0\n uvOffsetData[baseIndex + 2] = uSize\n uvOffsetData[baseIndex + 3] = vSize\n\n particleIndex++\n }\n }\n\n this.instancedMesh.onBeforeRender = () => {\n this.uniformRefs.time.value = this.timeElapsedMs / 1000\n }\n\n this.timeElapsedMs = 0\n\n this.instancedMesh.geometry.getAttribute(\"a_particleData\").needsUpdate = true\n this.instancedMesh.geometry.getAttribute(\"a_velocity\").needsUpdate = true\n this.instancedMesh.geometry.getAttribute(\"a_angularVel\").needsUpdate = true\n this.instancedMesh.geometry.getAttribute(\"a_uvOffset\").needsUpdate = true\n\n this.instancedMesh.frustumCulled = false\n\n for (let i = 0; i < this.numParticles; i++) {\n this.instancedMesh.setMatrixAt(i, this.spriteWorldTransform)\n }\n this.instancedMesh.instanceMatrix.needsUpdate = true\n\n this.scene.add(this.instancedMesh)\n }\n\n private _createGPUMaterial(materialFactory: () => NodeMaterial): void {\n const key = `${this.resource.texture.uuid}_${this.params.numRows}x${this.params.numCols}_${this.params.fadeOut ? 1 : 0}`\n\n let template = ExplodingSpriteEffect.baseMaterialCache.get(key)\n if (!template) {\n template = ExplodingSpriteEffect._buildTemplateMaterial(this.resource.texture, this.params, materialFactory)\n ExplodingSpriteEffect.baseMaterialCache.set(key, template)\n }\n\n this.material = template\n this.uniformRefs = template.userData.uniformRefs as { time: any; duration: any; gravity: any }\n }\n\n public static _buildTemplateMaterial(\n texture: THREE.DataTexture,\n params: ExplosionEffectParameters,\n materialFactory: () => NodeMaterial,\n ): NodeMaterial {\n const timeUniformNode = uniform(0)\n ;(timeUniformNode as any).name = \"timeUniform\"\n const durationUniformNode = uniform(params.durationMs / 1000)\n ;(durationUniformNode as any).name = \"durationUniform\"\n const gravityUniformNode = uniform(params.gravity * params.gravityScale)\n ;(gravityUniformNode as any).name = \"gravityUniform\"\n\n const a_particleData = attribute(\"a_particleData\", \"vec4\")\n const a_velocity = attribute(\"a_velocity\", \"vec4\")\n const a_angularVel = attribute(\"a_angularVel\", \"vec4\")\n const a_uvOffset = attribute(\"a_uvOffset\", \"vec4\")\n\n const localPos = vec2(a_particleData.x, a_particleData.y)\n const lifeVariation = a_particleData.w\n\n const initialVelocity = vec3(a_velocity.x, a_velocity.y, a_velocity.z)\n const angularVelocity = vec3(a_angularVel.x, a_angularVel.y, a_angularVel.z)\n\n const uvOffset = vec2(a_uvOffset.x, a_uvOffset.y)\n const uvSize = vec2(a_uvOffset.z, a_uvOffset.w)\n\n const particleLifetime = durationUniformNode.mul(lifeVariation)\n const normalizedTime = timeUniformNode.div(particleLifetime)\n const isAlive = step(normalizedTime, float(1.0))\n\n const deltaTime = timeUniformNode\n const gravity = vec3(float(0), gravityUniformNode.negate(), float(0))\n\n const velocityContribution = initialVelocity.mul(deltaTime)\n const gravityContribution = gravity.mul(deltaTime).mul(deltaTime).mul(float(0.5))\n const positionOffset = velocityContribution.add(gravityContribution)\n\n const rotationAmount = angularVelocity.mul(deltaTime)\n const cosX = cos(rotationAmount.x)\n const sinX = sin(rotationAmount.x)\n const cosY = cos(rotationAmount.y)\n const sinY = sin(rotationAmount.y)\n const cosZ = cos(rotationAmount.z)\n const sinZ = sin(rotationAmount.z)\n\n const rotationMatrix = mat3(\n cosY.mul(cosZ),\n cosY.mul(sinZ).negate(),\n sinY,\n sinX.mul(sinY).mul(cosZ).add(cosX.mul(sinZ)),\n sinX.mul(sinY).mul(sinZ).negate().add(cosX.mul(cosZ)),\n sinX.mul(cosY).negate(),\n cosX.mul(sinY).mul(cosZ).negate().add(sinX.mul(sinZ)),\n cosX.mul(sinY).mul(sinZ).add(sinX.mul(cosZ)),\n cosX.mul(cosY),\n )\n\n const rotatedVertexPosition = rotationMatrix.mul(positionLocal)\n const finalOffset = vec3(localPos.x, localPos.y, float(0)).add(positionOffset)\n\n let opacity = float(1.0)\n if (params.fadeOut) {\n const fadeStart = float(0.7)\n const fadeProgress = max(float(0), normalizedTime.sub(fadeStart).div(float(1.0).sub(fadeStart)))\n opacity = float(1.0).sub(fadeProgress)\n }\n opacity = opacity.mul(isAlive)\n\n const baseUV = uv()\n const finalUV = baseUV.mul(uvSize).add(uvOffset)\n\n const mapNode = tslTexture(texture)\n const sampledColor = mapNode.sample(finalUV)\n\n const material = materialFactory()\n\n const finalColor = vec4(sampledColor.rgb, sampledColor.a.mul(opacity))\n material.colorNode = finalColor\n material.positionNode = rotatedVertexPosition.add(finalOffset)\n\n material.userData.uniformRefs = {\n time: timeUniformNode,\n duration: durationUniformNode,\n gravity: gravityUniformNode,\n }\n\n return material\n }\n\n update(deltaTimeMs: number): void {\n if (!this.isActive) return\n\n this.timeElapsedMs += deltaTimeMs\n\n if (this.timeElapsedMs >= this.params.durationMs) {\n this.dispose()\n }\n }\n\n dispose(): void {\n if (!this.isActive) return\n this.isActive = false\n\n if (this.instancedMesh) {\n this.scene.remove(this.instancedMesh)\n\n const poolKey = `${this.params.numRows}x${this.params.numCols}`\n\n this.resource.meshPool.releaseMesh(poolKey, this.instancedMesh)\n }\n }\n}\n\nexport class ExplosionManager {\n private scene: THREE.Scene\n private activeExplosions: ExplodingSpriteEffect[] = []\n\n constructor(scene: THREE.Scene) {\n this.scene = scene\n }\n\n public fillPool(resource: SpriteResource, count: number, params: Partial<ExplosionEffectParameters> = {}): void {\n const effectParams = { ...DEFAULT_EXPLOSION_PARAMETERS, ...params }\n const poolKey = `${effectParams.numRows}x${effectParams.numCols}`\n const particleUnitWidth = 1.0 / effectParams.numCols\n const particleUnitHeight = 1.0 / effectParams.numRows\n const numParticles = effectParams.numRows * effectParams.numCols\n const materialFactory = params.materialFactory ?? DEFAULT_EXPLOSION_PARAMETERS.materialFactory\n\n const material = ExplodingSpriteEffect._buildTemplateMaterial(resource.texture, effectParams, materialFactory)\n\n resource.meshPool.fill(\n poolKey,\n {\n geometry: () => {\n const geometry = new THREE.PlaneGeometry(particleUnitWidth, particleUnitHeight)\n const particleData = new Float32Array(numParticles * 4)\n const velocityData = new Float32Array(numParticles * 4)\n const angularVelData = new Float32Array(numParticles * 4)\n const uvOffsetData = new Float32Array(numParticles * 4)\n const particleDataAttribute = new THREE.InstancedBufferAttribute(particleData, 4)\n const velocityAttribute = new THREE.InstancedBufferAttribute(velocityData, 4)\n const angularVelAttribute = new THREE.InstancedBufferAttribute(angularVelData, 4)\n const uvOffsetAttribute = new THREE.InstancedBufferAttribute(uvOffsetData, 4)\n\n geometry.setAttribute(\"a_particleData\", particleDataAttribute)\n geometry.setAttribute(\"a_velocity\", velocityAttribute)\n geometry.setAttribute(\"a_angularVel\", angularVelAttribute)\n geometry.setAttribute(\"a_uvOffset\", uvOffsetAttribute)\n\n particleDataAttribute.needsUpdate = true\n velocityAttribute.needsUpdate = true\n angularVelAttribute.needsUpdate = true\n uvOffsetAttribute.needsUpdate = true\n\n return geometry\n },\n material,\n maxInstances: numParticles,\n name: `ExplodingSprite_${poolKey}`,\n },\n count,\n )\n }\n\n private _createEffectCreationData(sprite: TiledSprite): ExplosionCreationData {\n const animState = sprite.currentAnimation.state\n const resource = sprite.currentAnimation.getResource()\n const currentAbsoluteFrame = animState.animFrameOffset + sprite.currentAnimation.currentLocalFrame\n const frameUOffset = currentAbsoluteFrame * resource.uvTileSize.x\n return {\n resource: resource,\n frameUvOffset: new THREE.Vector2(frameUOffset, 0),\n frameUvSize: resource.uvTileSize.clone(),\n spriteWorldTransform: sprite.getWorldTransform(),\n }\n }\n\n public createExplosionForSprite(\n spriteToExplode: TiledSprite,\n userParams?: Partial<ExplosionEffectParameters>,\n ): ExplosionHandle | null {\n const effectCreationData = this._createEffectCreationData(spriteToExplode)\n const definition = spriteToExplode.definition\n const transform = spriteToExplode.currentTransform\n\n let spriteRecreationData: SpriteRecreationData = {\n definition: definition,\n currentTransform: transform,\n }\n\n spriteToExplode.destroy()\n\n const effect = new ExplodingSpriteEffect(\n this.scene,\n effectCreationData.resource,\n effectCreationData.frameUvOffset,\n effectCreationData.frameUvSize,\n effectCreationData.spriteWorldTransform,\n userParams,\n )\n this.activeExplosions.push(effect)\n\n const handle: ExplosionHandle = {\n effect: effect,\n recreationData: spriteRecreationData,\n hasBeenRestored: false,\n restoreSprite: async (spriteAnimator: SpriteAnimator): Promise<TiledSprite | null> => {\n if (handle.hasBeenRestored) {\n return null\n }\n\n handle.effect.dispose()\n\n const newSprite = await spriteAnimator.createSprite(handle.recreationData.definition)\n const currentSpriteTransform = handle.recreationData.currentTransform\n newSprite.setTransform(\n currentSpriteTransform.position,\n currentSpriteTransform.quaternion,\n currentSpriteTransform.scale,\n )\n handle.hasBeenRestored = true\n\n return newSprite\n },\n }\n return handle\n }\n\n public update(deltaTimeMs: number): void {\n for (let i = this.activeExplosions.length - 1; i >= 0; i--) {\n const explosion = this.activeExplosions[i]\n explosion.update(deltaTimeMs)\n if (!explosion.isActive) {\n this.activeExplosions.splice(i, 1)\n }\n }\n }\n\n public disposeAll(): void {\n this.activeExplosions.forEach((exp) => exp.dispose())\n this.activeExplosions = []\n }\n}\n",
12
+ "import * as THREE from \"three\"\nimport {\n uniform,\n texture as tslTexture,\n uv,\n float,\n vec2,\n vec3,\n vec4,\n bufferAttribute,\n step,\n max,\n sin,\n cos,\n positionLocal,\n mat3,\n mix,\n floor,\n mod,\n} from \"three/tsl\"\nimport { MeshBasicNodeMaterial, NodeMaterial } from \"three/webgpu\"\nimport type { SpriteResource, InstanceManager } from \"../SpriteResourceManager\"\n\nexport interface ParticleEffectParameters {\n resource: SpriteResource\n animNumFrames?: number\n animFrameOffset?: number\n frameDuration?: number\n loop?: boolean\n scale?: number\n renderOrder?: number\n depthWrite?: boolean\n maxParticles: number\n lifetimeMsMin: number\n lifetimeMsMax: number\n origins: THREE.Vector3[]\n spawnRadius: number | THREE.Vector3\n initialVelocityMin: THREE.Vector3\n initialVelocityMax: THREE.Vector3\n angularVelocityMin: THREE.Vector3\n angularVelocityMax: THREE.Vector3\n gravity?: THREE.Vector3\n randomGravityFactorMinMax?: THREE.Vector2\n scaleOverLifeMinMax?: THREE.Vector2\n fadeOut?: boolean\n materialFactory?: () => NodeMaterial\n}\n\ninterface AutoSpawnConfig {\n resolvedParams: ParticleEffectParameters\n originalOverrides?: Partial<ParticleEffectParameters>\n ratePerSecond: number\n accumulator: number\n}\n\ninterface ParticleSlot {\n isActive: boolean\n spawnTime: number\n lifespan: number\n}\n\nexport class SpriteParticleGenerator {\n private scene: THREE.Scene\n private baseConfig: ParticleEffectParameters\n private autoSpawnConfig: AutoSpawnConfig | null = null\n private _currentOriginIndex: number = 0\n\n private instanceManager: InstanceManager | null = null\n private material: NodeMaterial | null = null\n private texture: THREE.DataTexture | null = null\n\n private particleDataAttribute: THREE.InstancedBufferAttribute | null = null // [originX, originY, originZ, spawnTime]\n private velocityAttribute: THREE.InstancedBufferAttribute | null = null // [velX, velY, velZ, gravityFactor]\n private angularVelAttribute: THREE.InstancedBufferAttribute | null = null // [angVelX, angVelY, angVelZ, lifespan]\n private scaleDataAttribute: THREE.InstancedBufferAttribute | null = null // [initialScale, scaleMin, scaleMax, randomSeed]\n\n private timeUniform: ReturnType<typeof uniform<number>>\n private gravityUniform: ReturnType<typeof uniform<THREE.Vector3>>\n private animationUniform: ReturnType<typeof uniform<THREE.Vector4>> // [frameDuration, animNumFrames, loop, animFrameOffset]\n private sheetNumFramesUniform: ReturnType<typeof uniform<number>>\n\n private particleSlots: ParticleSlot[] = []\n private currentTime: number = 0\n private maxParticles: number\n private isInitialized: boolean = false\n\n constructor(scene: THREE.Scene, initialBaseConfig: ParticleEffectParameters) {\n this.scene = scene\n this.baseConfig = { ...initialBaseConfig }\n this.maxParticles = this.baseConfig.maxParticles\n\n if (!this.baseConfig.resource) {\n throw new Error(\"[SpriteParticleGenerator] resource is mandatory in initialBaseConfig.\")\n }\n\n this.timeUniform = uniform(0)\n this.gravityUniform = uniform(this.baseConfig.gravity || new THREE.Vector3(0, -9.8, 0))\n this.animationUniform = uniform(new THREE.Vector4())\n this.sheetNumFramesUniform = uniform(1)\n }\n\n private async _ensureInitialized(): Promise<void> {\n if (this.isInitialized) return\n await this._initializeGPUParticleSystem()\n this.isInitialized = true\n }\n\n private async _initializeGPUParticleSystem(): Promise<void> {\n const resource = this.baseConfig.resource\n\n this.texture = resource.texture\n\n // Set up animation uniforms from particle config\n const frameDuration = (this.baseConfig.frameDuration ?? 100) / 1000 // Convert to seconds\n const animNumFrames = this.baseConfig.animNumFrames ?? resource.sheetProperties.sheetNumFrames\n const loop = (this.baseConfig.loop ?? true) ? 1.0 : 0.0 // Default to true\n const animFrameOffset = this.baseConfig.animFrameOffset ?? 0\n\n this.animationUniform.value.set(frameDuration, animNumFrames, loop, animFrameOffset)\n this.sheetNumFramesUniform.value = resource.sheetProperties.sheetNumFrames\n\n const particleData = new Float32Array(this.maxParticles * 4)\n const velocityData = new Float32Array(this.maxParticles * 4)\n const angularVelData = new Float32Array(this.maxParticles * 4)\n const scaleData = new Float32Array(this.maxParticles * 4)\n\n this.particleDataAttribute = new THREE.InstancedBufferAttribute(particleData, 4)\n this.velocityAttribute = new THREE.InstancedBufferAttribute(velocityData, 4)\n this.angularVelAttribute = new THREE.InstancedBufferAttribute(angularVelData, 4)\n this.scaleDataAttribute = new THREE.InstancedBufferAttribute(scaleData, 4)\n\n this.particleDataAttribute.setUsage(THREE.DynamicDrawUsage)\n this.velocityAttribute.setUsage(THREE.DynamicDrawUsage)\n this.angularVelAttribute.setUsage(THREE.DynamicDrawUsage)\n this.scaleDataAttribute.setUsage(THREE.DynamicDrawUsage)\n\n for (let i = 0; i < this.maxParticles; i++) {\n this.particleSlots.push({ isActive: false, spawnTime: 0, lifespan: 0 })\n\n particleData[i * 4 + 3] = -1 // Mark as inactive with negative spawn time\n }\n\n const frameAspectRatio =\n this.texture.image.width / resource.sheetProperties.sheetNumFrames / this.texture.image.height\n const scale = this.baseConfig.scale ?? 1.0\n const geometry = new THREE.PlaneGeometry(scale * frameAspectRatio, scale)\n\n geometry.setAttribute(\"a_particleData\", this.particleDataAttribute)\n geometry.setAttribute(\"a_velocity\", this.velocityAttribute)\n geometry.setAttribute(\"a_angularVel\", this.angularVelAttribute)\n geometry.setAttribute(\"a_scaleData\", this.scaleDataAttribute)\n\n const materialFactory =\n this.baseConfig.materialFactory ??\n (() =>\n new MeshBasicNodeMaterial({\n transparent: true,\n alphaTest: 0.01,\n side: THREE.DoubleSide,\n depthWrite: this.baseConfig.depthWrite ?? false,\n }))\n const material = this._createGPUMaterial(materialFactory)\n this.instanceManager = resource.createInstanceManager(geometry, material, {\n maxInstances: this.maxParticles,\n renderOrder: this.baseConfig.renderOrder ?? 0,\n depthWrite: this.baseConfig.depthWrite ?? true,\n name: `SpriteParticleGenerator_${resource.sheetProperties.imagePath.replace(/[^a-zA-Z0-9_]/g, \"_\")}`,\n matrix: new THREE.Matrix4(),\n })\n }\n\n private _createGPUMaterial(materialFactory: () => NodeMaterial): NodeMaterial {\n const a_particleData = bufferAttribute(this.particleDataAttribute!)\n const a_velocity = bufferAttribute(this.velocityAttribute!)\n const a_angularVel = bufferAttribute(this.angularVelAttribute!)\n const a_scaleData = bufferAttribute(this.scaleDataAttribute!)\n\n const origin = vec3(a_particleData.x, a_particleData.y, a_particleData.z)\n const spawnTime = a_particleData.w\n\n const initialVelocity = vec3(a_velocity.x, a_velocity.y, a_velocity.z)\n const gravityFactor = a_velocity.w\n\n const angularVelocity = vec3(a_angularVel.x, a_angularVel.y, a_angularVel.z)\n const lifespan = a_angularVel.w\n\n const initialScale = a_scaleData.x\n const scaleMin = a_scaleData.y\n const scaleMax = a_scaleData.z\n const randomSeed = a_scaleData.w\n\n const age = this.timeUniform.sub(spawnTime)\n const normalizedAge = age.div(lifespan)\n const isAlive = step(float(0), spawnTime).mul(step(normalizedAge, float(1.0)))\n\n const gravity = this.gravityUniform.mul(gravityFactor)\n const velocityContribution = initialVelocity.mul(age)\n const gravityContribution = gravity.mul(age).mul(age).mul(float(0.5))\n const currentPosition = origin.add(velocityContribution).add(gravityContribution)\n\n const rotationAmount = angularVelocity.mul(age)\n const cosX = cos(rotationAmount.x)\n const sinX = sin(rotationAmount.x)\n const cosY = cos(rotationAmount.y)\n const sinY = sin(rotationAmount.y)\n const cosZ = cos(rotationAmount.z)\n const sinZ = sin(rotationAmount.z)\n\n const rotationMatrix = mat3(\n cosY.mul(cosZ),\n cosY.mul(sinZ).negate(),\n sinY,\n sinX.mul(sinY).mul(cosZ).add(cosX.mul(sinZ)),\n sinX.mul(sinY).mul(sinZ).negate().add(cosX.mul(cosZ)),\n sinX.mul(cosY).negate(),\n cosX.mul(sinY).mul(cosZ).negate().add(sinX.mul(sinZ)),\n cosX.mul(sinY).mul(sinZ).add(sinX.mul(cosZ)),\n cosX.mul(cosY),\n )\n\n const rotatedVertexPosition = rotationMatrix.mul(positionLocal)\n\n let currentScale = initialScale\n if (this.baseConfig.scaleOverLifeMinMax) {\n const scaleMultiplier = mix(scaleMin, scaleMax, normalizedAge)\n currentScale = initialScale.mul(scaleMultiplier)\n }\n\n const scaledPosition = rotatedVertexPosition.mul(currentScale)\n const finalPosition = scaledPosition.add(currentPosition)\n\n let opacity = float(1.0)\n if (this.baseConfig.fadeOut) {\n const fadeStart = float(0.7)\n const fadeProgress = max(float(0), normalizedAge.sub(fadeStart).div(float(1.0).sub(fadeStart)))\n opacity = float(1.0).sub(fadeProgress)\n }\n opacity = opacity.mul(isAlive)\n\n // Dynamic frame calculation based on particle age\n const frameDuration = this.animationUniform.x\n const animNumFrames = this.animationUniform.y\n const loopFlag = this.animationUniform.z\n const animFrameOffset = this.animationUniform.w\n\n const frameFloat = age.div(frameDuration)\n const rawFrameIndex = floor(frameFloat)\n\n // Handle looping vs clamping\n const maxFrame = animNumFrames.sub(float(1))\n const clampedFrame = max(float(0), rawFrameIndex).min(maxFrame)\n const loopedFrame = rawFrameIndex.mod(animNumFrames)\n const finalLocalFrame = mix(clampedFrame, loopedFrame, loopFlag)\n\n const frameIndex = animFrameOffset.add(finalLocalFrame)\n\n const uvTileWidth = float(1.0).div(this.sheetNumFramesUniform)\n const uvOffset = vec2(frameIndex.mul(uvTileWidth), float(0))\n const uvSize = vec2(uvTileWidth, float(1.0))\n\n const baseUV = uv()\n const finalUV = baseUV.mul(uvSize).add(uvOffset)\n\n const mapNode = tslTexture(this.texture!)\n const sampledColor = mapNode.sample(finalUV)\n\n this.material = materialFactory()\n\n const finalColor = vec4(sampledColor.rgb, sampledColor.a.mul(opacity))\n this.material.colorNode = finalColor\n this.material.positionNode = finalPosition\n\n return this.material\n }\n\n private _resolveCurrentOrigin(originsArray: THREE.Vector3[]): THREE.Vector3 {\n const currentOrigin = originsArray[this._currentOriginIndex]\n this._currentOriginIndex = (this._currentOriginIndex + 1) % originsArray.length\n return currentOrigin\n }\n\n public getActiveParticleCount(): number {\n return this.particleSlots.filter((slot) => slot.isActive).length\n }\n\n private _resolveSpawnRadius(spawnRadius: number | THREE.Vector3): THREE.Vector3 {\n return typeof spawnRadius === \"number\" ? new THREE.Vector3(spawnRadius, spawnRadius, spawnRadius) : spawnRadius\n }\n\n private _spawnParticle(effectiveParams: Readonly<ParticleEffectParameters>, spawnRadiusVec: THREE.Vector3): void {\n if (!this.instanceManager?.hasFreeIndices) return\n\n const index = this.instanceManager!.acquireInstanceSlot()\n const particleOrigin = this._resolveCurrentOrigin(effectiveParams.origins)\n\n const spawnOffset = new THREE.Vector3(\n (Math.random() - 0.5) * 2 * spawnRadiusVec.x,\n (Math.random() - 0.5) * 2 * spawnRadiusVec.y,\n (Math.random() - 0.5) * 2 * spawnRadiusVec.z,\n )\n const initialPosition = new THREE.Vector3().copy(particleOrigin).add(spawnOffset)\n\n const velocity = new THREE.Vector3(\n THREE.MathUtils.randFloat(effectiveParams.initialVelocityMin.x, effectiveParams.initialVelocityMax.x),\n THREE.MathUtils.randFloat(effectiveParams.initialVelocityMin.y, effectiveParams.initialVelocityMax.y),\n THREE.MathUtils.randFloat(effectiveParams.initialVelocityMin.z, effectiveParams.initialVelocityMax.z),\n )\n\n const angularVelocity = new THREE.Vector3(\n THREE.MathUtils.randFloat(effectiveParams.angularVelocityMin.x, effectiveParams.angularVelocityMax.x),\n THREE.MathUtils.randFloat(effectiveParams.angularVelocityMin.y, effectiveParams.angularVelocityMax.y),\n THREE.MathUtils.randFloat(effectiveParams.angularVelocityMin.z, effectiveParams.angularVelocityMax.z),\n )\n\n const lifespan = THREE.MathUtils.randFloat(effectiveParams.lifetimeMsMin, effectiveParams.lifetimeMsMax) / 1000\n\n let gravityFactor = 1.0\n if (effectiveParams.randomGravityFactorMinMax) {\n gravityFactor = THREE.MathUtils.randFloat(\n effectiveParams.randomGravityFactorMinMax.x,\n effectiveParams.randomGravityFactorMinMax.y,\n )\n }\n\n const initialScale = effectiveParams.scale ?? 1.0\n let scaleMin = initialScale\n let scaleMax = initialScale\n if (effectiveParams.scaleOverLifeMinMax) {\n scaleMin = initialScale * effectiveParams.scaleOverLifeMinMax.x\n scaleMax = initialScale * effectiveParams.scaleOverLifeMinMax.y\n }\n\n this.particleDataAttribute!.setXYZW(\n index,\n initialPosition.x,\n initialPosition.y,\n initialPosition.z,\n this.currentTime,\n )\n this.velocityAttribute!.setXYZW(index, velocity.x, velocity.y, velocity.z, gravityFactor)\n this.angularVelAttribute!.setXYZW(index, angularVelocity.x, angularVelocity.y, angularVelocity.z, lifespan)\n this.scaleDataAttribute!.setXYZW(index, initialScale, scaleMin, scaleMax, Math.random())\n\n this.particleSlots[index] = {\n isActive: true,\n spawnTime: this.currentTime,\n lifespan: lifespan,\n }\n\n this.particleDataAttribute!.needsUpdate = true\n this.velocityAttribute!.needsUpdate = true\n this.angularVelAttribute!.needsUpdate = true\n this.scaleDataAttribute!.needsUpdate = true\n }\n\n public async spawnParticles(count: number, overrides: Partial<ParticleEffectParameters> = {}): Promise<void> {\n await this._ensureInitialized()\n if (count <= 0) return\n\n const finalParams: ParticleEffectParameters = {\n ...this.baseConfig,\n ...overrides,\n }\n\n const spawnRadiusVec = this._resolveSpawnRadius(finalParams.spawnRadius)\n\n for (let i = 0; i < count; i++) {\n this._spawnParticle(finalParams, spawnRadiusVec)\n }\n }\n\n public setAutoSpawn(ratePerSecond: number, autoSpawnParamOverrides: Partial<ParticleEffectParameters> = {}): void {\n if (ratePerSecond <= 0) {\n this.stopAutoSpawn()\n return\n }\n const originalOverridesToStore =\n Object.keys(autoSpawnParamOverrides).length > 0 ? { ...autoSpawnParamOverrides } : undefined\n\n this.autoSpawnConfig = {\n resolvedParams: { ...this.baseConfig, ...autoSpawnParamOverrides },\n originalOverrides: originalOverridesToStore,\n ratePerSecond: ratePerSecond,\n accumulator: 0,\n }\n }\n\n public hasAutoSpawn(): boolean {\n return this.autoSpawnConfig !== null\n }\n\n public stopAutoSpawn(): void {\n this.autoSpawnConfig = null\n }\n\n public async update(deltaTimeMs: number): Promise<void> {\n await this._ensureInitialized()\n\n this.currentTime += deltaTimeMs / 1000\n this.timeUniform.value = this.currentTime\n\n if (this.autoSpawnConfig) {\n this.autoSpawnConfig.accumulator += deltaTimeMs\n const particlesToSpawnThisFrame = Math.floor(\n this.autoSpawnConfig.accumulator * (this.autoSpawnConfig.ratePerSecond / 1000),\n )\n\n if (particlesToSpawnThisFrame > 0) {\n const spawnRadiusVec = this._resolveSpawnRadius(this.autoSpawnConfig.resolvedParams.spawnRadius)\n for (let i = 0; i < particlesToSpawnThisFrame; i++) {\n this._spawnParticle(this.autoSpawnConfig.resolvedParams, spawnRadiusVec)\n }\n this.autoSpawnConfig.accumulator -= (particlesToSpawnThisFrame * 1000) / this.autoSpawnConfig.ratePerSecond\n }\n }\n\n for (let i = 0; i < this.particleSlots.length; i++) {\n const slot = this.particleSlots[i]\n if (slot.isActive && this.currentTime - slot.spawnTime >= slot.lifespan) {\n slot.isActive = false\n this.particleDataAttribute!.setW(i, -1)\n this.instanceManager!.releaseInstanceSlot(i)\n this.particleDataAttribute!.needsUpdate = true\n }\n }\n }\n\n public dispose(): void {\n if (this.instanceManager) {\n this.instanceManager.dispose()\n this.material?.dispose()\n }\n this.stopAutoSpawn()\n }\n}\n",
13
+ "import * as THREE from \"three\"\nimport { texture as tslTexture, uv, vec2, attribute } from \"three/tsl\"\nimport { MeshBasicNodeMaterial, NodeMaterial } from \"three/webgpu\"\nimport type { TiledSprite, SpriteDefinition, SpriteAnimator } from \"./SpriteAnimator\"\nimport type {\n PhysicsRigidBody,\n PhysicsWorld,\n PhysicsRigidBodyDesc,\n PhysicsColliderDesc,\n PhysicsVector2,\n} from \"../physics/physics-interface\"\nimport type { SpriteResource } from \"../SpriteResourceManager\"\n\nexport interface PhysicsExplosionEffectParameters {\n numRows: number\n numCols: number\n durationMs: number\n explosionForce: number\n forceVariation: number\n torqueStrength: number\n gravityScale: number\n fadeOut: boolean\n linearDamping: number\n angularDamping: number\n restitution: number\n friction: number\n density: number\n materialFactory: () => NodeMaterial\n}\n\nexport const DEFAULT_PHYSICS_EXPLOSION_PARAMETERS: PhysicsExplosionEffectParameters = {\n numRows: 5,\n numCols: 5,\n durationMs: 3000,\n explosionForce: 25.0,\n forceVariation: 0.4,\n torqueStrength: 15.0,\n gravityScale: 1.0,\n fadeOut: true,\n linearDamping: 0.8,\n angularDamping: 0.5,\n restitution: 0.3,\n friction: 0.7,\n density: 1.0,\n materialFactory: () =>\n new MeshBasicNodeMaterial({\n transparent: true,\n alphaTest: 0.01,\n // side: THREE.DoubleSide,\n depthWrite: false,\n }),\n}\n\nexport interface PhysicsExplosionCreationData {\n resource: SpriteResource\n frameUvOffset: THREE.Vector2\n frameUvSize: THREE.Vector2\n spriteWorldTransform: THREE.Matrix4\n}\n\nexport interface PhysicsSpriteRecreationData {\n definition: SpriteDefinition\n currentTransform: {\n position: THREE.Vector3\n quaternion: THREE.Quaternion\n scale: THREE.Vector3\n }\n}\n\nexport interface PhysicsExplosionHandle {\n readonly effect: PhysicsExplodingSpriteEffect\n readonly recreationData: PhysicsSpriteRecreationData\n hasBeenRestored: boolean\n restoreSprite: (spriteAnimator: SpriteAnimator) => Promise<TiledSprite | null>\n}\n\ninterface ExplosionParticle {\n rigidBody: PhysicsRigidBody\n instanceIndex: number\n uvOffset: THREE.Vector2\n uvSize: THREE.Vector2\n initialOpacity: number\n lifeVariation: number\n id: string\n}\n\nexport class PhysicsExplodingSpriteEffect {\n private static materialCache: Map<string, NodeMaterial> = new Map()\n\n private scene: THREE.Scene\n private physicsWorld: PhysicsWorld\n private resource: SpriteResource\n private frameUvOffset: THREE.Vector2\n private frameUvSize: THREE.Vector2\n private spriteWorldTransform: THREE.Matrix4\n private params: PhysicsExplosionEffectParameters\n\n private particles: ExplosionParticle[] = []\n private numParticles: number\n\n private instancedMesh!: THREE.InstancedMesh\n private material!: NodeMaterial\n private uvOffsetAttribute!: THREE.InstancedBufferAttribute\n\n public isActive: boolean = true\n private timeElapsedMs: number = 0\n private particleIdCounter: number = 0\n\n constructor(\n scene: THREE.Scene,\n physicsWorld: PhysicsWorld,\n resource: SpriteResource,\n frameUvOffset: THREE.Vector2,\n frameUvSize: THREE.Vector2,\n spriteWorldTransform: THREE.Matrix4,\n userParams?: Partial<PhysicsExplosionEffectParameters>,\n ) {\n this.scene = scene\n this.physicsWorld = physicsWorld\n this.resource = resource\n this.frameUvOffset = frameUvOffset\n this.frameUvSize = frameUvSize\n this.spriteWorldTransform = spriteWorldTransform\n this.params = { ...DEFAULT_PHYSICS_EXPLOSION_PARAMETERS, ...userParams }\n\n this.numParticles = this.params.numRows * this.params.numCols\n const materialFactory = userParams?.materialFactory ?? DEFAULT_PHYSICS_EXPLOSION_PARAMETERS.materialFactory\n\n this._createPhysicsParticles(materialFactory)\n }\n\n private _createPhysicsParticles(materialFactory: () => NodeMaterial): void {\n if (this.numParticles === 0) return\n\n const particleUnitWidth = 1.0 / this.params.numCols\n const particleUnitHeight = 1.0 / this.params.numRows\n\n const spriteWorldCenter = new THREE.Vector3().setFromMatrixPosition(this.spriteWorldTransform)\n const spriteScale = new THREE.Vector3().setFromMatrixScale(this.spriteWorldTransform)\n const avgScale = (spriteScale.x + spriteScale.y) * 0.5\n const uvOffsetData = new Float32Array(this.numParticles * 4)\n\n let particleIndex = 0\n for (let r = 0; r < this.params.numRows; r++) {\n for (let c = 0; c < this.params.numCols; c++) {\n const localParticlePosX = (c + 0.5) * particleUnitWidth - 0.5\n const localParticlePosY = (r + 0.5) * particleUnitHeight - 0.5\n\n const initialLocalPosition = new THREE.Vector3(localParticlePosX, localParticlePosY, 0)\n const worldPosition = initialLocalPosition.clone().applyMatrix4(this.spriteWorldTransform)\n\n const rigidBodyDesc: PhysicsRigidBodyDesc = {\n translation: { x: worldPosition.x, y: worldPosition.y },\n linearDamping: this.params.linearDamping,\n angularDamping: this.params.angularDamping,\n }\n\n const rigidBody = this.physicsWorld.createRigidBody(rigidBodyDesc)\n\n const particlePhysicsWidth = particleUnitWidth * avgScale * 0.8\n const particlePhysicsHeight = particleUnitHeight * avgScale * 0.8\n const colliderDesc: PhysicsColliderDesc = {\n width: particlePhysicsWidth,\n height: particlePhysicsHeight,\n restitution: this.params.restitution,\n friction: this.params.friction,\n density: this.params.density,\n }\n\n this.physicsWorld.createCollider(colliderDesc, rigidBody)\n\n let explosionDir = worldPosition.clone().sub(spriteWorldCenter)\n if (explosionDir.lengthSq() < 0.0001) {\n explosionDir.set(Math.random() - 0.5, Math.random() - 0.5, 0)\n }\n explosionDir.normalize()\n\n const forceVariationRange = this.params.forceVariation\n const minForceFactor = 1.0 - forceVariationRange * 0.5\n const maxForceFactor = 1.0 + forceVariationRange * 0.5\n const forceFactor = minForceFactor + Math.random() * (maxForceFactor - minForceFactor)\n const explosionForce = this.params.explosionForce * forceFactor\n\n const forceVector: PhysicsVector2 = {\n x: explosionDir.x * explosionForce,\n y: explosionDir.y * explosionForce + explosionForce * 0.3, // Add upward bias\n }\n\n rigidBody.applyImpulse(forceVector)\n\n const torque = (Math.random() - 0.5) * this.params.torqueStrength\n rigidBody.applyTorqueImpulse(torque)\n\n const u0 = this.frameUvOffset.x + (c / this.params.numCols) * this.frameUvSize.x\n const v0 = this.frameUvOffset.y + (r / this.params.numRows) * this.frameUvSize.y\n const uSize = this.frameUvSize.x / this.params.numCols\n const vSize = this.frameUvSize.y / this.params.numRows\n\n const baseIndex = particleIndex * 4\n uvOffsetData[baseIndex] = u0\n uvOffsetData[baseIndex + 1] = v0\n uvOffsetData[baseIndex + 2] = uSize\n uvOffsetData[baseIndex + 3] = vSize\n\n const particleId = `explosion_particle_${this.particleIdCounter++}`\n const lifeVariation = 0.8 + Math.random() * 0.4\n\n const particle: ExplosionParticle = {\n rigidBody,\n instanceIndex: particleIndex,\n uvOffset: new THREE.Vector2(u0, v0),\n uvSize: new THREE.Vector2(uSize, vSize),\n initialOpacity: 1.0,\n lifeVariation,\n id: particleId,\n }\n\n this.particles.push(particle)\n particleIndex++\n }\n }\n\n this.uvOffsetAttribute = new THREE.InstancedBufferAttribute(uvOffsetData, 4)\n this.material = PhysicsExplodingSpriteEffect.getSharedMaterial(this.resource.texture, materialFactory)\n\n const poolKey = `${this.params.numRows}x${this.params.numCols}`\n\n this.instancedMesh = this.resource.meshPool.acquireMesh(poolKey, {\n geometry: () => new THREE.PlaneGeometry(particleUnitWidth, particleUnitHeight),\n material: this.material,\n maxInstances: this.numParticles,\n name: `PhysicsExplodingSprite_${poolKey}`,\n })\n\n this.instancedMesh.geometry.setAttribute(\"a_uvOffset\", this.uvOffsetAttribute)\n\n this.instancedMesh.frustumCulled = false\n\n for (let i = 0; i < this.numParticles; i++) {\n this.instancedMesh.setMatrixAt(i, this.spriteWorldTransform)\n }\n this.instancedMesh.instanceMatrix.needsUpdate = true\n\n this.scene.add(this.instancedMesh)\n }\n\n public static getSharedMaterial(texture: THREE.DataTexture, materialFactory: () => NodeMaterial): NodeMaterial {\n const key = texture.uuid\n const cached = PhysicsExplodingSpriteEffect.materialCache.get(key)\n if (cached) return cached\n\n const a_uvOffset = attribute(\"a_uvOffset\", \"vec4\")\n const uvOffset = vec2(a_uvOffset.x, a_uvOffset.y)\n const uvSize = vec2(a_uvOffset.z, a_uvOffset.w)\n\n const baseUV = uv()\n const finalUV = baseUV.mul(uvSize).add(uvOffset)\n\n const mapNode = tslTexture(texture)\n const sampledColor = mapNode.sample(finalUV)\n\n const material = materialFactory()\n material.colorNode = sampledColor\n\n PhysicsExplodingSpriteEffect.materialCache.set(key, material)\n return material\n }\n\n update(deltaTimeMs: number): void {\n if (!this.isActive) return\n\n this.timeElapsedMs += deltaTimeMs\n\n const tempMatrix = new THREE.Matrix4()\n const tempScale = new THREE.Vector3()\n this.spriteWorldTransform.decompose(new THREE.Vector3(), new THREE.Quaternion(), tempScale)\n\n const axis = new THREE.Vector3(0, 0, 1)\n for (const particle of this.particles) {\n const position = particle.rigidBody.getTranslation()\n const rotation = particle.rigidBody.getRotation()\n const quaternion = new THREE.Quaternion().setFromAxisAngle(axis, rotation)\n\n tempMatrix.compose(new THREE.Vector3(position.x, position.y, 0), quaternion, tempScale)\n\n this.instancedMesh.setMatrixAt(particle.instanceIndex, tempMatrix)\n }\n\n this.instancedMesh.instanceMatrix.needsUpdate = true\n\n if (this.timeElapsedMs >= this.params.durationMs) {\n this.dispose()\n }\n }\n\n dispose(): void {\n if (!this.isActive) return\n this.isActive = false\n\n if (this.instancedMesh) {\n this.scene.remove(this.instancedMesh)\n\n const poolKey = `${this.params.numRows}x${this.params.numCols}`\n this.resource.meshPool.releaseMesh(poolKey, this.instancedMesh)\n }\n\n for (const particle of this.particles) {\n this.physicsWorld.removeRigidBody(particle.rigidBody)\n }\n this.particles = []\n }\n}\n\nexport class PhysicsExplosionManager {\n private scene: THREE.Scene\n private physicsWorld: PhysicsWorld\n private activeExplosions: PhysicsExplodingSpriteEffect[] = []\n\n constructor(scene: THREE.Scene, physicsWorld: PhysicsWorld) {\n this.scene = scene\n this.physicsWorld = physicsWorld\n }\n\n public fillPool(\n resource: SpriteResource,\n count: number,\n params: Partial<PhysicsExplosionEffectParameters> = {},\n ): void {\n const effectParams = { ...DEFAULT_PHYSICS_EXPLOSION_PARAMETERS, ...params }\n const poolKey = `${effectParams.numRows}x${effectParams.numCols}`\n const particleUnitWidth = 1.0 / effectParams.numCols\n const particleUnitHeight = 1.0 / effectParams.numRows\n const numParticles = effectParams.numRows * effectParams.numCols\n\n const materialFactory = params.materialFactory ?? DEFAULT_PHYSICS_EXPLOSION_PARAMETERS.materialFactory\n const material = PhysicsExplodingSpriteEffect.getSharedMaterial(resource.texture, materialFactory)\n const geometry = new THREE.PlaneGeometry(particleUnitWidth, particleUnitHeight)\n\n resource.meshPool.fill(\n poolKey,\n {\n geometry: () => geometry,\n material,\n maxInstances: numParticles,\n name: `PhysicsExplodingSprite_${poolKey}`,\n },\n count,\n )\n }\n\n private _createEffectCreationData(sprite: TiledSprite): PhysicsExplosionCreationData {\n const animState = sprite.currentAnimation.state\n const resource = sprite.currentAnimation.getResource()\n const currentAbsoluteFrame = animState.animFrameOffset + sprite.currentAnimation.currentLocalFrame\n const frameUOffset = currentAbsoluteFrame * resource.uvTileSize.x\n return {\n resource: resource,\n frameUvOffset: new THREE.Vector2(frameUOffset, 0),\n frameUvSize: resource.uvTileSize.clone(),\n spriteWorldTransform: sprite.getWorldTransform(),\n }\n }\n\n public async createExplosionForSprite(\n spriteToExplode: TiledSprite,\n userParams?: Partial<PhysicsExplosionEffectParameters>,\n ): Promise<PhysicsExplosionHandle | null> {\n const effectCreationData = this._createEffectCreationData(spriteToExplode)\n const definition = spriteToExplode.definition\n const transform = spriteToExplode.currentTransform\n const spriteRecreationData: PhysicsSpriteRecreationData = {\n definition: definition,\n currentTransform: transform,\n }\n\n spriteToExplode.destroy()\n\n const effect = new PhysicsExplodingSpriteEffect(\n this.scene,\n this.physicsWorld,\n effectCreationData.resource,\n effectCreationData.frameUvOffset,\n effectCreationData.frameUvSize,\n effectCreationData.spriteWorldTransform,\n userParams,\n )\n this.activeExplosions.push(effect)\n\n const handle: PhysicsExplosionHandle = {\n effect: effect,\n recreationData: spriteRecreationData,\n hasBeenRestored: false,\n restoreSprite: async (spriteAnimator: SpriteAnimator): Promise<TiledSprite | null> => {\n if (handle.hasBeenRestored) {\n return null\n }\n\n handle.effect.dispose()\n\n const newSprite = await spriteAnimator.createSprite(handle.recreationData.definition)\n const currentSpriteTransform = handle.recreationData.currentTransform\n newSprite.setTransform(\n currentSpriteTransform.position,\n currentSpriteTransform.quaternion,\n currentSpriteTransform.scale,\n )\n handle.hasBeenRestored = true\n\n return newSprite\n },\n }\n return handle\n }\n\n public update(deltaTimeMs: number): void {\n for (let i = this.activeExplosions.length - 1; i >= 0; i--) {\n const explosion = this.activeExplosions[i]\n explosion.update(deltaTimeMs)\n if (!explosion.isActive) {\n this.activeExplosions.splice(i, 1)\n }\n }\n }\n\n public disposeAll(): void {\n this.activeExplosions.forEach((exp) => exp.dispose())\n this.activeExplosions = []\n }\n}\n",
14
+ "import RAPIER from \"@dimforge/rapier2d-simd-compat\"\nimport type {\n PhysicsVector2,\n PhysicsRigidBodyDesc,\n PhysicsColliderDesc,\n PhysicsRigidBody,\n PhysicsWorld,\n} from \"./physics-interface\"\n\nexport class RapierRigidBody implements PhysicsRigidBody {\n constructor(private rapierBody: RAPIER.RigidBody) {}\n\n applyImpulse(force: PhysicsVector2): void {\n this.rapierBody.applyImpulse(force, true)\n }\n\n applyTorqueImpulse(torque: number): void {\n this.rapierBody.applyTorqueImpulse(torque, true)\n }\n\n getTranslation(): PhysicsVector2 {\n const pos = this.rapierBody.translation()\n return { x: pos.x, y: pos.y }\n }\n\n getRotation(): number {\n return this.rapierBody.rotation()\n }\n\n get nativeBody(): RAPIER.RigidBody {\n return this.rapierBody\n }\n}\n\nexport class RapierPhysicsWorld implements PhysicsWorld {\n constructor(private rapierWorld: RAPIER.World) {}\n\n createRigidBody(desc: PhysicsRigidBodyDesc): PhysicsRigidBody {\n const rigidBodyDesc = RAPIER.RigidBodyDesc.dynamic()\n .setTranslation(desc.translation.x, desc.translation.y)\n .setLinearDamping(desc.linearDamping)\n .setAngularDamping(desc.angularDamping)\n\n const rapierBody = this.rapierWorld.createRigidBody(rigidBodyDesc)\n return new RapierRigidBody(rapierBody)\n }\n\n createCollider(colliderDesc: PhysicsColliderDesc, rigidBody: PhysicsRigidBody): void {\n const rapierColliderDesc = RAPIER.ColliderDesc.cuboid(colliderDesc.width * 0.5, colliderDesc.height * 0.5)\n .setRestitution(colliderDesc.restitution)\n .setFriction(colliderDesc.friction)\n .setDensity(colliderDesc.density)\n\n const rapierRigidBody = (rigidBody as RapierRigidBody).nativeBody\n this.rapierWorld.createCollider(rapierColliderDesc, rapierRigidBody)\n }\n\n removeRigidBody(rigidBody: PhysicsRigidBody): void {\n const rapierRigidBody = (rigidBody as RapierRigidBody).nativeBody\n this.rapierWorld.removeRigidBody(rapierRigidBody)\n }\n\n static createFromRapierWorld(rapierWorld: RAPIER.World): RapierPhysicsWorld {\n return new RapierPhysicsWorld(rapierWorld)\n }\n}\n",
15
+ "import * as planck from \"planck\"\nimport type {\n PhysicsVector2,\n PhysicsRigidBodyDesc,\n PhysicsColliderDesc,\n PhysicsRigidBody,\n PhysicsWorld,\n} from \"./physics-interface\"\n\nexport class PlanckRigidBody implements PhysicsRigidBody {\n constructor(private planckBody: planck.Body) {}\n\n applyImpulse(force: PhysicsVector2): void {\n this.planckBody.applyLinearImpulse(planck.Vec2(force.x, force.y), this.planckBody.getWorldCenter())\n }\n\n applyTorqueImpulse(torque: number): void {\n this.planckBody.applyAngularImpulse(torque)\n }\n\n getTranslation(): PhysicsVector2 {\n const pos = this.planckBody.getPosition()\n return { x: pos.x, y: pos.y }\n }\n\n getRotation(): number {\n return this.planckBody.getAngle()\n }\n\n get nativeBody(): planck.Body {\n return this.planckBody\n }\n}\n\nexport class PlanckPhysicsWorld implements PhysicsWorld {\n constructor(private planckWorld: planck.World) {}\n\n createRigidBody(desc: PhysicsRigidBodyDesc): PhysicsRigidBody {\n const bodyDef: planck.BodyDef = {\n type: \"dynamic\",\n position: planck.Vec2(desc.translation.x, desc.translation.y),\n linearDamping: desc.linearDamping,\n angularDamping: desc.angularDamping,\n }\n\n const planckBody = this.planckWorld.createBody(bodyDef)\n return new PlanckRigidBody(planckBody)\n }\n\n createCollider(colliderDesc: PhysicsColliderDesc, rigidBody: PhysicsRigidBody): void {\n const shape = planck.Box(colliderDesc.width * 0.5, colliderDesc.height * 0.5)\n\n const fixtureDef: planck.FixtureDef = {\n shape: shape,\n density: colliderDesc.density,\n friction: colliderDesc.friction,\n restitution: colliderDesc.restitution,\n }\n\n const planckRigidBody = (rigidBody as PlanckRigidBody).nativeBody\n planckRigidBody.createFixture(fixtureDef)\n }\n\n removeRigidBody(rigidBody: PhysicsRigidBody): void {\n const planckRigidBody = (rigidBody as PlanckRigidBody).nativeBody\n this.planckWorld.destroyBody(planckRigidBody)\n }\n\n static createFromPlanckWorld(planckWorld: planck.World): PlanckPhysicsWorld {\n return new PlanckPhysicsWorld(planckWorld)\n }\n}\n",
16
+ "import * as THREE from \"three\"\nimport { TextureUtils } from \"./TextureUtils\"\nimport type { Scene } from \"three\"\n\nexport interface ResourceConfig {\n imagePath: string\n sheetNumFrames: number\n}\n\nexport interface SheetProperties {\n imagePath: string\n sheetTilesetWidth: number\n sheetTilesetHeight: number\n sheetNumFrames: number\n}\n\nexport interface InstanceManagerOptions {\n maxInstances: number\n renderOrder?: number\n depthWrite?: boolean\n name?: string\n frustumCulled?: boolean\n matrix?: THREE.Matrix4\n}\n\nexport interface MeshPoolOptions {\n geometry: () => THREE.BufferGeometry\n material: THREE.Material\n maxInstances: number\n name?: string\n}\n\nconst HIDDEN_MATRIX = new THREE.Matrix4().scale(new THREE.Vector3(0, 0, 0))\n\nexport class MeshPool {\n private pools: Map<string, THREE.InstancedMesh[]> = new Map()\n\n public acquireMesh(poolId: string, options: MeshPoolOptions): THREE.InstancedMesh {\n const poolArray = this.pools.get(poolId) ?? []\n this.pools.set(poolId, poolArray)\n\n if (poolArray.length > 0) {\n const mesh = poolArray.pop()!\n mesh.material = options.material\n mesh.count = options.maxInstances\n return mesh\n }\n\n const mesh = new THREE.InstancedMesh(options.geometry(), options.material, options.maxInstances)\n\n if (options.name) {\n mesh.name = options.name\n }\n\n return mesh\n }\n\n public releaseMesh(poolId: string, mesh: THREE.InstancedMesh): void {\n const poolArray = this.pools.get(poolId) ?? []\n poolArray.push(mesh)\n this.pools.set(poolId, poolArray)\n }\n\n public fill(poolId: string, options: MeshPoolOptions, count: number): void {\n const poolArray = this.pools.get(poolId) ?? []\n this.pools.set(poolId, poolArray)\n\n for (let i = 0; i < count; i++) {\n const mesh = new THREE.InstancedMesh(options.geometry(), options.material, options.maxInstances)\n\n if (options.name) {\n mesh.name = `${options.name}_${i}`\n }\n\n poolArray.push(mesh)\n }\n }\n\n public clearPool(poolId: string): void {\n const poolArray = this.pools.get(poolId)\n if (poolArray) {\n poolArray.forEach((mesh) => {\n mesh.geometry.dispose()\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((mat) => mat.dispose())\n } else {\n mesh.material.dispose()\n }\n })\n poolArray.length = 0\n }\n }\n\n public clearAllPools(): void {\n for (const poolId of this.pools.keys()) {\n this.clearPool(poolId)\n }\n this.pools.clear()\n }\n}\n\nexport class InstanceManager {\n private scene: Scene\n private instancedMesh: THREE.InstancedMesh\n private material: THREE.Material\n private maxInstances: number\n private _freeIndices: number[] = []\n private instanceCount: number = 0\n private _matrix: THREE.Matrix4\n\n constructor(scene: Scene, geometry: THREE.BufferGeometry, material: THREE.Material, options: InstanceManagerOptions) {\n this.scene = scene\n this.material = material\n this.maxInstances = options.maxInstances\n this._matrix = options.matrix ?? HIDDEN_MATRIX\n\n this.instancedMesh = new THREE.InstancedMesh(geometry, material, this.maxInstances)\n this.instancedMesh.renderOrder = options.renderOrder ?? 0\n this.instancedMesh.frustumCulled = options.frustumCulled ?? false\n this.instancedMesh.instanceMatrix.setUsage(THREE.DynamicDrawUsage)\n\n if (options.name) {\n this.instancedMesh.name = options.name\n }\n\n for (let i = 0; i < this.maxInstances; i++) {\n this._freeIndices.push(i)\n this.instancedMesh.setMatrixAt(i, this._matrix)\n }\n this.instancedMesh.instanceMatrix.needsUpdate = true\n\n this.scene.add(this.instancedMesh)\n }\n\n acquireInstanceSlot(): number {\n if (this._freeIndices.length === 0) {\n throw new Error(`[InstanceManager] Max instances (${this.maxInstances}) reached. Cannot acquire slot.`)\n }\n const instanceIndex = this._freeIndices.pop()!\n this.instanceCount++\n return instanceIndex\n }\n\n releaseInstanceSlot(instanceIndex: number): void {\n if (instanceIndex >= 0 && instanceIndex < this.maxInstances) {\n this.instancedMesh.setMatrixAt(instanceIndex, this._matrix)\n this.instancedMesh.instanceMatrix.needsUpdate = true\n\n if (!this._freeIndices.includes(instanceIndex)) {\n this._freeIndices.push(instanceIndex)\n this._freeIndices.sort((a, b) => a - b)\n this.instanceCount--\n }\n } else {\n console.warn(`[InstanceManager] Attempted to release invalid instanceIndex ${instanceIndex}`)\n }\n }\n\n getInstanceCount(): number {\n return this.instanceCount\n }\n\n getMaxInstances(): number {\n return this.maxInstances\n }\n\n get hasFreeIndices(): boolean {\n return this._freeIndices.length > 0\n }\n\n get mesh(): THREE.InstancedMesh {\n return this.instancedMesh\n }\n\n dispose(): void {\n this.scene.remove(this.instancedMesh)\n this.instancedMesh.geometry.dispose()\n if (Array.isArray(this.material)) {\n this.material.forEach((mat) => mat.dispose())\n } else {\n this.material.dispose()\n }\n }\n}\n\nexport class SpriteResource {\n private _texture: THREE.DataTexture\n private _sheetProperties: SheetProperties\n private scene: Scene\n private _meshPool: MeshPool\n\n constructor(texture: THREE.DataTexture, sheetProperties: SheetProperties, scene: Scene) {\n this._texture = texture\n this._sheetProperties = sheetProperties\n this.scene = scene\n this._meshPool = new MeshPool()\n }\n\n public get texture(): THREE.DataTexture {\n return this._texture\n }\n\n public get sheetProperties(): SheetProperties {\n return this._sheetProperties\n }\n\n public get meshPool(): MeshPool {\n return this._meshPool\n }\n\n public createInstanceManager(\n geometry: THREE.BufferGeometry,\n material: THREE.Material,\n options: InstanceManagerOptions,\n ): InstanceManager {\n const managerOptions = {\n ...options,\n name: options.name ?? `InstancedSprites_${this._sheetProperties.imagePath.replace(/[^a-zA-Z0-9_]/g, \"_\")}`,\n }\n\n return new InstanceManager(this.scene, geometry, material, managerOptions)\n }\n\n public get uvTileSize(): THREE.Vector2 {\n const uvTileWidth = 1.0 / this._sheetProperties.sheetNumFrames\n const uvTileHeight = 1.0\n return new THREE.Vector2(uvTileWidth, uvTileHeight)\n }\n\n public dispose(): void {\n this._meshPool.clearAllPools()\n }\n}\n\nexport class SpriteResourceManager {\n private resources: Map<string, SpriteResource> = new Map()\n private textureCache: Map<string, THREE.DataTexture> = new Map()\n private scene: Scene\n\n constructor(scene: Scene) {\n this.scene = scene\n }\n\n private getResourceKey(sheetProps: SheetProperties): string {\n return sheetProps.imagePath\n }\n\n public async getOrCreateResource(texture: THREE.DataTexture, sheetProps: SheetProperties): Promise<SpriteResource> {\n const resourceKey = this.getResourceKey(sheetProps)\n let resource = this.resources.get(resourceKey)\n\n if (!resource) {\n resource = new SpriteResource(texture, sheetProps, this.scene)\n this.resources.set(resourceKey, resource)\n }\n\n return resource\n }\n\n public async createResource(config: ResourceConfig): Promise<SpriteResource> {\n let texture = this.textureCache.get(config.imagePath)\n if (!texture) {\n const loadedTexture = await TextureUtils.fromFile(config.imagePath)\n if (!loadedTexture) {\n throw new Error(`[SpriteResourceManager] Failed to load texture for ${config.imagePath}`)\n }\n loadedTexture.needsUpdate = true\n texture = loadedTexture\n this.textureCache.set(config.imagePath, texture)\n }\n\n const sheetProps: SheetProperties = {\n imagePath: config.imagePath,\n sheetTilesetWidth: texture.image.width,\n sheetTilesetHeight: texture.image.height,\n sheetNumFrames: config.sheetNumFrames,\n }\n\n return await this.getOrCreateResource(texture, sheetProps)\n }\n\n public clearCache(): void {\n this.resources.clear()\n this.textureCache.clear()\n }\n}\n",
17
+ "// 3D module exports - requires optional dependencies\nexport * from \"./3d/index\"\nexport * as THREE from \"three\"\n"
18
+ ],
19
+ "mappings": "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",
20
+ "debugId": "23E2BC997AA0860D64756E2164756E21",
21
+ "names": []
22
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 opentui
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # OpenTUI Core
2
+
3
+ OpenTUI Core is a TypeScript library for building terminal user interfaces (TUIs). It is currently in
4
+ development and is not ready for production use.
5
+
6
+ ## Documentation
7
+
8
+ - [Getting Started](docs/getting-started.md) - API and usage guide
9
+ - [Development Guide](docs/development.md) - Building, testing, and contributing
10
+ - [Tree-Sitter](docs/tree-sitter.md) - Syntax highlighting integration
11
+ - [Renderables vs Constructs](docs/renderables-vs-constructs.md) - Understanding the component model
12
+ - [Environment Variables](docs/env-vars.md) - Configuration options
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ bun install @opentui/core
18
+ ```
19
+
20
+ ## Build
21
+
22
+ ```bash
23
+ bun run build
24
+ ```
25
+
26
+ This creates platform-specific libraries that are automatically loaded by the TypeScript layer.
27
+
28
+ ## Examples
29
+
30
+ ```bash
31
+ bun install
32
+ bun run src/examples/index.ts
33
+ ```
34
+
35
+ ## Benchmarks
36
+
37
+ Run native performance benchmarks:
38
+
39
+ ```bash
40
+ bun run bench:native
41
+ ```
42
+
43
+ See [src/zig/bench.zig](src/zig/bench.zig) for available options like `--filter` and `--mem`.
44
+
45
+ ## CLI Renderer
46
+
47
+ ### Renderables
48
+
49
+ Renderables are hierarchical objects that can be positioned, nested, styled and rendered to the terminal:
50
+
51
+ ```typescript
52
+ import { createCliRenderer, TextRenderable } from "@opentui/core"
53
+
54
+ const renderer = await createCliRenderer()
55
+
56
+ const obj = new TextRenderable(renderer, { id: "my-obj", content: "Hello, world!" })
57
+
58
+ renderer.root.add(obj)
59
+ ```