@cazala/party 0.2.1 → 0.4.0
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/README.md +55 -13
- package/dist/engine.d.ts +8 -2
- package/dist/engine.d.ts.map +1 -1
- package/dist/index.js +541 -59
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +45 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/modules/forces/boundary.d.ts.map +1 -1
- package/dist/runtimes/cpu/engine.d.ts +9 -2
- package/dist/runtimes/cpu/engine.d.ts.map +1 -1
- package/dist/runtimes/webgpu/engine.d.ts +9 -2
- package/dist/runtimes/webgpu/engine.d.ts.map +1 -1
- package/dist/runtimes/webgpu/gpu-resources.d.ts +5 -0
- package/dist/runtimes/webgpu/gpu-resources.d.ts.map +1 -1
- package/dist/runtimes/webgpu/local-query.d.ts +26 -0
- package/dist/runtimes/webgpu/local-query.d.ts.map +1 -0
- package/dist/runtimes/webgpu/particle-store.d.ts +12 -1
- package/dist/runtimes/webgpu/particle-store.d.ts.map +1 -1
- package/dist/spawner.d.ts +18 -2
- package/dist/spawner.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,8 +10,9 @@ A high-performance TypeScript particle physics engine with dual runtime support
|
|
|
10
10
|
- **Spatial Grid Optimization**: Efficient O(1) neighbor queries for collision detection
|
|
11
11
|
- **Real-time Oscillators**: Animate any module parameter with configurable frequency and bounds
|
|
12
12
|
- **Advanced Rendering**: Trails, particle instancing, line rendering with multiple color modes
|
|
13
|
-
- **
|
|
13
|
+
- **Export/Import Presets**: Export/import module settings (inputs + enabled state)
|
|
14
14
|
- **Cross-platform**: Works in all modern browsers with automatic feature detection
|
|
15
|
+
- **Spawner Utility**: Generate particle shapes, including text
|
|
15
16
|
|
|
16
17
|
## Installation
|
|
17
18
|
|
|
@@ -82,12 +83,11 @@ await engine.initialize();
|
|
|
82
83
|
// Add particles
|
|
83
84
|
for (let i = 0; i < 100; i++) {
|
|
84
85
|
engine.addParticle({
|
|
85
|
-
x: Math.random() * canvas.width,
|
|
86
|
-
y: Math.random() *
|
|
87
|
-
vx: (Math.random() - 0.5) * 4,
|
|
88
|
-
vy: (Math.random() - 0.5) * 4,
|
|
86
|
+
position: { x: Math.random() * canvas.width, y: Math.random() * canvas.height },
|
|
87
|
+
velocity: { x: (Math.random() - 0.5) * 4, y: (Math.random() - 0.5) * 4 },
|
|
89
88
|
mass: 1 + Math.random() * 2,
|
|
90
89
|
size: 3 + Math.random() * 7,
|
|
90
|
+
color: { r: 1, g: 1, b: 1, a: 1 },
|
|
91
91
|
});
|
|
92
92
|
}
|
|
93
93
|
|
|
@@ -111,8 +111,8 @@ const engine = new Engine({
|
|
|
111
111
|
constrainIterations: 50, // Constraint solver iterations
|
|
112
112
|
cellSize: 32, // Spatial grid cell size
|
|
113
113
|
maxNeighbors: 128, // Max neighbors per particle
|
|
114
|
-
maxParticles: 10000, //
|
|
115
|
-
clearColor:
|
|
114
|
+
maxParticles: 10000, // WebGPU buffer allocation + effective sim/render cap
|
|
115
|
+
clearColor: { r: 0, g: 0, b: 0, a: 1 }, // Background color
|
|
116
116
|
});
|
|
117
117
|
|
|
118
118
|
// Lifecycle
|
|
@@ -120,7 +120,7 @@ await engine.initialize();
|
|
|
120
120
|
engine.play();
|
|
121
121
|
engine.pause();
|
|
122
122
|
engine.stop();
|
|
123
|
-
engine.destroy();
|
|
123
|
+
await engine.destroy();
|
|
124
124
|
|
|
125
125
|
// State
|
|
126
126
|
const isPlaying = engine.isPlaying();
|
|
@@ -128,7 +128,13 @@ const fps = engine.getFPS();
|
|
|
128
128
|
const count = engine.getCount();
|
|
129
129
|
|
|
130
130
|
// Particles
|
|
131
|
-
engine.addParticle({
|
|
131
|
+
engine.addParticle({
|
|
132
|
+
position: { x, y },
|
|
133
|
+
velocity: { x: vx, y: vy },
|
|
134
|
+
mass,
|
|
135
|
+
size,
|
|
136
|
+
color: { r: 1, g: 1, b: 1, a: 1 },
|
|
137
|
+
});
|
|
132
138
|
engine.setParticles([...particles]);
|
|
133
139
|
const particles = await engine.getParticles();
|
|
134
140
|
engine.clear();
|
|
@@ -163,11 +169,11 @@ Particles are simple data structures with physics properties:
|
|
|
163
169
|
|
|
164
170
|
```typescript
|
|
165
171
|
const particle = {
|
|
166
|
-
x: 100, y: 100,
|
|
167
|
-
|
|
172
|
+
position: { x: 100, y: 100 }, // Position
|
|
173
|
+
velocity: { x: 1, y: -2 }, // Velocity
|
|
168
174
|
mass: 2.5, // Mass (negative = pinned)
|
|
169
175
|
size: 8, // Visual size
|
|
170
|
-
color:
|
|
176
|
+
color: { r: 1, g: 0.42, b: 0.21, a: 1 }, // Color (0..1 floats)
|
|
171
177
|
};
|
|
172
178
|
|
|
173
179
|
// Bulk operations (preferred for performance)
|
|
@@ -184,6 +190,36 @@ engine.unpinParticles([0, 1, 2]);
|
|
|
184
190
|
engine.unpinAll();
|
|
185
191
|
```
|
|
186
192
|
|
|
193
|
+
### Spawner
|
|
194
|
+
|
|
195
|
+
Generate particle arrays from common shapes (including text) using `Spawner`:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
import { Spawner } from "@cazala/party";
|
|
199
|
+
|
|
200
|
+
const spawner = new Spawner();
|
|
201
|
+
const particles = spawner.initParticles({
|
|
202
|
+
count: 5000,
|
|
203
|
+
shape: "text",
|
|
204
|
+
center: { x: 0, y: 0 },
|
|
205
|
+
position: { x: 0, y: 0 },
|
|
206
|
+
align: { horizontal: "center", vertical: "center" },
|
|
207
|
+
text: "Party",
|
|
208
|
+
font: "sans-serif",
|
|
209
|
+
textSize: 80,
|
|
210
|
+
size: 3,
|
|
211
|
+
mass: 1,
|
|
212
|
+
colors: ["#ffffff"],
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
engine.setParticles(particles);
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Notes:
|
|
219
|
+
|
|
220
|
+
- `size` controls particle radius; `textSize` is the font size used to rasterize text.
|
|
221
|
+
- Playground font options: `sans-serif`, `serif`, `monospace`.
|
|
222
|
+
|
|
187
223
|
### Modules
|
|
188
224
|
|
|
189
225
|
Modules are pluggable components that contribute to simulation or rendering:
|
|
@@ -590,7 +626,13 @@ Full TypeScript support with comprehensive type definitions:
|
|
|
590
626
|
import type { IEngine, IParticle, Module } from "@cazala/party";
|
|
591
627
|
|
|
592
628
|
const engine: IEngine = new Engine({ /* ... */ });
|
|
593
|
-
const particle: IParticle = {
|
|
629
|
+
const particle: IParticle = {
|
|
630
|
+
position: { x: 0, y: 0 },
|
|
631
|
+
velocity: { x: 1, y: 1 },
|
|
632
|
+
mass: 1,
|
|
633
|
+
size: 5,
|
|
634
|
+
color: { r: 1, g: 1, b: 1, a: 1 },
|
|
635
|
+
};
|
|
594
636
|
```
|
|
595
637
|
|
|
596
638
|
## License
|
package/dist/engine.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IEngine, IParticle } from "./interfaces";
|
|
1
|
+
import { IEngine, IParticle, GetParticlesInRadiusOptions, GetParticlesInRadiusResult } from "./interfaces";
|
|
2
2
|
import { Module } from "./module";
|
|
3
3
|
export type EngineOptions = {
|
|
4
4
|
canvas: HTMLCanvasElement;
|
|
@@ -76,9 +76,15 @@ export declare class Engine implements IEngine {
|
|
|
76
76
|
getOscillatorsElapsedSeconds(): number;
|
|
77
77
|
setOscillatorsElapsedSeconds(seconds: number): void;
|
|
78
78
|
setParticles(p: IParticle[]): void;
|
|
79
|
-
addParticle(p: IParticle):
|
|
79
|
+
addParticle(p: IParticle): number;
|
|
80
|
+
setParticle(index: number, p: IParticle): void;
|
|
81
|
+
setParticleMass(index: number, mass: number): void;
|
|
80
82
|
getParticles(): Promise<IParticle[]>;
|
|
81
83
|
getParticle(index: number): Promise<IParticle>;
|
|
84
|
+
getParticlesInRadius(center: {
|
|
85
|
+
x: number;
|
|
86
|
+
y: number;
|
|
87
|
+
}, radius: number, opts?: GetParticlesInRadiusOptions): Promise<GetParticlesInRadiusResult>;
|
|
82
88
|
pinParticles(indexes: number[]): Promise<void>;
|
|
83
89
|
unpinParticles(indexes: number[]): Promise<void>;
|
|
84
90
|
unpinAll(): Promise<void>;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|