@poolzin/pool-bot 2026.1.38 → 2026.2.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/assets/chrome-extension/README.md +3 -3
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +4 -4
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +3 -3
- package/dist/acp/types.js +1 -1
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/cli-runner/helpers.js +1 -1
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/cloudflare-ai-gateway.js +31 -0
- package/dist/agents/compaction.js +16 -2
- package/dist/agents/context-window-guard.js +13 -10
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +1 -1
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +12 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-selection.js +10 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -8
- package/dist/agents/pi-embedded-runner/model.js +2 -2
- package/dist/agents/pi-embedded-runner/run/attempt.js +6 -6
- package/dist/agents/pi-embedded-runner/run.js +4 -4
- package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-model-discovery.js +10 -0
- package/dist/agents/pi-tool-definition-adapter.js +50 -9
- package/dist/agents/pi-tools.before-tool-call.js +67 -0
- package/dist/agents/pi-tools.js +10 -5
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/system-prompt.js +28 -4
- package/dist/agents/together-models.js +127 -0
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.js +1 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +94 -7
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/agents/workspace.js +1 -5
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/reply/commands-context-report.js +2 -2
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +14 -4
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +4 -0
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/browser/client-fetch.js +1 -1
- package/dist/browser/config.js +1 -1
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/server-context.js +2 -2
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui.js +3 -3
- package/dist/channels/plugins/agent-tools/whatsapp-login.js +1 -17
- package/dist/channels/plugins/catalog.js +2 -2
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +1 -1
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/memory-cli.js +25 -15
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/plugins-cli.js +1 -1
- package/dist/cli/run-main.js +2 -2
- package/dist/cli/security-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/update-cli.js +4 -4
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agents.commands.add.js +1 -1
- package/dist/commands/auth-choice.apply.api-providers.js +305 -17
- package/dist/commands/auth-choice.apply.js +4 -1
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/auth-choice.apply.xai.js +63 -0
- package/dist/commands/auth-choice.preferred-provider.js +7 -1
- package/dist/commands/configure.wizard.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-state-integrity.js +2 -14
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/models/list.probe.js +2 -2
- package/dist/commands/models/list.registry.js +4 -4
- package/dist/commands/models/list.status-command.js +2 -2
- package/dist/commands/onboard-auth.config-core.js +366 -28
- package/dist/commands/onboard-auth.credentials.js +71 -9
- package/dist/commands/onboard-auth.js +3 -3
- package/dist/commands/onboard-auth.models.js +26 -24
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +140 -6
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status.command.js +1 -1
- package/dist/commands/uninstall.js +3 -3
- package/dist/compat/legacy-names.js +1 -1
- package/dist/config/io.js +3 -3
- package/dist/config/schema.js +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.js +0 -6
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/discord/monitor/message-handler.process.js +6 -4
- package/dist/gateway/client.js +0 -14
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1 -1
- package/dist/gateway/server.impl.js +2 -6
- package/dist/hooks/frontmatter.js +1 -1
- package/dist/hooks/hooks-status.js +1 -1
- package/dist/hooks/install.js +2 -2
- package/dist/hooks/loader.js +1 -1
- package/dist/hooks/workspace.js +3 -3
- package/dist/index.js +2 -2
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/tailscale.js +1 -1
- package/dist/macos/relay.js +2 -2
- package/dist/media/input-files.js +1 -1
- package/dist/media/mime.js +4 -0
- package/dist/media/png-encode.js +74 -0
- package/dist/media-understanding/providers/image.js +2 -2
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/embeddings.js +1 -1
- package/dist/memory/index.js +0 -5
- package/dist/memory/manager.js +3 -25
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +2 -2
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/update.js +1 -1
- package/dist/security/audit.js +2 -2
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/slack/monitor/message-handler/prepare.js +10 -4
- package/dist/slack/monitor/slash.js +10 -4
- package/dist/tailscale/detect.js +146 -0
- package/dist/telegram/bot-message-context.js +1 -1
- package/dist/test-helpers/workspace.js +11 -0
- package/dist/test-utils/channel-plugins.js +82 -0
- package/dist/test-utils/ports.js +73 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils.js +10 -0
- package/dist/web/qr-image.js +1 -61
- package/dist/wizard/onboarding.finalize.js +7 -7
- package/dist/wizard/onboarding.js +3 -3
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/concepts/typebox.md +1 -1
- package/docs/docs.json +1 -1
- package/docs/northflank.mdx +7 -7
- package/docs/railway.mdx +3 -3
- package/docs/render.mdx +5 -5
- package/docs/start/lore.md +2 -2
- package/extensions/bluebubbles/index.ts +2 -2
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/accounts.ts +8 -8
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +5 -5
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +16 -16
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +46 -46
- package/extensions/bluebubbles/src/monitor.ts +5 -5
- package/extensions/bluebubbles/src/onboarding.ts +7 -7
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diagnostics-otel/src/service.ts +3 -3
- package/extensions/discord/index.ts +2 -2
- package/extensions/discord/package.json +1 -1
- package/extensions/google-antigravity-auth/README.md +1 -1
- package/extensions/google-antigravity-auth/index.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/README.md +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/index.ts +3 -3
- package/extensions/googlechat/package.json +1 -1
- package/extensions/googlechat/src/accounts.ts +8 -8
- package/extensions/googlechat/src/actions.ts +6 -6
- package/extensions/googlechat/src/channel.ts +21 -21
- package/extensions/googlechat/src/monitor.ts +8 -8
- package/extensions/googlechat/src/onboarding.ts +10 -10
- package/extensions/imessage/index.ts +2 -2
- package/extensions/imessage/package.json +1 -1
- package/extensions/line/index.ts +2 -2
- package/extensions/line/package.json +1 -1
- package/extensions/line/src/card-command.ts +2 -2
- package/extensions/line/src/channel.logout.test.ts +4 -4
- package/extensions/line/src/channel.sendPayload.test.ts +8 -8
- package/extensions/line/src/channel.ts +3 -3
- package/extensions/llm-task/README.md +3 -3
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +1 -1
- package/extensions/llm-task/src/llm-task-tool.ts +4 -4
- package/extensions/lobster/README.md +6 -6
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/src/lobster-tool.test.ts +4 -4
- package/extensions/lobster/src/lobster-tool.ts +2 -2
- package/extensions/matrix/index.ts +2 -2
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
- package/extensions/matrix/src/onboarding.ts +1 -1
- package/extensions/mattermost/index.ts +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
- package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
- package/extensions/mattermost/src/onboarding.ts +2 -2
- package/extensions/memory-core/index.ts +2 -2
- package/extensions/memory-core/package.json +1 -4
- package/extensions/memory-lancedb/index.ts +3 -3
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/msteams/index.ts +2 -2
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +2 -2
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +2 -2
- package/extensions/msteams/src/onboarding.ts +9 -9
- package/extensions/msteams/src/reply-dispatcher.ts +2 -2
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +4 -4
- package/extensions/nextcloud-talk/index.ts +2 -2
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +7 -7
- package/extensions/nextcloud-talk/src/inbound.ts +7 -7
- package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
- package/extensions/nostr/README.md +2 -2
- package/extensions/nostr/index.ts +5 -5
- package/extensions/nostr/package.json +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/qwen-portal-auth/README.md +1 -1
- package/extensions/signal/index.ts +2 -2
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/index.ts +2 -2
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/index.ts +2 -2
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.ts +2 -2
- package/extensions/tlon/README.md +2 -2
- package/extensions/tlon/index.ts +2 -2
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/channel.ts +13 -13
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +3 -3
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/twitch/README.md +1 -1
- package/extensions/twitch/index.ts +2 -2
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/config.ts +3 -3
- package/extensions/twitch/src/monitor.ts +3 -3
- package/extensions/twitch/src/onboarding.ts +9 -9
- package/extensions/twitch/src/outbound.test.ts +2 -2
- package/extensions/twitch/src/plugin.test.ts +2 -2
- package/extensions/twitch/src/plugin.ts +8 -8
- package/extensions/twitch/src/send.test.ts +2 -2
- package/extensions/twitch/src/send.ts +4 -4
- package/extensions/twitch/src/token.test.ts +8 -8
- package/extensions/twitch/src/token.ts +3 -3
- package/extensions/twitch/src/twitch-client.ts +3 -3
- package/extensions/twitch/src/types.ts +3 -3
- package/extensions/twitch/src/utils/markdown.ts +1 -1
- package/extensions/voice-call/README.md +3 -3
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/core-bridge.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/whatsapp/index.ts +2 -2
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/README.md +1 -1
- package/extensions/zalo/index.ts +2 -2
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalo/src/accounts.ts +8 -8
- package/extensions/zalo/src/actions.ts +4 -4
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +18 -18
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +24 -24
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalouser/README.md +2 -2
- package/extensions/zalouser/index.ts +2 -2
- package/extensions/zalouser/package.json +1 -1
- package/extensions/zalouser/src/accounts.ts +9 -9
- package/extensions/zalouser/src/channel.ts +24 -24
- package/extensions/zalouser/src/monitor.ts +4 -4
- package/extensions/zalouser/src/onboarding.ts +28 -28
- package/package.json +13 -250
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -200
- package/README-header.png +0 -0
- package/git-hooks/pre-commit +0 -4
- package/scripts/format-staged.js +0 -148
- package/scripts/postinstall.js +0 -300
- package/scripts/setup-git-hooks.js +0 -96
- package/skills/webgpu-threejs-tsl/REFERENCE.md +0 -283
- package/skills/webgpu-threejs-tsl/SKILL.md +0 -91
- package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +0 -404
- package/skills/webgpu-threejs-tsl/docs/core-concepts.md +0 -453
- package/skills/webgpu-threejs-tsl/docs/materials.md +0 -353
- package/skills/webgpu-threejs-tsl/docs/post-processing.md +0 -434
- package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +0 -324
- package/skills/webgpu-threejs-tsl/examples/basic-setup.js +0 -87
- package/skills/webgpu-threejs-tsl/examples/custom-material.js +0 -170
- package/skills/webgpu-threejs-tsl/examples/earth-shader.js +0 -292
- package/skills/webgpu-threejs-tsl/examples/particle-system.js +0 -259
- package/skills/webgpu-threejs-tsl/examples/post-processing.js +0 -199
- package/skills/webgpu-threejs-tsl/templates/compute-shader.js +0 -305
- package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +0 -276
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: webgpu-threejs-tsl
|
|
3
|
-
description: Comprehensive guide for developing WebGPU-enabled Three.js applications using TSL (Three.js Shading Language). Covers WebGPU renderer setup, TSL syntax and node materials, compute shaders, post-processing effects, and WGSL integration. Use this skill when working with Three.js WebGPU, TSL shaders, node materials, or GPU compute in Three.js.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# WebGPU Three.js with TSL
|
|
7
|
-
|
|
8
|
-
TSL (Three.js Shading Language) is a node-based shader abstraction that lets you write GPU shaders in JavaScript instead of GLSL/WGSL strings.
|
|
9
|
-
|
|
10
|
-
## Quick Start
|
|
11
|
-
|
|
12
|
-
```javascript
|
|
13
|
-
import * as THREE from 'three/webgpu';
|
|
14
|
-
import { color, time, oscSine } from 'three/tsl';
|
|
15
|
-
|
|
16
|
-
const renderer = new THREE.WebGPURenderer();
|
|
17
|
-
await renderer.init();
|
|
18
|
-
|
|
19
|
-
const material = new THREE.MeshStandardNodeMaterial();
|
|
20
|
-
material.colorNode = color(0xff0000).mul(oscSine(time));
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Skill Contents
|
|
24
|
-
|
|
25
|
-
### Documentation
|
|
26
|
-
- `docs/core-concepts.md` - Types, operators, uniforms, control flow
|
|
27
|
-
- `docs/materials.md` - Node materials and all properties
|
|
28
|
-
- `docs/compute-shaders.md` - GPU compute with instanced arrays
|
|
29
|
-
- `docs/post-processing.md` - Built-in and custom effects
|
|
30
|
-
- `docs/wgsl-integration.md` - Custom WGSL functions
|
|
31
|
-
|
|
32
|
-
### Examples
|
|
33
|
-
- `examples/basic-setup.js` - Minimal WebGPU project
|
|
34
|
-
- `examples/custom-material.js` - Custom shader material
|
|
35
|
-
- `examples/particle-system.js` - GPU compute particles
|
|
36
|
-
- `examples/post-processing.js` - Effect pipeline
|
|
37
|
-
- `examples/earth-shader.js` - Complete Earth with atmosphere
|
|
38
|
-
|
|
39
|
-
### Templates
|
|
40
|
-
- `templates/webgpu-project.js` - Starter project template
|
|
41
|
-
- `templates/compute-shader.js` - Compute shader template
|
|
42
|
-
|
|
43
|
-
### Reference
|
|
44
|
-
- `REFERENCE.md` - Quick reference cheatsheet
|
|
45
|
-
|
|
46
|
-
## Key Concepts
|
|
47
|
-
|
|
48
|
-
### Import Pattern
|
|
49
|
-
```javascript
|
|
50
|
-
// Always use the WebGPU entry point
|
|
51
|
-
import * as THREE from 'three/webgpu';
|
|
52
|
-
import { /* TSL functions */ } from 'three/tsl';
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Node Materials
|
|
56
|
-
Replace standard material properties with TSL nodes:
|
|
57
|
-
```javascript
|
|
58
|
-
material.colorNode = texture(map); // instead of material.map
|
|
59
|
-
material.roughnessNode = float(0.5); // instead of material.roughness
|
|
60
|
-
material.positionNode = displaced; // vertex displacement
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Method Chaining
|
|
64
|
-
TSL uses method chaining for operations:
|
|
65
|
-
```javascript
|
|
66
|
-
// Instead of: sin(time * 2.0 + offset) * 0.5 + 0.5
|
|
67
|
-
time.mul(2.0).add(offset).sin().mul(0.5).add(0.5)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Custom Functions
|
|
71
|
-
Use `Fn()` for reusable shader logic:
|
|
72
|
-
```javascript
|
|
73
|
-
const fresnel = Fn(([power = 2.0]) => {
|
|
74
|
-
const nDotV = normalWorld.dot(viewDir).saturate();
|
|
75
|
-
return float(1.0).sub(nDotV).pow(power);
|
|
76
|
-
});
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## When to Use This Skill
|
|
80
|
-
|
|
81
|
-
- Setting up Three.js with WebGPU renderer
|
|
82
|
-
- Creating custom shader materials with TSL
|
|
83
|
-
- Writing GPU compute shaders
|
|
84
|
-
- Building post-processing pipelines
|
|
85
|
-
- Migrating from GLSL to TSL
|
|
86
|
-
- Implementing visual effects (particles, water, terrain, etc.)
|
|
87
|
-
|
|
88
|
-
## Resources
|
|
89
|
-
|
|
90
|
-
- [Three.js TSL Wiki](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language)
|
|
91
|
-
- [WebGPU Examples](https://github.com/mrdoob/three.js/tree/master/examples) (files prefixed with `webgpu_`)
|
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
# TSL Compute Shaders
|
|
2
|
-
|
|
3
|
-
Compute shaders run on the GPU for parallel processing of data. TSL makes them accessible through JavaScript.
|
|
4
|
-
|
|
5
|
-
## Basic Setup
|
|
6
|
-
|
|
7
|
-
```javascript
|
|
8
|
-
import * as THREE from 'three/webgpu';
|
|
9
|
-
import { Fn, instancedArray, instanceIndex, vec3 } from 'three/tsl';
|
|
10
|
-
|
|
11
|
-
// Create storage buffer
|
|
12
|
-
const count = 100000;
|
|
13
|
-
const positions = instancedArray(count, 'vec3');
|
|
14
|
-
|
|
15
|
-
// Create compute shader
|
|
16
|
-
const computeShader = Fn(() => {
|
|
17
|
-
const position = positions.element(instanceIndex);
|
|
18
|
-
position.x.addAssign(0.01);
|
|
19
|
-
})().compute(count);
|
|
20
|
-
|
|
21
|
-
// Execute
|
|
22
|
-
renderer.compute(computeShader);
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Storage Buffers
|
|
26
|
-
|
|
27
|
-
### Instanced Arrays
|
|
28
|
-
|
|
29
|
-
```javascript
|
|
30
|
-
import { instancedArray } from 'three/tsl';
|
|
31
|
-
|
|
32
|
-
// Create typed storage buffers
|
|
33
|
-
const positions = instancedArray(count, 'vec3');
|
|
34
|
-
const velocities = instancedArray(count, 'vec3');
|
|
35
|
-
const colors = instancedArray(count, 'vec4');
|
|
36
|
-
const indices = instancedArray(count, 'uint');
|
|
37
|
-
const values = instancedArray(count, 'float');
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Accessing Elements
|
|
41
|
-
|
|
42
|
-
```javascript
|
|
43
|
-
const computeShader = Fn(() => {
|
|
44
|
-
// Get element at current index
|
|
45
|
-
const position = positions.element(instanceIndex);
|
|
46
|
-
const velocity = velocities.element(instanceIndex);
|
|
47
|
-
|
|
48
|
-
// Read values
|
|
49
|
-
const x = position.x;
|
|
50
|
-
const speed = velocity.length();
|
|
51
|
-
|
|
52
|
-
// Write values
|
|
53
|
-
position.assign(vec3(0, 0, 0));
|
|
54
|
-
position.x.assign(1.0);
|
|
55
|
-
position.addAssign(velocity);
|
|
56
|
-
})().compute(count);
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Accessing Other Elements
|
|
60
|
-
|
|
61
|
-
```javascript
|
|
62
|
-
const computeShader = Fn(() => {
|
|
63
|
-
const myIndex = instanceIndex;
|
|
64
|
-
const neighborIndex = myIndex.add(1).mod(count);
|
|
65
|
-
|
|
66
|
-
const myPos = positions.element(myIndex);
|
|
67
|
-
const neighborPos = positions.element(neighborIndex);
|
|
68
|
-
|
|
69
|
-
// Calculate distance to neighbor
|
|
70
|
-
const dist = myPos.distance(neighborPos);
|
|
71
|
-
})().compute(count);
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Compute Shader Patterns
|
|
75
|
-
|
|
76
|
-
### Initialize Particles
|
|
77
|
-
|
|
78
|
-
```javascript
|
|
79
|
-
const computeInit = Fn(() => {
|
|
80
|
-
const position = positions.element(instanceIndex);
|
|
81
|
-
const velocity = velocities.element(instanceIndex);
|
|
82
|
-
|
|
83
|
-
// Random positions using hash
|
|
84
|
-
position.x.assign(hash(instanceIndex).mul(10).sub(5));
|
|
85
|
-
position.y.assign(hash(instanceIndex.add(1)).mul(10).sub(5));
|
|
86
|
-
position.z.assign(hash(instanceIndex.add(2)).mul(10).sub(5));
|
|
87
|
-
|
|
88
|
-
// Zero velocity
|
|
89
|
-
velocity.assign(vec3(0));
|
|
90
|
-
})().compute(count);
|
|
91
|
-
|
|
92
|
-
// Run once at startup
|
|
93
|
-
await renderer.computeAsync(computeInit);
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Physics Update
|
|
97
|
-
|
|
98
|
-
```javascript
|
|
99
|
-
const gravity = uniform(-9.8);
|
|
100
|
-
const deltaTimeUniform = uniform(0);
|
|
101
|
-
const groundY = uniform(0);
|
|
102
|
-
|
|
103
|
-
const computeUpdate = Fn(() => {
|
|
104
|
-
const position = positions.element(instanceIndex);
|
|
105
|
-
const velocity = velocities.element(instanceIndex);
|
|
106
|
-
const dt = deltaTimeUniform;
|
|
107
|
-
|
|
108
|
-
// Apply gravity
|
|
109
|
-
velocity.y.addAssign(gravity.mul(dt));
|
|
110
|
-
|
|
111
|
-
// Update position
|
|
112
|
-
position.addAssign(velocity.mul(dt));
|
|
113
|
-
|
|
114
|
-
// Ground collision
|
|
115
|
-
If(position.y.lessThan(groundY), () => {
|
|
116
|
-
position.y.assign(groundY);
|
|
117
|
-
velocity.y.assign(velocity.y.negate().mul(0.8)); // Bounce
|
|
118
|
-
velocity.xz.mulAssign(0.95); // Friction
|
|
119
|
-
});
|
|
120
|
-
})().compute(count);
|
|
121
|
-
|
|
122
|
-
// In animation loop
|
|
123
|
-
function animate() {
|
|
124
|
-
deltaTimeUniform.value = clock.getDelta();
|
|
125
|
-
renderer.compute(computeUpdate);
|
|
126
|
-
renderer.render(scene, camera);
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Attraction to Point
|
|
131
|
-
|
|
132
|
-
```javascript
|
|
133
|
-
const attractorPos = uniform(new THREE.Vector3(0, 0, 0));
|
|
134
|
-
const attractorStrength = uniform(1.0);
|
|
135
|
-
|
|
136
|
-
const computeAttract = Fn(() => {
|
|
137
|
-
const position = positions.element(instanceIndex);
|
|
138
|
-
const velocity = velocities.element(instanceIndex);
|
|
139
|
-
|
|
140
|
-
// Direction to attractor
|
|
141
|
-
const toAttractor = attractorPos.sub(position);
|
|
142
|
-
const distance = toAttractor.length();
|
|
143
|
-
const direction = toAttractor.normalize();
|
|
144
|
-
|
|
145
|
-
// Apply force (inverse square falloff)
|
|
146
|
-
const force = direction.mul(attractorStrength).div(distance.mul(distance).add(0.1));
|
|
147
|
-
velocity.addAssign(force.mul(deltaTimeUniform));
|
|
148
|
-
})().compute(count);
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Neighbor Interaction (Boids-like)
|
|
152
|
-
|
|
153
|
-
```javascript
|
|
154
|
-
const computeBoids = Fn(() => {
|
|
155
|
-
const myPos = positions.element(instanceIndex);
|
|
156
|
-
const myVel = velocities.element(instanceIndex);
|
|
157
|
-
|
|
158
|
-
const separation = vec3(0).toVar();
|
|
159
|
-
const alignment = vec3(0).toVar();
|
|
160
|
-
const cohesion = vec3(0).toVar();
|
|
161
|
-
const neighborCount = int(0).toVar();
|
|
162
|
-
|
|
163
|
-
// Check nearby particles
|
|
164
|
-
Loop(count, ({ i }) => {
|
|
165
|
-
If(i.notEqual(instanceIndex), () => {
|
|
166
|
-
const otherPos = positions.element(i);
|
|
167
|
-
const otherVel = velocities.element(i);
|
|
168
|
-
const dist = myPos.distance(otherPos);
|
|
169
|
-
|
|
170
|
-
If(dist.lessThan(2.0), () => {
|
|
171
|
-
// Separation
|
|
172
|
-
const diff = myPos.sub(otherPos).normalize().div(dist);
|
|
173
|
-
separation.addAssign(diff);
|
|
174
|
-
|
|
175
|
-
// Alignment
|
|
176
|
-
alignment.addAssign(otherVel);
|
|
177
|
-
|
|
178
|
-
// Cohesion
|
|
179
|
-
cohesion.addAssign(otherPos);
|
|
180
|
-
|
|
181
|
-
neighborCount.addAssign(1);
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
If(neighborCount.greaterThan(0), () => {
|
|
187
|
-
const n = neighborCount.toFloat();
|
|
188
|
-
alignment.divAssign(n);
|
|
189
|
-
cohesion.divAssign(n);
|
|
190
|
-
cohesion.assign(cohesion.sub(myPos));
|
|
191
|
-
|
|
192
|
-
myVel.addAssign(separation.mul(0.05));
|
|
193
|
-
myVel.addAssign(alignment.sub(myVel).mul(0.05));
|
|
194
|
-
myVel.addAssign(cohesion.mul(0.05));
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// Limit speed
|
|
198
|
-
const speed = myVel.length();
|
|
199
|
-
If(speed.greaterThan(2.0), () => {
|
|
200
|
-
myVel.assign(myVel.normalize().mul(2.0));
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
myPos.addAssign(myVel.mul(deltaTimeUniform));
|
|
204
|
-
})().compute(count);
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Workgroups and Synchronization
|
|
208
|
-
|
|
209
|
-
### Workgroup Size
|
|
210
|
-
|
|
211
|
-
```javascript
|
|
212
|
-
// Default workgroup size is typically 64 or 256
|
|
213
|
-
const computeShader = Fn(() => {
|
|
214
|
-
// shader code
|
|
215
|
-
})().compute(count, { workgroupSize: 64 });
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Barriers
|
|
219
|
-
|
|
220
|
-
```javascript
|
|
221
|
-
import { workgroupBarrier, storageBarrier, textureBarrier } from 'three/tsl';
|
|
222
|
-
|
|
223
|
-
const computeShader = Fn(() => {
|
|
224
|
-
// Write data
|
|
225
|
-
sharedData.element(localIndex).assign(value);
|
|
226
|
-
|
|
227
|
-
// Ensure all workgroup threads reach this point
|
|
228
|
-
workgroupBarrier();
|
|
229
|
-
|
|
230
|
-
// Now safe to read data written by other threads
|
|
231
|
-
const neighborValue = sharedData.element(localIndex.add(1));
|
|
232
|
-
})().compute(count);
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## Atomic Operations
|
|
236
|
-
|
|
237
|
-
For thread-safe read-modify-write operations:
|
|
238
|
-
|
|
239
|
-
```javascript
|
|
240
|
-
import { atomicAdd, atomicSub, atomicMax, atomicMin, atomicAnd, atomicOr, atomicXor } from 'three/tsl';
|
|
241
|
-
|
|
242
|
-
const counter = instancedArray(1, 'uint');
|
|
243
|
-
|
|
244
|
-
const computeShader = Fn(() => {
|
|
245
|
-
// Atomically increment counter
|
|
246
|
-
atomicAdd(counter.element(0), 1);
|
|
247
|
-
|
|
248
|
-
// Atomic max
|
|
249
|
-
atomicMax(maxValue.element(0), localValue);
|
|
250
|
-
})().compute(count);
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
## Using Compute Results in Materials
|
|
254
|
-
|
|
255
|
-
### Instanced Mesh with Computed Positions
|
|
256
|
-
|
|
257
|
-
```javascript
|
|
258
|
-
// Create instanced mesh
|
|
259
|
-
const geometry = new THREE.SphereGeometry(0.1, 16, 16);
|
|
260
|
-
const material = new THREE.MeshStandardNodeMaterial();
|
|
261
|
-
|
|
262
|
-
// Use computed positions
|
|
263
|
-
material.positionNode = positions.element(instanceIndex);
|
|
264
|
-
|
|
265
|
-
// Optionally use computed colors
|
|
266
|
-
material.colorNode = colors.element(instanceIndex);
|
|
267
|
-
|
|
268
|
-
const mesh = new THREE.InstancedMesh(geometry, material, count);
|
|
269
|
-
scene.add(mesh);
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
### Points with Computed Positions
|
|
273
|
-
|
|
274
|
-
```javascript
|
|
275
|
-
const geometry = new THREE.BufferGeometry();
|
|
276
|
-
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
|
|
277
|
-
|
|
278
|
-
const material = new THREE.PointsNodeMaterial();
|
|
279
|
-
material.positionNode = positions.element(instanceIndex);
|
|
280
|
-
material.colorNode = colors.element(instanceIndex);
|
|
281
|
-
material.sizeNode = float(5.0);
|
|
282
|
-
|
|
283
|
-
const points = new THREE.Points(geometry, material);
|
|
284
|
-
scene.add(points);
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
## Execution Methods
|
|
288
|
-
|
|
289
|
-
```javascript
|
|
290
|
-
// Synchronous compute (blocks until complete)
|
|
291
|
-
renderer.compute(computeShader);
|
|
292
|
-
|
|
293
|
-
// Asynchronous compute (returns promise)
|
|
294
|
-
await renderer.computeAsync(computeShader);
|
|
295
|
-
|
|
296
|
-
// Multiple computes
|
|
297
|
-
renderer.compute(computeInit);
|
|
298
|
-
renderer.compute(computePhysics);
|
|
299
|
-
renderer.compute(computeCollisions);
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
## Reading Back Data (GPU to CPU)
|
|
303
|
-
|
|
304
|
-
```javascript
|
|
305
|
-
// Create buffer for readback
|
|
306
|
-
const readBuffer = new Float32Array(count * 3);
|
|
307
|
-
|
|
308
|
-
// Read data back from GPU
|
|
309
|
-
await renderer.readRenderTargetPixelsAsync(
|
|
310
|
-
computeTexture,
|
|
311
|
-
0, 0, width, height,
|
|
312
|
-
readBuffer
|
|
313
|
-
);
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
## Complete Example: Particle System
|
|
317
|
-
|
|
318
|
-
```javascript
|
|
319
|
-
import * as THREE from 'three/webgpu';
|
|
320
|
-
import {
|
|
321
|
-
Fn, If, instancedArray, instanceIndex, uniform,
|
|
322
|
-
vec3, float, hash, time
|
|
323
|
-
} from 'three/tsl';
|
|
324
|
-
|
|
325
|
-
// Setup
|
|
326
|
-
const count = 50000;
|
|
327
|
-
const positions = instancedArray(count, 'vec3');
|
|
328
|
-
const velocities = instancedArray(count, 'vec3');
|
|
329
|
-
const lifetimes = instancedArray(count, 'float');
|
|
330
|
-
|
|
331
|
-
// Uniforms
|
|
332
|
-
const emitterPos = uniform(new THREE.Vector3(0, 0, 0));
|
|
333
|
-
const gravity = uniform(-2.0);
|
|
334
|
-
const dt = uniform(0);
|
|
335
|
-
|
|
336
|
-
// Initialize
|
|
337
|
-
const computeInit = Fn(() => {
|
|
338
|
-
const pos = positions.element(instanceIndex);
|
|
339
|
-
const vel = velocities.element(instanceIndex);
|
|
340
|
-
const life = lifetimes.element(instanceIndex);
|
|
341
|
-
|
|
342
|
-
pos.assign(emitterPos);
|
|
343
|
-
|
|
344
|
-
// Random velocity in cone
|
|
345
|
-
const angle = hash(instanceIndex).mul(Math.PI * 2);
|
|
346
|
-
const speed = hash(instanceIndex.add(1)).mul(2).add(1);
|
|
347
|
-
vel.x.assign(angle.cos().mul(speed).mul(0.3));
|
|
348
|
-
vel.y.assign(speed);
|
|
349
|
-
vel.z.assign(angle.sin().mul(speed).mul(0.3));
|
|
350
|
-
|
|
351
|
-
// Random lifetime
|
|
352
|
-
life.assign(hash(instanceIndex.add(2)).mul(2).add(1));
|
|
353
|
-
})().compute(count);
|
|
354
|
-
|
|
355
|
-
// Update
|
|
356
|
-
const computeUpdate = Fn(() => {
|
|
357
|
-
const pos = positions.element(instanceIndex);
|
|
358
|
-
const vel = velocities.element(instanceIndex);
|
|
359
|
-
const life = lifetimes.element(instanceIndex);
|
|
360
|
-
|
|
361
|
-
// Apply gravity
|
|
362
|
-
vel.y.addAssign(gravity.mul(dt));
|
|
363
|
-
|
|
364
|
-
// Update position
|
|
365
|
-
pos.addAssign(vel.mul(dt));
|
|
366
|
-
|
|
367
|
-
// Decrease lifetime
|
|
368
|
-
life.subAssign(dt);
|
|
369
|
-
|
|
370
|
-
// Respawn dead particles
|
|
371
|
-
If(life.lessThan(0), () => {
|
|
372
|
-
pos.assign(emitterPos);
|
|
373
|
-
const angle = hash(instanceIndex.add(time.mul(1000))).mul(Math.PI * 2);
|
|
374
|
-
const speed = hash(instanceIndex.add(time.mul(1000)).add(1)).mul(2).add(1);
|
|
375
|
-
vel.x.assign(angle.cos().mul(speed).mul(0.3));
|
|
376
|
-
vel.y.assign(speed);
|
|
377
|
-
vel.z.assign(angle.sin().mul(speed).mul(0.3));
|
|
378
|
-
life.assign(hash(instanceIndex.add(time.mul(1000)).add(2)).mul(2).add(1));
|
|
379
|
-
});
|
|
380
|
-
})().compute(count);
|
|
381
|
-
|
|
382
|
-
// Material
|
|
383
|
-
const material = new THREE.PointsNodeMaterial();
|
|
384
|
-
material.positionNode = positions.element(instanceIndex);
|
|
385
|
-
material.sizeNode = float(3.0);
|
|
386
|
-
material.colorNode = vec3(1, 0.5, 0.2);
|
|
387
|
-
|
|
388
|
-
// Geometry (dummy positions)
|
|
389
|
-
const geometry = new THREE.BufferGeometry();
|
|
390
|
-
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
|
|
391
|
-
|
|
392
|
-
const points = new THREE.Points(geometry, material);
|
|
393
|
-
scene.add(points);
|
|
394
|
-
|
|
395
|
-
// Init
|
|
396
|
-
await renderer.computeAsync(computeInit);
|
|
397
|
-
|
|
398
|
-
// Animation loop
|
|
399
|
-
function animate() {
|
|
400
|
-
dt.value = Math.min(clock.getDelta(), 0.1);
|
|
401
|
-
renderer.compute(computeUpdate);
|
|
402
|
-
renderer.render(scene, camera);
|
|
403
|
-
}
|
|
404
|
-
```
|