wgpu-kit 0.9.10
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 +21 -0
- package/README.md +96 -0
- package/README.zh-CN.md +99 -0
- package/dist/core/buffer.d.ts +21 -0
- package/dist/core/context.d.ts +15 -0
- package/dist/core/errors.d.ts +20 -0
- package/dist/core/kernel.d.ts +52 -0
- package/dist/core/layout.d.ts +32 -0
- package/dist/core/pingpong.d.ts +24 -0
- package/dist/core/raw.d.ts +9 -0
- package/dist/fields.js +585 -0
- package/dist/image.js +318 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +484 -0
- package/dist/interop/three.d.ts +37 -0
- package/dist/life.js +1407 -0
- package/dist/media.d.ts +22 -0
- package/dist/packs/fields/index.d.ts +27 -0
- package/dist/packs/image/index.d.ts +32 -0
- package/dist/packs/life/boids.d.ts +28 -0
- package/dist/packs/life/index.d.ts +9 -0
- package/dist/packs/life/map.d.ts +20 -0
- package/dist/packs/life/physarum.d.ts +28 -0
- package/dist/packs/life/tentacles.d.ts +29 -0
- package/dist/packs/life/turing.d.ts +40 -0
- package/dist/packs/particles/config.d.ts +47 -0
- package/dist/packs/particles/grid.d.ts +25 -0
- package/dist/packs/particles/index.d.ts +51 -0
- package/dist/packs/particles/presets.d.ts +25 -0
- package/dist/packs/particles/render.d.ts +20 -0
- package/dist/packs/particles/wgsl.d.ts +13 -0
- package/dist/particles.js +1245 -0
- package/dist/react/index.d.ts +18 -0
- package/dist/react.js +1289 -0
- package/dist/three.js +33 -0
- package/dist/vite.d.ts +38 -0
- package/dist/vite.js +30 -0
- package/package.json +93 -0
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CanvasRecorder:零依赖的画布录制(MediaRecorder 封装)。
|
|
3
|
+
* 容器协商:mp4(h264)→ webm(vp9)→ webm,按浏览器能力自动选择。
|
|
4
|
+
* "用户替你生产传播素材"的飞轮从这里开始。
|
|
5
|
+
*/
|
|
6
|
+
export interface RecordingResult {
|
|
7
|
+
blob: Blob;
|
|
8
|
+
mimeType: string;
|
|
9
|
+
seconds: number;
|
|
10
|
+
bytes: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function pickMime(): string | null;
|
|
13
|
+
export declare class CanvasRecorder {
|
|
14
|
+
#private;
|
|
15
|
+
constructor();
|
|
16
|
+
get mimeType(): string;
|
|
17
|
+
get recording(): boolean;
|
|
18
|
+
start(canvas: HTMLCanvasElement, videoBitsPerSecond?: number): void;
|
|
19
|
+
stop(): Promise<RecordingResult>;
|
|
20
|
+
}
|
|
21
|
+
/** 触发浏览器下载(录完即得的最后一公里) */
|
|
22
|
+
export declare function downloadBlob(blob: Blob, filename: string): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Colormap } from '../life/map.ts';
|
|
2
|
+
/**
|
|
3
|
+
* fields 包:向量场平迹(flow)。粒子被解析向量场平流,沉积到带衰减的信息素图上,
|
|
4
|
+
* 流线自会浮现——数据可视化里"风场/流场"的标准画法。
|
|
5
|
+
* 复用 life/physarum 的沉积-扩散-上屏管线,把"三触须感知"换成"场采样"。
|
|
6
|
+
*/
|
|
7
|
+
export type FieldKind = 'vortex' | 'curl' | 'twin';
|
|
8
|
+
export interface FlowConfig {
|
|
9
|
+
count?: number;
|
|
10
|
+
mapSize?: number;
|
|
11
|
+
field?: FieldKind;
|
|
12
|
+
speed?: number;
|
|
13
|
+
decay?: number;
|
|
14
|
+
deposit?: number;
|
|
15
|
+
seed?: string | number;
|
|
16
|
+
colormap?: Colormap;
|
|
17
|
+
}
|
|
18
|
+
export interface FlowSim {
|
|
19
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
20
|
+
tick(): void;
|
|
21
|
+
stats(): {
|
|
22
|
+
fps: number;
|
|
23
|
+
};
|
|
24
|
+
sampleTrail(): Promise<Float32Array>;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function flow(config?: FlowConfig): Promise<FlowSim>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* image 包:GPU 图像滤镜管线。source(WebGPU 纹理)→ 逐算子 ping-pong → 目标 canvas。
|
|
3
|
+
* 当初 Phase 0 推迟的卷积 spike 在这里正式落地。
|
|
4
|
+
*/
|
|
5
|
+
export type ImageOp = {
|
|
6
|
+
op: 'grayscale';
|
|
7
|
+
} | {
|
|
8
|
+
op: 'invert';
|
|
9
|
+
} | {
|
|
10
|
+
op: 'edge';
|
|
11
|
+
amount?: number;
|
|
12
|
+
} | {
|
|
13
|
+
op: 'blur';
|
|
14
|
+
radius?: number;
|
|
15
|
+
} | {
|
|
16
|
+
op: 'sharpen';
|
|
17
|
+
amount?: number;
|
|
18
|
+
} | {
|
|
19
|
+
op: 'brightness';
|
|
20
|
+
value: number;
|
|
21
|
+
} | {
|
|
22
|
+
op: 'contrast';
|
|
23
|
+
value: number;
|
|
24
|
+
};
|
|
25
|
+
export interface ApplyImageResult {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
passes: number;
|
|
29
|
+
/** GPU 直读结果像素(RGBA,每行按 256B 对齐;headless 里 drawImage 会拿到空帧,断言必须走这里) */
|
|
30
|
+
readback(): Promise<Uint8Array>;
|
|
31
|
+
}
|
|
32
|
+
export declare function applyImage(source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, target: HTMLCanvasElement, ops: ImageOp[]): Promise<ApplyImageResult>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Buffer } from '../../core/buffer.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Boids 鸟群:分离/对齐/聚集三条规则(Reynolds 1986),十万级个体靠 grid 邻域加速。
|
|
4
|
+
* 渲染为按速度方向旋转的三角,速度映射颜色。
|
|
5
|
+
*/
|
|
6
|
+
export interface BoidsConfig {
|
|
7
|
+
count?: number;
|
|
8
|
+
perception?: number;
|
|
9
|
+
maxSpeed?: number;
|
|
10
|
+
wSep?: number;
|
|
11
|
+
wAli?: number;
|
|
12
|
+
wCoh?: number;
|
|
13
|
+
size?: number;
|
|
14
|
+
seed?: string | number;
|
|
15
|
+
}
|
|
16
|
+
export interface BoidsSim {
|
|
17
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
18
|
+
tick(): void;
|
|
19
|
+
stats(): {
|
|
20
|
+
fps: number;
|
|
21
|
+
};
|
|
22
|
+
buffers(): {
|
|
23
|
+
pos: Buffer;
|
|
24
|
+
vel: Buffer;
|
|
25
|
+
};
|
|
26
|
+
destroy(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function boids(config?: BoidsConfig): Promise<BoidsSim>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* life 包 —— 人工生命合集。每个模拟都是"简单规则 → 涌现复杂",
|
|
3
|
+
* 引擎与渲染管线与 particles 包同源,每个模拟都是一条可发布的视频素材。
|
|
4
|
+
*/
|
|
5
|
+
export { turing, type TuringSim, type TuringConfig, type TuringPreset } from './turing.ts';
|
|
6
|
+
export { physarum, type PhysarumSim, type PhysarumConfig } from './physarum.ts';
|
|
7
|
+
export { boids, type BoidsSim, type BoidsConfig } from './boids.ts';
|
|
8
|
+
export { tentacles, type TentaclesSim, type TentaclesConfig } from './tentacles.ts';
|
|
9
|
+
export type { Colormap } from './map.ts';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Buffer } from '../../core/buffer.ts';
|
|
2
|
+
/**
|
|
3
|
+
* MapRenderer:把一张 f32 浓度图(storage buffer,W×H)画到全屏。
|
|
4
|
+
* life 包三个模拟(图灵/粘菌/流场)共用的"浓度图上屏"组件。
|
|
5
|
+
* colormap 在 wgsl 里按名字生成;maxV 做线性归一,gamma 提对比。
|
|
6
|
+
*/
|
|
7
|
+
export type Colormap = 'amber' | 'ice' | 'duotone' | 'mono';
|
|
8
|
+
export declare function mapFragment(colormap: Colormap): string;
|
|
9
|
+
export declare class MapRenderer {
|
|
10
|
+
#private;
|
|
11
|
+
private constructor();
|
|
12
|
+
static create(canvas: HTMLCanvasElement, opts: {
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
maxV: number;
|
|
16
|
+
gamma?: number;
|
|
17
|
+
colormap: Colormap;
|
|
18
|
+
}): Promise<MapRenderer>;
|
|
19
|
+
render(map: Buffer): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 粘菌(Physarum):每个智能体三触须感知信息素、转向、前进、沉积;
|
|
3
|
+
* 信息素每帧扩散+衰减。没有任何"网络"的设定,河流/菌丝网络自会长出来。
|
|
4
|
+
*/
|
|
5
|
+
export interface PhysarumConfig {
|
|
6
|
+
/** 智能体数,默认 100,000 */
|
|
7
|
+
agents?: number;
|
|
8
|
+
/** 信息素图边长(正方形),默认 1024 */
|
|
9
|
+
mapSize?: number;
|
|
10
|
+
sensorAngle?: number;
|
|
11
|
+
sensorDist?: number;
|
|
12
|
+
turnAngle?: number;
|
|
13
|
+
step?: number;
|
|
14
|
+
decay?: number;
|
|
15
|
+
seed?: string | number;
|
|
16
|
+
colormap?: 'amber' | 'ice' | 'duotone' | 'mono';
|
|
17
|
+
}
|
|
18
|
+
export interface PhysarumSim {
|
|
19
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
20
|
+
tick(): void;
|
|
21
|
+
stats(): {
|
|
22
|
+
fps: number;
|
|
23
|
+
};
|
|
24
|
+
/** 读回信息素图(验证用;1M 纹素,别每帧调) */
|
|
25
|
+
sampleTrail(): Promise<Float32Array>;
|
|
26
|
+
destroy(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function physarum(config?: PhysarumConfig): Promise<PhysarumSim>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Buffer } from '../../core/buffer.ts';
|
|
2
|
+
/**
|
|
3
|
+
* 软体触手:Verlet 链。锚点沿利萨茹轨迹游动,链身靠"跟随约束"松弛,
|
|
4
|
+
* 重力 + 阻尼让触手甩出水母般的漂移感。
|
|
5
|
+
* 约束求解必须 ping-pong(读一侧写另一侧):原地读写会让相邻节点的
|
|
6
|
+
* 数据竞争沿链传播,实测残差放大 10 倍以上——这是本模拟的核心教训。
|
|
7
|
+
*/
|
|
8
|
+
export interface TentaclesConfig {
|
|
9
|
+
chains?: number;
|
|
10
|
+
segments?: number;
|
|
11
|
+
segLen?: number;
|
|
12
|
+
gravity?: number;
|
|
13
|
+
damping?: number;
|
|
14
|
+
iterations?: number;
|
|
15
|
+
thickness?: number;
|
|
16
|
+
colorCycle?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TentaclesSim {
|
|
19
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
20
|
+
tick(): void;
|
|
21
|
+
stats(): {
|
|
22
|
+
fps: number;
|
|
23
|
+
};
|
|
24
|
+
buffers(): {
|
|
25
|
+
pos: Buffer;
|
|
26
|
+
};
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function tentacles(config?: TentaclesConfig): Promise<TentaclesSim>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 图灵斑图(Gray-Scott 反应扩散):两种化学物质的反应 + 扩散,
|
|
3
|
+
* 自发长出珊瑚/细胞/斑纹——"复杂来自简单规则"的教科书案例。
|
|
4
|
+
* state 每纹素 vec2f(A, B);每帧多个迭代步让花纹快速演化。
|
|
5
|
+
*/
|
|
6
|
+
export interface TuringConfig {
|
|
7
|
+
/** 网格宽高(正方形),默认 512 */
|
|
8
|
+
size?: number;
|
|
9
|
+
/** 预设参数:coral 珊瑚 / mitosis 分裂 / spots 斑点 / waves 波纹 / custom */
|
|
10
|
+
preset?: TuringPreset;
|
|
11
|
+
/** 自定义 feed(0.01..0.08),preset 为 custom 时生效 */
|
|
12
|
+
feed?: number;
|
|
13
|
+
/** 自定义 kill(0.03..0.07) */
|
|
14
|
+
kill?: number;
|
|
15
|
+
/** 每帧迭代步数,默认 12 */
|
|
16
|
+
steps?: number;
|
|
17
|
+
seed?: string | number;
|
|
18
|
+
colormap?: 'duotone' | 'amber' | 'ice' | 'mono';
|
|
19
|
+
}
|
|
20
|
+
export type TuringPreset = 'coral' | 'mitosis' | 'spots' | 'waves' | 'custom';
|
|
21
|
+
export interface TuringSim {
|
|
22
|
+
readonly config: {
|
|
23
|
+
size: number;
|
|
24
|
+
preset: TuringPreset;
|
|
25
|
+
feed: number;
|
|
26
|
+
kill: number;
|
|
27
|
+
steps: number;
|
|
28
|
+
};
|
|
29
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
30
|
+
tick(): void;
|
|
31
|
+
/** 喂入扰动:在随机位置撒一把 B(交互/救场用) */
|
|
32
|
+
sprinkle(count?: number): void;
|
|
33
|
+
stats(): {
|
|
34
|
+
fps: number;
|
|
35
|
+
};
|
|
36
|
+
/** 读回 B 通道缩略采样(验证/分析用) */
|
|
37
|
+
sampleB(): Promise<Float32Array>;
|
|
38
|
+
destroy(): void;
|
|
39
|
+
}
|
|
40
|
+
export declare function turing(config?: TuringConfig): Promise<TuringSim>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ForceMatrix, type ForcePresetName } from './presets.ts';
|
|
2
|
+
/** 粒子模拟的邻域算法路径(基准对比见 validation/05) */
|
|
3
|
+
export type SimMode = 'n2' | 'tiled' | 'grid';
|
|
4
|
+
export interface ParticlesConfig {
|
|
5
|
+
/** 粒子数(默认 8192;n2 模式建议 ≤ 20000) */
|
|
6
|
+
count?: number;
|
|
7
|
+
/** 力矩阵:预设名('cells'|'snakes'|'orbitals'|'viruses'|'random')或自定义 16 元数组 */
|
|
8
|
+
forces?: ForcePresetName | 'random' | ForceMatrix;
|
|
9
|
+
/** 邻域算法:'n2' | 'tiled'(默认)| 'grid' */
|
|
10
|
+
mode?: SimMode;
|
|
11
|
+
/** 着色:'species'(默认)| 'velocity' */
|
|
12
|
+
color?: 'species' | 'velocity';
|
|
13
|
+
/** 边界:'wrap'(默认)| 'clamp' */
|
|
14
|
+
bounds?: 'wrap' | 'clamp';
|
|
15
|
+
/** 种子(字符串或数字),决定初始分布与 random 矩阵 */
|
|
16
|
+
seed?: string | number;
|
|
17
|
+
/** 物理参数(全部可选,有默认值) */
|
|
18
|
+
rMax?: number;
|
|
19
|
+
beta?: number;
|
|
20
|
+
forceFactor?: number;
|
|
21
|
+
frictionHalfLife?: number;
|
|
22
|
+
dt?: number;
|
|
23
|
+
/** 点大小(canvas 像素单位的比例,默认 0.004;大规模下自动缩小) */
|
|
24
|
+
pointSize?: number;
|
|
25
|
+
/** 每粒子邻域候选上限(grid 模式;仅作极端抱团的保险丝,默认 32768 在支持密度内不触发——按格子顺序截断会引入方向偏差伪影) */
|
|
26
|
+
maxNeighbors?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface ResolvedConfig {
|
|
29
|
+
count: number;
|
|
30
|
+
forces: ForceMatrix;
|
|
31
|
+
forcesName: string;
|
|
32
|
+
mode: SimMode;
|
|
33
|
+
color: 'species' | 'velocity';
|
|
34
|
+
bounds: 'wrap' | 'clamp';
|
|
35
|
+
seed: string;
|
|
36
|
+
seedHash: number;
|
|
37
|
+
rMax: number;
|
|
38
|
+
beta: number;
|
|
39
|
+
forceFactor: number;
|
|
40
|
+
friction: number;
|
|
41
|
+
dt: number;
|
|
42
|
+
pointSize: number;
|
|
43
|
+
maxNeighbors: number;
|
|
44
|
+
}
|
|
45
|
+
export declare function resolveConfig(config?: ParticlesConfig): ResolvedConfig;
|
|
46
|
+
export type { ForceMatrix, ForcePresetName };
|
|
47
|
+
export { FORCE_PRESETS, mulberry32, hashSeed, randomMatrix, resolveMatrix } from './presets.ts';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grid 模式(spatial hash / counting sort)的四个 kernel。
|
|
3
|
+
* 每帧在同一个 command encoder 里跑四遍:
|
|
4
|
+
* ① counts 原子计数每格粒子数
|
|
5
|
+
* ② scan 单 workgroup 分块前缀和(cellStart/cellFill),顺带把 cellCount 归零给下一帧
|
|
6
|
+
* ③ scatter 按格散射出有序索引表 order
|
|
7
|
+
* ④ force 与 tiled 相同的力计算,但邻域遍历改为 3×3 个 cell 的有序区间
|
|
8
|
+
* 相比 O(N²),复杂度 ≈ O(N · 邻域密度)——10 万粒子的大门。
|
|
9
|
+
*/
|
|
10
|
+
export declare const GRID_WORKGROUP = 64;
|
|
11
|
+
export declare const SCAN_WORKGROUP = 256;
|
|
12
|
+
/** cellOf:世界坐标 → 格子索引(世界固定 [-worldHalf, worldHalf],格宽 = 2*worldHalf/gridSize) */
|
|
13
|
+
export declare const CELL_OF = "\nfn cellOf(p: vec2f) -> u32 {\n let g = i32(params.gridSize);\n let span = params.worldHalf * 2.0;\n let cx = clamp(i32(floor((p.x + params.worldHalf) / span * f32(g))), 0, g - 1);\n let cy = clamp(i32(floor((p.y + params.worldHalf) / span * f32(g))), 0, g - 1);\n return u32(cy) * params.gridSize + u32(cx);\n}\n";
|
|
14
|
+
export declare function gridCountsWgsl(): string;
|
|
15
|
+
export declare function gridScanWgsl(): string;
|
|
16
|
+
export declare function gridScatterWgsl(): string;
|
|
17
|
+
/**
|
|
18
|
+
* grid 力核:拆成两趟以消除负载不均(v0.9.7 黑屏级卡顿的根治)。
|
|
19
|
+
* 抱团时单格可能挤几千粒子,"一个线程扫 9 格"会让重格子线程拖死整批;
|
|
20
|
+
* 拆成 (粒子 × 格子) 一线程后工作量均分,物理结果与单趟完全一致(仅求和顺序不同)。
|
|
21
|
+
* ① main_force_cell:线程 = (粒子 i × 邻域格 c),把该格贡献写入 partial[i*9+c]
|
|
22
|
+
* ② main_force_integrate:线程 = 粒子,汇总 9 份贡献并积分
|
|
23
|
+
* 同格候选数上限 maxCand(由 JS 侧传 maxNeighbors/9)仍是极端抱团的保险丝。
|
|
24
|
+
*/
|
|
25
|
+
export declare function gridForceWgsl(speciesCount: number): string;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Buffer } from '../../core/buffer.ts';
|
|
2
|
+
import { type ParticlesConfig, type ResolvedConfig } from './config.ts';
|
|
3
|
+
import { type ForceMatrix, type ForcePresetName } from './presets.ts';
|
|
4
|
+
/**
|
|
5
|
+
* particles(config) —— 粒子领域包(5 分钟出活的 Layer 2)。
|
|
6
|
+
*
|
|
7
|
+
* const sim = await particles({ count: 100_000, forces: 'cells' });
|
|
8
|
+
* await sim.attach(canvas);
|
|
9
|
+
* function frame() { sim.tick(); requestAnimationFrame(frame); }
|
|
10
|
+
*/
|
|
11
|
+
export interface ParticlesSim {
|
|
12
|
+
readonly config: ResolvedConfig;
|
|
13
|
+
/** 配置渲染目标;只调一次(tick 之前或之后均可) */
|
|
14
|
+
attach(canvas: HTMLCanvasElement): Promise<void>;
|
|
15
|
+
/** 推进一帧;dtMultiplier 便于暂停(0)/慢放(<1)/快放(>1) */
|
|
16
|
+
tick(dtMultiplier?: number): void;
|
|
17
|
+
/** 热更新力矩阵(预设名或自定义) */
|
|
18
|
+
setForces(forces: ForcePresetName | 'random' | ForceMatrix): void;
|
|
19
|
+
/** 热更新物理参数(rMax 变化会触发 grid 重建) */
|
|
20
|
+
setParams(params: {
|
|
21
|
+
rMax?: number;
|
|
22
|
+
beta?: number;
|
|
23
|
+
forceFactor?: number;
|
|
24
|
+
frictionHalfLife?: number;
|
|
25
|
+
dt?: number;
|
|
26
|
+
}): void;
|
|
27
|
+
/** 可序列化的当前配置(URL 分享用) */
|
|
28
|
+
snapshot(): string;
|
|
29
|
+
/** 运行统计(500ms 窗口的 fps;playground/harness 直接读) */
|
|
30
|
+
stats(): {
|
|
31
|
+
fps: number;
|
|
32
|
+
gpuErrors: number;
|
|
33
|
+
};
|
|
34
|
+
/** 调试:grid 模式内部缓冲(仅诊断用) */
|
|
35
|
+
debugGrid?(): {
|
|
36
|
+
partial: Buffer;
|
|
37
|
+
start: Buffer;
|
|
38
|
+
fill: Buffer;
|
|
39
|
+
sortedPos: Buffer;
|
|
40
|
+
sortedSp: Buffer;
|
|
41
|
+
order: Buffer;
|
|
42
|
+
};
|
|
43
|
+
/** 当前帧数据(interop/three 用) */
|
|
44
|
+
buffers(): {
|
|
45
|
+
pos: Buffer;
|
|
46
|
+
vel: Buffer;
|
|
47
|
+
species: Buffer;
|
|
48
|
+
};
|
|
49
|
+
destroy(): void;
|
|
50
|
+
}
|
|
51
|
+
export declare function particles(config?: ParticlesConfig): Promise<ParticlesSim>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** 粒子包的字段布局(species 独立成 u32 缓冲,方便按需着色) */
|
|
2
|
+
export declare const PARTICLE_FIELDS: {
|
|
3
|
+
readonly pos: "vec2f";
|
|
4
|
+
readonly vel: "vec2f";
|
|
5
|
+
readonly species: "u32";
|
|
6
|
+
};
|
|
7
|
+
export type ForceMatrix = readonly [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number];
|
|
8
|
+
/** 精选力矩阵(4×4,行=施加者,列=承受者;正值吸引)。调参原则:对角 0,正负平衡。 */
|
|
9
|
+
export declare const FORCE_PRESETS: {
|
|
10
|
+
/** 经典细胞:小团簇 + 缓慢迁移(spike 验证过的矩阵) */
|
|
11
|
+
readonly cells: ForceMatrix;
|
|
12
|
+
/** 蛇形:链状结构与游动 */
|
|
13
|
+
readonly snakes: ForceMatrix;
|
|
14
|
+
/** 轨道:环带与漩涡感 */
|
|
15
|
+
readonly orbitals: ForceMatrix;
|
|
16
|
+
/** 病毒:捕食结构,红吃绿 */
|
|
17
|
+
readonly viruses: ForceMatrix;
|
|
18
|
+
};
|
|
19
|
+
export type ForcePresetName = keyof typeof FORCE_PRESETS;
|
|
20
|
+
/** mulberry32:种子可复现(seed 支持字符串散列,URL 分享友好) */
|
|
21
|
+
export declare function mulberry32(seed: number): () => number;
|
|
22
|
+
export declare function hashSeed(seed: string): number;
|
|
23
|
+
/** 随机力矩阵(从种子生成,保证可复现) */
|
|
24
|
+
export declare function randomMatrix(seed: number): ForceMatrix;
|
|
25
|
+
export declare function resolveMatrix(forces: ForcePresetName | 'random' | ForceMatrix, seed: number): ForceMatrix;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Buffer } from '../../core/buffer.ts';
|
|
2
|
+
/**
|
|
3
|
+
* 粒子渲染器:instanced quad + storage 只读直通(compute 产物零拷贝进 vertex 阶段)。
|
|
4
|
+
* 属于粒子包内部实现(不进 core);等第二、第三个包出现同类需求再考虑上提。
|
|
5
|
+
*/
|
|
6
|
+
export declare class ParticlesRenderer {
|
|
7
|
+
#private;
|
|
8
|
+
private constructor();
|
|
9
|
+
static create(canvas: HTMLCanvasElement, opts: {
|
|
10
|
+
count: number;
|
|
11
|
+
species: Buffer;
|
|
12
|
+
vel?: Buffer;
|
|
13
|
+
color: 'species' | 'velocity';
|
|
14
|
+
pointSize: number;
|
|
15
|
+
worldHalf: number;
|
|
16
|
+
}): Promise<ParticlesRenderer>;
|
|
17
|
+
/** 渲染一帧(pos 来自 PingPong 当前侧;可传入覆盖数量) */
|
|
18
|
+
render(pos: Buffer, vel?: Buffer | null, count?: number): void;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 粒子模拟 WGSL 生成器。
|
|
3
|
+
* mode 是"路径对比驱动设计"的落点:
|
|
4
|
+
* - n2 每线程全量扫一遍:最简单,≤2 万粒子
|
|
5
|
+
* - tiled workgroup 共享内存分块加载:全局读取减少 64×,数万粒子(S3 基准)
|
|
6
|
+
* - grid spatial hash 两遍:10 万+(S4)
|
|
7
|
+
*/
|
|
8
|
+
export declare const WORKGROUP = 64;
|
|
9
|
+
export declare function simWgsl(mode: 'n2' | 'tiled', speciesCount: number): string;
|
|
10
|
+
/** tiled 模式的 workgroup 共享内存声明 */
|
|
11
|
+
export declare const TILE_DECLS = "\nvar<workgroup> tilePos: array<vec2f, 64>;\nvar<workgroup> tileSp: array<u32, 64>;\n";
|
|
12
|
+
/** 渲染着色器:instanced quad + storage 只读直通(spike 验证的形态) */
|
|
13
|
+
export declare function renderWgsl(speciesCount: number, colorMode: 'species' | 'velocity', pointSize: number): string;
|