@opentui/three 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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.
@@ -0,0 +1,74 @@
1
+ import * as THREE from "three";
2
+ import type { Scene } from "three";
3
+ export interface ResourceConfig {
4
+ imagePath: string;
5
+ sheetNumFrames: number;
6
+ }
7
+ export interface SheetProperties {
8
+ imagePath: string;
9
+ sheetTilesetWidth: number;
10
+ sheetTilesetHeight: number;
11
+ sheetNumFrames: number;
12
+ }
13
+ export interface InstanceManagerOptions {
14
+ maxInstances: number;
15
+ renderOrder?: number;
16
+ depthWrite?: boolean;
17
+ name?: string;
18
+ frustumCulled?: boolean;
19
+ matrix?: THREE.Matrix4;
20
+ }
21
+ export interface MeshPoolOptions {
22
+ geometry: () => THREE.BufferGeometry;
23
+ material: THREE.Material;
24
+ maxInstances: number;
25
+ name?: string;
26
+ }
27
+ export declare class MeshPool {
28
+ private pools;
29
+ acquireMesh(poolId: string, options: MeshPoolOptions): THREE.InstancedMesh;
30
+ releaseMesh(poolId: string, mesh: THREE.InstancedMesh): void;
31
+ fill(poolId: string, options: MeshPoolOptions, count: number): void;
32
+ clearPool(poolId: string): void;
33
+ clearAllPools(): void;
34
+ }
35
+ export declare class InstanceManager {
36
+ private scene;
37
+ private instancedMesh;
38
+ private material;
39
+ private maxInstances;
40
+ private _freeIndices;
41
+ private instanceCount;
42
+ private _matrix;
43
+ constructor(scene: Scene, geometry: THREE.BufferGeometry, material: THREE.Material, options: InstanceManagerOptions);
44
+ acquireInstanceSlot(): number;
45
+ releaseInstanceSlot(instanceIndex: number): void;
46
+ getInstanceCount(): number;
47
+ getMaxInstances(): number;
48
+ get hasFreeIndices(): boolean;
49
+ get mesh(): THREE.InstancedMesh;
50
+ dispose(): void;
51
+ }
52
+ export declare class SpriteResource {
53
+ private _texture;
54
+ private _sheetProperties;
55
+ private scene;
56
+ private _meshPool;
57
+ constructor(texture: THREE.DataTexture, sheetProperties: SheetProperties, scene: Scene);
58
+ get texture(): THREE.DataTexture;
59
+ get sheetProperties(): SheetProperties;
60
+ get meshPool(): MeshPool;
61
+ createInstanceManager(geometry: THREE.BufferGeometry, material: THREE.Material, options: InstanceManagerOptions): InstanceManager;
62
+ get uvTileSize(): THREE.Vector2;
63
+ dispose(): void;
64
+ }
65
+ export declare class SpriteResourceManager {
66
+ private resources;
67
+ private textureCache;
68
+ private scene;
69
+ constructor(scene: Scene);
70
+ private getResourceKey;
71
+ getOrCreateResource(texture: THREE.DataTexture, sheetProps: SheetProperties): Promise<SpriteResource>;
72
+ createResource(config: ResourceConfig): Promise<SpriteResource>;
73
+ clearCache(): void;
74
+ }
@@ -0,0 +1,13 @@
1
+ import { Sprite, SpriteMaterial, type SpriteMaterialParameters } from "three";
2
+ export declare class SheetSprite extends Sprite {
3
+ private _frameIndex;
4
+ private _numFrames;
5
+ constructor(material: SpriteMaterial, numFrames: number);
6
+ setIndex: (index: number) => void;
7
+ }
8
+ export declare class SpriteUtils {
9
+ static fromFile(path: string, { materialParameters, }?: {
10
+ materialParameters?: Omit<SpriteMaterialParameters, "map">;
11
+ }): Promise<Sprite>;
12
+ static sheetFromFile(path: string, numFrames: number): Promise<SheetSprite>;
13
+ }
@@ -0,0 +1,24 @@
1
+ import { Color, Texture, DataTexture } from "three";
2
+ export declare class TextureUtils {
3
+ /**
4
+ * Loads a texture from a file path using sharp.
5
+ * Returns a THREE.Texture with ImageData attached to its .image property.
6
+ */
7
+ static loadTextureFromFile(path: string): Promise<DataTexture | null>;
8
+ /**
9
+ * Alias for loadTextureFromFile for convenience.
10
+ */
11
+ static fromFile(path: string): Promise<DataTexture | null>;
12
+ /**
13
+ * Creates a THREE.Texture with a checkerboard pattern.
14
+ */
15
+ static createCheckerboard(size?: number, color1?: Color, color2?: Color, checkSize?: number): Texture;
16
+ /**
17
+ * Creates a THREE.Texture with a gradient pattern.
18
+ */
19
+ static createGradient(size?: number, startColor?: Color, endColor?: Color, direction?: "horizontal" | "vertical" | "radial"): Texture;
20
+ /**
21
+ * Creates a THREE.Texture with a procedural noise pattern.
22
+ */
23
+ static createNoise(size?: number, scale?: number, octaves?: number, color1?: Color, color2?: Color): Texture;
24
+ }
@@ -0,0 +1,38 @@
1
+ import { OrthographicCamera, PerspectiveCamera, Scene } from "three";
2
+ import { Renderable, type OptimizedBuffer, type RenderableOptions, type RenderContext } from "@opentui/core";
3
+ import { ThreeCliRenderer, type ThreeCliRendererOptions } from "./WGPURenderer.js";
4
+ export interface ThreeRenderableOptions extends RenderableOptions<ThreeRenderable> {
5
+ scene?: Scene | null;
6
+ camera?: PerspectiveCamera | OrthographicCamera;
7
+ renderer?: Omit<ThreeCliRendererOptions, "width" | "height" | "autoResize">;
8
+ autoAspect?: boolean;
9
+ }
10
+ export declare class ThreeRenderable extends Renderable {
11
+ private engine;
12
+ private scene;
13
+ private autoAspect;
14
+ private initPromise;
15
+ private initFailed;
16
+ private drawInFlight;
17
+ private frameCallback;
18
+ private frameCallbackRegistered;
19
+ private cliRenderer;
20
+ private clearColor;
21
+ constructor(ctx: RenderContext, options: ThreeRenderableOptions);
22
+ get aspectRatio(): number;
23
+ get renderer(): ThreeCliRenderer;
24
+ getScene(): Scene | null;
25
+ setScene(scene: Scene | null): void;
26
+ getActiveCamera(): PerspectiveCamera | OrthographicCamera;
27
+ setActiveCamera(camera: PerspectiveCamera | OrthographicCamera): void;
28
+ setAutoAspect(autoAspect: boolean): void;
29
+ protected onResize(width: number, height: number): void;
30
+ protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void;
31
+ protected destroySelf(): void;
32
+ private registerFrameCallback;
33
+ private renderToBuffer;
34
+ private ensureInitialized;
35
+ private updateCameraAspect;
36
+ private getAspectRatio;
37
+ private getRenderSize;
38
+ }
@@ -0,0 +1,59 @@
1
+ import { PerspectiveCamera, OrthographicCamera, Scene } from "three";
2
+ import { RGBA, type CliRenderer, type OptimizedBuffer } from "@opentui/core";
3
+ import { SuperSampleAlgorithm } from "./canvas.js";
4
+ export declare enum SuperSampleType {
5
+ NONE = "none",
6
+ GPU = "gpu",
7
+ CPU = "cpu"
8
+ }
9
+ export interface ThreeCliRendererOptions {
10
+ width: number;
11
+ height: number;
12
+ focalLength?: number;
13
+ backgroundColor?: RGBA;
14
+ superSample?: SuperSampleType;
15
+ alpha?: boolean;
16
+ autoResize?: boolean;
17
+ libPath?: string;
18
+ }
19
+ export declare class ThreeCliRenderer {
20
+ private readonly cliRenderer;
21
+ private outputWidth;
22
+ private outputHeight;
23
+ private renderWidth;
24
+ private renderHeight;
25
+ private superSample;
26
+ private backgroundColor;
27
+ private alpha;
28
+ private threeRenderer?;
29
+ private canvas?;
30
+ private device;
31
+ private activeCamera;
32
+ private _aspectRatio;
33
+ private doRenderStats;
34
+ private resizeHandler;
35
+ private debugToggleHandler;
36
+ private destroyHandler;
37
+ private renderTimeMs;
38
+ private readbackTimeMs;
39
+ private totalDrawTimeMs;
40
+ private renderMethod;
41
+ get aspectRatio(): number;
42
+ constructor(cliRenderer: CliRenderer, options: ThreeCliRendererOptions);
43
+ toggleDebugStats(): void;
44
+ init(): Promise<void>;
45
+ getSuperSampleAlgorithm(): SuperSampleAlgorithm;
46
+ setSuperSampleAlgorithm(superSampleAlgorithm: SuperSampleAlgorithm): void;
47
+ saveToFile(filePath: string): Promise<void>;
48
+ setActiveCamera(camera: PerspectiveCamera | OrthographicCamera): void;
49
+ getActiveCamera(): PerspectiveCamera | OrthographicCamera;
50
+ setBackgroundColor(color: RGBA): void;
51
+ setSize(width: number, height: number, forceUpdate?: boolean): void;
52
+ drawScene(root: Scene, buffer: OptimizedBuffer, deltaTime: number): Promise<void>;
53
+ private rendering;
54
+ private destroyed;
55
+ doDrawScene(root: Scene, camera: PerspectiveCamera | OrthographicCamera, buffer: OptimizedBuffer, deltaTime: number): Promise<void>;
56
+ toggleSuperSampling(): void;
57
+ renderStats(buffer: OptimizedBuffer): void;
58
+ destroy(): void;
59
+ }
@@ -0,0 +1,71 @@
1
+ import * as THREE from "three";
2
+ import { NodeMaterial } from "three/webgpu";
3
+ import type { TiledSprite, SpriteDefinition, SpriteAnimator } from "./SpriteAnimator.js";
4
+ import type { SpriteResource } from "../SpriteResourceManager.js";
5
+ export interface ExplosionEffectParameters {
6
+ numRows: number;
7
+ numCols: number;
8
+ durationMs: number;
9
+ strength: number;
10
+ strengthVariation: number;
11
+ gravity: number;
12
+ gravityScale: number;
13
+ fadeOut: boolean;
14
+ angularVelocityMin: THREE.Vector3;
15
+ angularVelocityMax: THREE.Vector3;
16
+ initialVelocityYBoost: number;
17
+ zVariationStrength: number;
18
+ materialFactory: () => NodeMaterial;
19
+ }
20
+ export declare const DEFAULT_EXPLOSION_PARAMETERS: ExplosionEffectParameters;
21
+ export interface ExplosionCreationData {
22
+ resource: SpriteResource;
23
+ frameUvOffset: THREE.Vector2;
24
+ frameUvSize: THREE.Vector2;
25
+ spriteWorldTransform: THREE.Matrix4;
26
+ }
27
+ export interface SpriteRecreationData {
28
+ definition: SpriteDefinition;
29
+ currentTransform: {
30
+ position: THREE.Vector3;
31
+ quaternion: THREE.Quaternion;
32
+ scale: THREE.Vector3;
33
+ };
34
+ }
35
+ export interface ExplosionHandle {
36
+ readonly effect: ExplodingSpriteEffect;
37
+ readonly recreationData: SpriteRecreationData;
38
+ hasBeenRestored: boolean;
39
+ restoreSprite: (spriteAnimator: SpriteAnimator) => Promise<TiledSprite | null>;
40
+ }
41
+ export declare class ExplodingSpriteEffect {
42
+ private static baseMaterialCache;
43
+ private scene;
44
+ private resource;
45
+ private frameUvOffset;
46
+ private frameUvSize;
47
+ private spriteWorldTransform;
48
+ private params;
49
+ private instancedMesh;
50
+ private material;
51
+ private numParticles;
52
+ private uniformRefs;
53
+ isActive: boolean;
54
+ private timeElapsedMs;
55
+ constructor(scene: THREE.Scene, resource: SpriteResource, frameUvOffset: THREE.Vector2, frameUvSize: THREE.Vector2, spriteWorldTransform: THREE.Matrix4, userParams?: Partial<ExplosionEffectParameters>);
56
+ private _createGPUParticles;
57
+ private _createGPUMaterial;
58
+ static _buildTemplateMaterial(texture: THREE.DataTexture, params: ExplosionEffectParameters, materialFactory: () => NodeMaterial): NodeMaterial;
59
+ update(deltaTimeMs: number): void;
60
+ dispose(): void;
61
+ }
62
+ export declare class ExplosionManager {
63
+ private scene;
64
+ private activeExplosions;
65
+ constructor(scene: THREE.Scene);
66
+ fillPool(resource: SpriteResource, count: number, params?: Partial<ExplosionEffectParameters>): void;
67
+ private _createEffectCreationData;
68
+ createExplosionForSprite(spriteToExplode: TiledSprite, userParams?: Partial<ExplosionEffectParameters>): ExplosionHandle | null;
69
+ update(deltaTimeMs: number): void;
70
+ disposeAll(): void;
71
+ }
@@ -0,0 +1,76 @@
1
+ import * as THREE from "three";
2
+ import { NodeMaterial } from "three/webgpu";
3
+ import type { TiledSprite, SpriteDefinition, SpriteAnimator } from "./SpriteAnimator.js";
4
+ import type { PhysicsWorld } from "../physics/physics-interface.js";
5
+ import type { SpriteResource } from "../SpriteResourceManager.js";
6
+ export interface PhysicsExplosionEffectParameters {
7
+ numRows: number;
8
+ numCols: number;
9
+ durationMs: number;
10
+ explosionForce: number;
11
+ forceVariation: number;
12
+ torqueStrength: number;
13
+ gravityScale: number;
14
+ fadeOut: boolean;
15
+ linearDamping: number;
16
+ angularDamping: number;
17
+ restitution: number;
18
+ friction: number;
19
+ density: number;
20
+ materialFactory: () => NodeMaterial;
21
+ }
22
+ export declare const DEFAULT_PHYSICS_EXPLOSION_PARAMETERS: PhysicsExplosionEffectParameters;
23
+ export interface PhysicsExplosionCreationData {
24
+ resource: SpriteResource;
25
+ frameUvOffset: THREE.Vector2;
26
+ frameUvSize: THREE.Vector2;
27
+ spriteWorldTransform: THREE.Matrix4;
28
+ }
29
+ export interface PhysicsSpriteRecreationData {
30
+ definition: SpriteDefinition;
31
+ currentTransform: {
32
+ position: THREE.Vector3;
33
+ quaternion: THREE.Quaternion;
34
+ scale: THREE.Vector3;
35
+ };
36
+ }
37
+ export interface PhysicsExplosionHandle {
38
+ readonly effect: PhysicsExplodingSpriteEffect;
39
+ readonly recreationData: PhysicsSpriteRecreationData;
40
+ hasBeenRestored: boolean;
41
+ restoreSprite: (spriteAnimator: SpriteAnimator) => Promise<TiledSprite | null>;
42
+ }
43
+ export declare class PhysicsExplodingSpriteEffect {
44
+ private static materialCache;
45
+ private scene;
46
+ private physicsWorld;
47
+ private resource;
48
+ private frameUvOffset;
49
+ private frameUvSize;
50
+ private spriteWorldTransform;
51
+ private params;
52
+ private particles;
53
+ private numParticles;
54
+ private instancedMesh;
55
+ private material;
56
+ private uvOffsetAttribute;
57
+ isActive: boolean;
58
+ private timeElapsedMs;
59
+ private particleIdCounter;
60
+ constructor(scene: THREE.Scene, physicsWorld: PhysicsWorld, resource: SpriteResource, frameUvOffset: THREE.Vector2, frameUvSize: THREE.Vector2, spriteWorldTransform: THREE.Matrix4, userParams?: Partial<PhysicsExplosionEffectParameters>);
61
+ private _createPhysicsParticles;
62
+ static getSharedMaterial(texture: THREE.DataTexture, materialFactory: () => NodeMaterial): NodeMaterial;
63
+ update(deltaTimeMs: number): void;
64
+ dispose(): void;
65
+ }
66
+ export declare class PhysicsExplosionManager {
67
+ private scene;
68
+ private physicsWorld;
69
+ private activeExplosions;
70
+ constructor(scene: THREE.Scene, physicsWorld: PhysicsWorld);
71
+ fillPool(resource: SpriteResource, count: number, params?: Partial<PhysicsExplosionEffectParameters>): void;
72
+ private _createEffectCreationData;
73
+ createExplosionForSprite(spriteToExplode: TiledSprite, userParams?: Partial<PhysicsExplosionEffectParameters>): Promise<PhysicsExplosionHandle | null>;
74
+ update(deltaTimeMs: number): void;
75
+ disposeAll(): void;
76
+ }
@@ -0,0 +1,124 @@
1
+ import * as THREE from "three";
2
+ import { NodeMaterial } from "three/webgpu";
3
+ import type { Scene } from "three";
4
+ import { type SpriteResource, InstanceManager } from "../SpriteResourceManager.js";
5
+ export interface AnimationStateConfig {
6
+ imagePath: string;
7
+ sheetNumFrames: number;
8
+ animNumFrames: number;
9
+ animFrameOffset: number;
10
+ frameDuration?: number;
11
+ loop?: boolean;
12
+ initialFrame?: number;
13
+ flipX?: boolean;
14
+ flipY?: boolean;
15
+ }
16
+ export type ResolvedAnimationState = Required<AnimationStateConfig> & {
17
+ sheetTilesetWidth: number;
18
+ sheetTilesetHeight: number;
19
+ texture: THREE.DataTexture;
20
+ };
21
+ export interface AnimationDefinition {
22
+ resource: SpriteResource;
23
+ animNumFrames?: number;
24
+ animFrameOffset?: number;
25
+ frameDuration?: number;
26
+ loop?: boolean;
27
+ initialFrame?: number;
28
+ flipX?: boolean;
29
+ flipY?: boolean;
30
+ }
31
+ export interface SpriteDefinition {
32
+ id?: string;
33
+ renderOrder?: number;
34
+ depthWrite?: boolean;
35
+ maxInstances?: number;
36
+ scale?: number;
37
+ initialAnimation: string;
38
+ animations: Record<string, AnimationDefinition>;
39
+ }
40
+ declare class Animation {
41
+ readonly name: string;
42
+ state: ResolvedAnimationState;
43
+ private resource;
44
+ instanceIndex: number;
45
+ private instanceManager;
46
+ private frameAttribute;
47
+ private flipAttribute;
48
+ currentLocalFrame: number;
49
+ timeAccumulator: number;
50
+ isPlaying: boolean;
51
+ private _isActive;
52
+ constructor(name: string, state: ResolvedAnimationState, resource: SpriteResource, instanceIndex: number, instanceManager: InstanceManager, frameAttribute: THREE.InstancedBufferAttribute, flipAttribute: THREE.InstancedBufferAttribute);
53
+ activate(worldTransform: THREE.Matrix4): void;
54
+ deactivate(): void;
55
+ updateVisuals(worldTransform: THREE.Matrix4): void;
56
+ updateTime(deltaTimeMs: number): boolean;
57
+ play(): void;
58
+ stop(): void;
59
+ goToFrame(localFrame: number): void;
60
+ setFrameDuration(newFrameDuration: number): void;
61
+ getResource(): SpriteResource;
62
+ releaseInstanceSlot(): void;
63
+ }
64
+ export declare class TiledSprite {
65
+ readonly id: string;
66
+ private animator;
67
+ private _animations;
68
+ private _currentAnimation;
69
+ private _transformObject;
70
+ private _reusableMatrix;
71
+ private _reusableAnimGeomScale;
72
+ private _isVisibleState;
73
+ private originalDefinition;
74
+ constructor(id: string, userSpriteDefinition: SpriteDefinition, animator: SpriteAnimator, animationInstanceParams: Array<{
75
+ name: string;
76
+ state: ResolvedAnimationState;
77
+ resource: SpriteResource;
78
+ index: number;
79
+ instanceManager: InstanceManager;
80
+ frameAttribute: THREE.InstancedBufferAttribute;
81
+ flipAttribute: THREE.InstancedBufferAttribute;
82
+ }>);
83
+ private _calculateAnimationWorldMatrix;
84
+ get currentAnimation(): Animation;
85
+ private updateCurrentAnimationVisuals;
86
+ setPosition(position: THREE.Vector3): void;
87
+ setRotation(rotation: THREE.Quaternion): void;
88
+ setScale(scale: THREE.Vector3): void;
89
+ getScale(): THREE.Vector3;
90
+ setTransform(position: THREE.Vector3, rotation: THREE.Quaternion, newScale: THREE.Vector3): void;
91
+ play(): void;
92
+ stop(): void;
93
+ goToFrame(frame: number): void;
94
+ setFrameDuration(newFrameDuration: number): void;
95
+ isPlaying(): boolean;
96
+ setAnimation(animationName: string): Promise<void>;
97
+ update(deltaTime: number): void;
98
+ destroy(): void;
99
+ getCurrentAnimationName(): string;
100
+ getWorldTransform(): THREE.Matrix4;
101
+ getWorldPlaneSize(): THREE.Vector2;
102
+ get visible(): boolean;
103
+ set visible(value: boolean);
104
+ get definition(): SpriteDefinition;
105
+ get currentTransform(): {
106
+ position: THREE.Vector3;
107
+ quaternion: THREE.Quaternion;
108
+ scale: THREE.Vector3;
109
+ };
110
+ }
111
+ export declare class SpriteAnimator {
112
+ private scene;
113
+ private instances;
114
+ private _idCounter;
115
+ private instanceManagers;
116
+ constructor(scene: Scene);
117
+ private createSpriteAnimationMaterial;
118
+ private getOrCreateInstanceManager;
119
+ createSprite(userSpriteDefinition: SpriteDefinition, materialFactory?: () => NodeMaterial): Promise<TiledSprite>;
120
+ update(deltaTime: number): void;
121
+ removeSprite(id: string): void;
122
+ removeAllSprites(): void;
123
+ }
124
+ export {};
@@ -0,0 +1,62 @@
1
+ import * as THREE from "three";
2
+ import { NodeMaterial } from "three/webgpu";
3
+ import type { SpriteResource } from "../SpriteResourceManager.js";
4
+ export interface ParticleEffectParameters {
5
+ resource: SpriteResource;
6
+ animNumFrames?: number;
7
+ animFrameOffset?: number;
8
+ frameDuration?: number;
9
+ loop?: boolean;
10
+ scale?: number;
11
+ renderOrder?: number;
12
+ depthWrite?: boolean;
13
+ maxParticles: number;
14
+ lifetimeMsMin: number;
15
+ lifetimeMsMax: number;
16
+ origins: THREE.Vector3[];
17
+ spawnRadius: number | THREE.Vector3;
18
+ initialVelocityMin: THREE.Vector3;
19
+ initialVelocityMax: THREE.Vector3;
20
+ angularVelocityMin: THREE.Vector3;
21
+ angularVelocityMax: THREE.Vector3;
22
+ gravity?: THREE.Vector3;
23
+ randomGravityFactorMinMax?: THREE.Vector2;
24
+ scaleOverLifeMinMax?: THREE.Vector2;
25
+ fadeOut?: boolean;
26
+ materialFactory?: () => NodeMaterial;
27
+ }
28
+ export declare class SpriteParticleGenerator {
29
+ private scene;
30
+ private baseConfig;
31
+ private autoSpawnConfig;
32
+ private _currentOriginIndex;
33
+ private instanceManager;
34
+ private material;
35
+ private texture;
36
+ private particleDataAttribute;
37
+ private velocityAttribute;
38
+ private angularVelAttribute;
39
+ private scaleDataAttribute;
40
+ private timeUniform;
41
+ private gravityUniform;
42
+ private animationUniform;
43
+ private sheetNumFramesUniform;
44
+ private particleSlots;
45
+ private currentTime;
46
+ private maxParticles;
47
+ private isInitialized;
48
+ constructor(scene: THREE.Scene, initialBaseConfig: ParticleEffectParameters);
49
+ private _ensureInitialized;
50
+ private _initializeGPUParticleSystem;
51
+ private _createGPUMaterial;
52
+ private _resolveCurrentOrigin;
53
+ getActiveParticleCount(): number;
54
+ private _resolveSpawnRadius;
55
+ private _spawnParticle;
56
+ spawnParticles(count: number, overrides?: Partial<ParticleEffectParameters>): Promise<void>;
57
+ setAutoSpawn(ratePerSecond: number, autoSpawnParamOverrides?: Partial<ParticleEffectParameters>): void;
58
+ hasAutoSpawn(): boolean;
59
+ stopAutoSpawn(): void;
60
+ update(deltaTimeMs: number): Promise<void>;
61
+ dispose(): void;
62
+ }
package/canvas.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { GPUCanvasContextMock } from "bun-webgpu";
2
+ import { type OptimizedBuffer } from "@opentui/core";
3
+ import { SuperSampleType } from "./WGPURenderer.js";
4
+ export declare enum SuperSampleAlgorithm {
5
+ STANDARD = 0,
6
+ PRE_SQUEEZED = 1
7
+ }
8
+ export declare class CLICanvas {
9
+ private device;
10
+ private readbackBuffer;
11
+ private width;
12
+ private height;
13
+ private gpuCanvasContext;
14
+ superSampleDrawTimeMs: number;
15
+ mapAsyncTimeMs: number;
16
+ superSample: SuperSampleType;
17
+ private computePipeline;
18
+ private computeBindGroupLayout;
19
+ private computeOutputBuffer;
20
+ private computeParamsBuffer;
21
+ private computeReadbackBuffer;
22
+ private updateScheduled;
23
+ private screenshotGPUBuffer;
24
+ private superSampleAlgorithm;
25
+ private destroyed;
26
+ constructor(device: GPUDevice, width: number, height: number, superSample: SuperSampleType, sampleAlgo?: SuperSampleAlgorithm);
27
+ destroy(): void;
28
+ setSuperSampleAlgorithm(superSampleAlgorithm: SuperSampleAlgorithm): void;
29
+ getSuperSampleAlgorithm(): SuperSampleAlgorithm;
30
+ getContext(type: string, attrs?: WebGLContextAttributes): GPUCanvasContextMock;
31
+ setSize(width: number, height: number): void;
32
+ addEventListener(event: string, listener: any, options?: any): void;
33
+ removeEventListener(event: string, listener: any, options?: any): void;
34
+ dispatchEvent(event: Event): void;
35
+ setSuperSample(superSample: SuperSampleType): void;
36
+ saveToFile(filePath: string): Promise<void>;
37
+ private initComputePipeline;
38
+ private updateComputeParams;
39
+ private scheduleUpdateComputeBuffers;
40
+ private updateComputeBuffers;
41
+ private runComputeShaderSuperSampling;
42
+ private updateReadbackBuffer;
43
+ readPixelsIntoBuffer(buffer: OptimizedBuffer): Promise<void>;
44
+ }
package/index.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export * from "./WGPURenderer.js";
2
+ export * from "./ThreeRenderable.js";
3
+ export * from "./TextureUtils.js";
4
+ export * from "./canvas.js";
5
+ export * from "./SpriteUtils.js";
6
+ export * from "./SpriteResourceManager.js";
7
+ export * from "./animation/SpriteAnimator.js";
8
+ export * from "./animation/ExplodingSpriteEffect.js";
9
+ export * from "./animation/SpriteParticleGenerator.js";
10
+ export * from "./animation/PhysicsExplodingSpriteEffect.js";
11
+ export * from "./physics/RapierPhysicsAdapter.js";
12
+ export * from "./physics/PlanckPhysicsAdapter.js";
13
+ export * as THREE from "three";