create-xani-agentic-app 1.0.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 +237 -0
- package/index.js +219 -0
- package/package.json +46 -0
- package/template/.agents/skills/ai-sdk/SKILL.md +78 -0
- package/template/.agents/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/template/.agents/skills/ai-sdk/references/common-errors.md +443 -0
- package/template/.agents/skills/ai-sdk/references/devtools.md +52 -0
- package/template/.agents/skills/ai-sdk/references/type-safe-agents.md +204 -0
- package/template/.agents/skills/better-auth-best-practices/SKILL.md +175 -0
- package/template/.agents/skills/checkpoint/SKILL.md +82 -0
- package/template/.agents/skills/create-spec/SKILL.md +132 -0
- package/template/.agents/skills/create-spec/references/action-required-template.md +53 -0
- package/template/.agents/skills/create-spec/references/readme-template.md +53 -0
- package/template/.agents/skills/create-spec/references/requirements-template.md +54 -0
- package/template/.agents/skills/create-spec/references/task-template.md +79 -0
- package/template/.agents/skills/find-skills/SKILL.md +142 -0
- package/template/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/template/.agents/skills/frontend-design/SKILL.md +42 -0
- package/template/.agents/skills/implement-feature/SKILL.md +189 -0
- package/template/.agents/skills/implement-feature/references/coder-prompt-template.md +46 -0
- package/template/.agents/skills/implement-feature/references/fix-prompt-template.md +38 -0
- package/template/.agents/skills/implement-feature/references/review-prompt-template.md +50 -0
- package/template/.agents/skills/mcp-builder/LICENSE.txt +202 -0
- package/template/.agents/skills/mcp-builder/SKILL.md +236 -0
- package/template/.agents/skills/mcp-builder/reference/evaluation.md +602 -0
- package/template/.agents/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/template/.agents/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/template/.agents/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/template/.agents/skills/mcp-builder/scripts/connections.py +151 -0
- package/template/.agents/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/template/.agents/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/template/.agents/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/template/.agents/skills/nextjs/SKILL.md +434 -0
- package/template/.agents/skills/nextjs/overlay.yaml +284 -0
- package/template/.agents/skills/nextjs/references/app-router-files.md +94 -0
- package/template/.agents/skills/nextjs/references/async-patterns.md +87 -0
- package/template/.agents/skills/nextjs/references/bundling.md +180 -0
- package/template/.agents/skills/nextjs/references/data-patterns.md +297 -0
- package/template/.agents/skills/nextjs/references/debug-tricks.md +105 -0
- package/template/.agents/skills/nextjs/references/directives.md +73 -0
- package/template/.agents/skills/nextjs/references/error-handling.md +227 -0
- package/template/.agents/skills/nextjs/references/file-conventions.md +140 -0
- package/template/.agents/skills/nextjs/references/font.md +245 -0
- package/template/.agents/skills/nextjs/references/functions.md +108 -0
- package/template/.agents/skills/nextjs/references/hydration-error.md +91 -0
- package/template/.agents/skills/nextjs/references/image.md +173 -0
- package/template/.agents/skills/nextjs/references/metadata.md +301 -0
- package/template/.agents/skills/nextjs/references/parallel-routes.md +287 -0
- package/template/.agents/skills/nextjs/references/route-handlers.md +146 -0
- package/template/.agents/skills/nextjs/references/rsc-boundaries.md +159 -0
- package/template/.agents/skills/nextjs/references/runtime-selection.md +39 -0
- package/template/.agents/skills/nextjs/references/scripts.md +141 -0
- package/template/.agents/skills/nextjs/references/self-hosting.md +371 -0
- package/template/.agents/skills/nextjs/references/suspense-boundaries.md +67 -0
- package/template/.agents/skills/nextjs/upstream/SKILL.md +153 -0
- package/template/.agents/skills/nextjs/upstream/references/app-router-files.md +94 -0
- package/template/.agents/skills/nextjs/upstream/references/async-patterns.md +87 -0
- package/template/.agents/skills/nextjs/upstream/references/bundling.md +180 -0
- package/template/.agents/skills/nextjs/upstream/references/data-patterns.md +297 -0
- package/template/.agents/skills/nextjs/upstream/references/debug-tricks.md +105 -0
- package/template/.agents/skills/nextjs/upstream/references/directives.md +73 -0
- package/template/.agents/skills/nextjs/upstream/references/error-handling.md +227 -0
- package/template/.agents/skills/nextjs/upstream/references/file-conventions.md +140 -0
- package/template/.agents/skills/nextjs/upstream/references/font.md +245 -0
- package/template/.agents/skills/nextjs/upstream/references/functions.md +108 -0
- package/template/.agents/skills/nextjs/upstream/references/hydration-error.md +91 -0
- package/template/.agents/skills/nextjs/upstream/references/image.md +173 -0
- package/template/.agents/skills/nextjs/upstream/references/metadata.md +301 -0
- package/template/.agents/skills/nextjs/upstream/references/parallel-routes.md +287 -0
- package/template/.agents/skills/nextjs/upstream/references/route-handlers.md +146 -0
- package/template/.agents/skills/nextjs/upstream/references/rsc-boundaries.md +159 -0
- package/template/.agents/skills/nextjs/upstream/references/runtime-selection.md +39 -0
- package/template/.agents/skills/nextjs/upstream/references/scripts.md +141 -0
- package/template/.agents/skills/nextjs/upstream/references/self-hosting.md +371 -0
- package/template/.agents/skills/nextjs/upstream/references/suspense-boundaries.md +67 -0
- package/template/.agents/skills/playwright-cli/SKILL.md +344 -0
- package/template/.agents/skills/playwright-cli/references/element-attributes.md +23 -0
- package/template/.agents/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/template/.agents/skills/playwright-cli/references/request-mocking.md +87 -0
- package/template/.agents/skills/playwright-cli/references/running-code.md +231 -0
- package/template/.agents/skills/playwright-cli/references/session-management.md +169 -0
- package/template/.agents/skills/playwright-cli/references/storage-state.md +275 -0
- package/template/.agents/skills/playwright-cli/references/test-generation.md +88 -0
- package/template/.agents/skills/playwright-cli/references/tracing.md +139 -0
- package/template/.agents/skills/playwright-cli/references/video-recording.md +143 -0
- package/template/.agents/skills/review-pr/SKILL.md +97 -0
- package/template/.agents/skills/security-scanner/SKILL.md +157 -0
- package/template/.agents/skills/security-scanner/references/A01-broken-access-control.md +136 -0
- package/template/.agents/skills/security-scanner/references/A02-security-misconfiguration.md +130 -0
- package/template/.agents/skills/security-scanner/references/A03-software-supply-chain-failures.md +117 -0
- package/template/.agents/skills/security-scanner/references/A04-cryptographic-failures.md +141 -0
- package/template/.agents/skills/security-scanner/references/A05-injection.md +155 -0
- package/template/.agents/skills/security-scanner/references/A06-insecure-design.md +145 -0
- package/template/.agents/skills/security-scanner/references/A07-authentication-failures.md +150 -0
- package/template/.agents/skills/security-scanner/references/A08-software-data-integrity-failures.md +132 -0
- package/template/.agents/skills/security-scanner/references/A09-security-logging-alerting-failures.md +130 -0
- package/template/.agents/skills/security-scanner/references/A10-mishandling-exceptional-conditions.md +154 -0
- package/template/.agents/skills/security-scanner/references/report-template.md +148 -0
- package/template/.agents/skills/shadcn/SKILL.md +246 -0
- package/template/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/template/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/shadcn/cli.md +276 -0
- package/template/.agents/skills/shadcn/customization.md +209 -0
- package/template/.agents/skills/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/shadcn/mcp.md +94 -0
- package/template/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/shadcn/rules/styling.md +162 -0
- package/template/.agents/skills/ship-it/SKILL.md +174 -0
- package/template/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agents/skills/skill-creator/SKILL.md +485 -0
- package/template/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/template/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.agents/skills/vercel-react-best-practices/AGENTS.md +3750 -0
- package/template/.agents/skills/vercel-react-best-practices/README.md +123 -0
- package/template/.agents/skills/vercel-react-best-practices/SKILL.md +148 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.agents/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/.claude/agents/better-auth-expert.md +189 -0
- package/template/.claude/agents/code-review.md +147 -0
- package/template/.claude/agents/coder.md +139 -0
- package/template/.claude/agents/deep-dive.md +133 -0
- package/template/.claude/agents/polar-payments-expert.md +140 -0
- package/template/.claude/agents/security-scanner.md +214 -0
- package/template/.claude/settings.local.json +15 -0
- package/template/.claude/skills/ai-sdk/SKILL.md +78 -0
- package/template/.claude/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/template/.claude/skills/ai-sdk/references/common-errors.md +443 -0
- package/template/.claude/skills/ai-sdk/references/devtools.md +52 -0
- package/template/.claude/skills/ai-sdk/references/type-safe-agents.md +204 -0
- package/template/.claude/skills/better-auth-best-practices/SKILL.md +175 -0
- package/template/.claude/skills/caveman/SKILL.md +49 -0
- package/template/.claude/skills/checkpoint/SKILL.md +82 -0
- package/template/.claude/skills/create-spec/SKILL.md +132 -0
- package/template/.claude/skills/create-spec/references/action-required-template.md +53 -0
- package/template/.claude/skills/create-spec/references/readme-template.md +53 -0
- package/template/.claude/skills/create-spec/references/requirements-template.md +54 -0
- package/template/.claude/skills/create-spec/references/task-template.md +79 -0
- package/template/.claude/skills/d3-visualization/SKILL.md +62 -0
- package/template/.claude/skills/find-skills/SKILL.md +142 -0
- package/template/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/template/.claude/skills/frontend-design/SKILL.md +42 -0
- package/template/.claude/skills/grill-me/SKILL.md +10 -0
- package/template/.claude/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/template/.claude/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/template/.claude/skills/grill-with-docs/SKILL.md +88 -0
- package/template/.claude/skills/gsap-core/SKILL.md +267 -0
- package/template/.claude/skills/implement-feature/SKILL.md +189 -0
- package/template/.claude/skills/implement-feature/references/coder-prompt-template.md +46 -0
- package/template/.claude/skills/implement-feature/references/fix-prompt-template.md +38 -0
- package/template/.claude/skills/implement-feature/references/review-prompt-template.md +50 -0
- package/template/.claude/skills/mcp-builder/LICENSE.txt +202 -0
- package/template/.claude/skills/mcp-builder/SKILL.md +236 -0
- package/template/.claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/template/.claude/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/template/.claude/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/template/.claude/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/template/.claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/template/.claude/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/template/.claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/template/.claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/template/.claude/skills/nextjs/SKILL.md +434 -0
- package/template/.claude/skills/nextjs/overlay.yaml +284 -0
- package/template/.claude/skills/nextjs/references/app-router-files.md +94 -0
- package/template/.claude/skills/nextjs/references/async-patterns.md +87 -0
- package/template/.claude/skills/nextjs/references/bundling.md +180 -0
- package/template/.claude/skills/nextjs/references/data-patterns.md +297 -0
- package/template/.claude/skills/nextjs/references/debug-tricks.md +105 -0
- package/template/.claude/skills/nextjs/references/directives.md +73 -0
- package/template/.claude/skills/nextjs/references/error-handling.md +227 -0
- package/template/.claude/skills/nextjs/references/file-conventions.md +140 -0
- package/template/.claude/skills/nextjs/references/font.md +245 -0
- package/template/.claude/skills/nextjs/references/functions.md +108 -0
- package/template/.claude/skills/nextjs/references/hydration-error.md +91 -0
- package/template/.claude/skills/nextjs/references/image.md +173 -0
- package/template/.claude/skills/nextjs/references/metadata.md +301 -0
- package/template/.claude/skills/nextjs/references/parallel-routes.md +287 -0
- package/template/.claude/skills/nextjs/references/route-handlers.md +146 -0
- package/template/.claude/skills/nextjs/references/rsc-boundaries.md +159 -0
- package/template/.claude/skills/nextjs/references/runtime-selection.md +39 -0
- package/template/.claude/skills/nextjs/references/scripts.md +141 -0
- package/template/.claude/skills/nextjs/references/self-hosting.md +371 -0
- package/template/.claude/skills/nextjs/references/suspense-boundaries.md +67 -0
- package/template/.claude/skills/nextjs/upstream/SKILL.md +153 -0
- package/template/.claude/skills/nextjs/upstream/references/app-router-files.md +94 -0
- package/template/.claude/skills/nextjs/upstream/references/async-patterns.md +87 -0
- package/template/.claude/skills/nextjs/upstream/references/bundling.md +180 -0
- package/template/.claude/skills/nextjs/upstream/references/data-patterns.md +297 -0
- package/template/.claude/skills/nextjs/upstream/references/debug-tricks.md +105 -0
- package/template/.claude/skills/nextjs/upstream/references/directives.md +73 -0
- package/template/.claude/skills/nextjs/upstream/references/error-handling.md +227 -0
- package/template/.claude/skills/nextjs/upstream/references/file-conventions.md +140 -0
- package/template/.claude/skills/nextjs/upstream/references/font.md +245 -0
- package/template/.claude/skills/nextjs/upstream/references/functions.md +108 -0
- package/template/.claude/skills/nextjs/upstream/references/hydration-error.md +91 -0
- package/template/.claude/skills/nextjs/upstream/references/image.md +173 -0
- package/template/.claude/skills/nextjs/upstream/references/metadata.md +301 -0
- package/template/.claude/skills/nextjs/upstream/references/parallel-routes.md +287 -0
- package/template/.claude/skills/nextjs/upstream/references/route-handlers.md +146 -0
- package/template/.claude/skills/nextjs/upstream/references/rsc-boundaries.md +159 -0
- package/template/.claude/skills/nextjs/upstream/references/runtime-selection.md +39 -0
- package/template/.claude/skills/nextjs/upstream/references/scripts.md +141 -0
- package/template/.claude/skills/nextjs/upstream/references/self-hosting.md +371 -0
- package/template/.claude/skills/nextjs/upstream/references/suspense-boundaries.md +67 -0
- package/template/.claude/skills/playwright-cli/SKILL.md +344 -0
- package/template/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
- package/template/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
- package/template/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
- package/template/.claude/skills/playwright-cli/references/running-code.md +231 -0
- package/template/.claude/skills/playwright-cli/references/session-management.md +169 -0
- package/template/.claude/skills/playwright-cli/references/storage-state.md +275 -0
- package/template/.claude/skills/playwright-cli/references/test-generation.md +88 -0
- package/template/.claude/skills/playwright-cli/references/tracing.md +139 -0
- package/template/.claude/skills/playwright-cli/references/video-recording.md +143 -0
- package/template/.claude/skills/react-three-fiber/SKILL.md +180 -0
- package/template/.claude/skills/remotion/SKILL.md +43 -0
- package/template/.claude/skills/review-pr/SKILL.md +97 -0
- package/template/.claude/skills/security-scanner/SKILL.md +157 -0
- package/template/.claude/skills/security-scanner/references/A01-broken-access-control.md +136 -0
- package/template/.claude/skills/security-scanner/references/A02-security-misconfiguration.md +130 -0
- package/template/.claude/skills/security-scanner/references/A03-software-supply-chain-failures.md +117 -0
- package/template/.claude/skills/security-scanner/references/A04-cryptographic-failures.md +141 -0
- package/template/.claude/skills/security-scanner/references/A05-injection.md +155 -0
- package/template/.claude/skills/security-scanner/references/A06-insecure-design.md +145 -0
- package/template/.claude/skills/security-scanner/references/A07-authentication-failures.md +150 -0
- package/template/.claude/skills/security-scanner/references/A08-software-data-integrity-failures.md +132 -0
- package/template/.claude/skills/security-scanner/references/A09-security-logging-alerting-failures.md +130 -0
- package/template/.claude/skills/security-scanner/references/A10-mishandling-exceptional-conditions.md +154 -0
- package/template/.claude/skills/security-scanner/references/report-template.md +148 -0
- package/template/.claude/skills/shadcn/SKILL.md +246 -0
- package/template/.claude/skills/shadcn/agents/openai.yml +5 -0
- package/template/.claude/skills/shadcn/assets/shadcn-small.png +0 -0
- package/template/.claude/skills/shadcn/assets/shadcn.png +0 -0
- package/template/.claude/skills/shadcn/cli.md +276 -0
- package/template/.claude/skills/shadcn/customization.md +209 -0
- package/template/.claude/skills/shadcn/evals/evals.json +47 -0
- package/template/.claude/skills/shadcn/mcp.md +94 -0
- package/template/.claude/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.claude/skills/shadcn/rules/composition.md +195 -0
- package/template/.claude/skills/shadcn/rules/forms.md +192 -0
- package/template/.claude/skills/shadcn/rules/icons.md +101 -0
- package/template/.claude/skills/shadcn/rules/styling.md +162 -0
- package/template/.claude/skills/ship-it/SKILL.md +174 -0
- package/template/.claude/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.claude/skills/skill-creator/SKILL.md +485 -0
- package/template/.claude/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.claude/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.claude/skills/skill-creator/agents/grader.md +223 -0
- package/template/.claude/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.claude/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.claude/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.claude/skills/skill-creator/references/schemas.md +430 -0
- package/template/.claude/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.claude/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.claude/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.claude/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.claude/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.claude/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.claude/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.claude/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.claude/skills/svelte/SKILL.md +284 -0
- package/template/.claude/skills/tdd/SKILL.md +109 -0
- package/template/.claude/skills/tdd/deep-modules.md +33 -0
- package/template/.claude/skills/tdd/interface-design.md +31 -0
- package/template/.claude/skills/tdd/mocking.md +59 -0
- package/template/.claude/skills/tdd/refactoring.md +10 -0
- package/template/.claude/skills/tdd/tests.md +61 -0
- package/template/.claude/skills/threejs/SKILL.md +43 -0
- package/template/.claude/skills/to-issues/SKILL.md +83 -0
- package/template/.claude/skills/to-prd/SKILL.md +76 -0
- package/template/.claude/skills/vercel-react-best-practices/AGENTS.md +3750 -0
- package/template/.claude/skills/vercel-react-best-practices/README.md +123 -0
- package/template/.claude/skills/vercel-react-best-practices/SKILL.md +148 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.claude/skills/video-downloader/SKILL.md +42 -0
- package/template/.claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/template/.claude/skills/webgpu-threejs-tsl/REFERENCE.md +371 -0
- package/template/.claude/skills/webgpu-threejs-tsl/SKILL.md +93 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/compute-shaders.md +578 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/core-concepts.md +497 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/device-loss.md +359 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/limits-and-features.md +133 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/materials.md +353 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/post-processing.md +515 -0
- package/template/.claude/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +324 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/basic-setup.js +87 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/custom-material.js +170 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/earth-shader.js +292 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/particle-system.js +259 -0
- package/template/.claude/skills/webgpu-threejs-tsl/examples/post-processing.js +199 -0
- package/template/.claude/skills/webgpu-threejs-tsl/templates/compute-shader.js +343 -0
- package/template/.claude/skills/webgpu-threejs-tsl/templates/webgpu-project.js +276 -0
- package/template/.claude/skills/zoom-out/SKILL.md +7 -0
- package/template/.mcp.json +5 -0
- package/template/.nvmrc +1 -0
- package/template/.prettierignore +25 -0
- package/template/.prettierrc +11 -0
- package/template/.vscode/settings.json +1 -0
- package/template/.vscode/tasks.json.example +85 -0
- package/template/AGENTS.md +37 -0
- package/template/CLAUDE.md +75 -0
- package/template/CONTEXT.md +29 -0
- package/template/DESIGN.md +451 -0
- package/template/README.md +394 -0
- package/template/_gitignore +48 -0
- package/template/components.json +21 -0
- package/template/docker-compose.yml +9 -0
- package/template/docs/business/starter-prompt.md +94 -0
- package/template/docs/technical/ai/streaming.md +520 -0
- package/template/docs/technical/ai/structured-data.md +409 -0
- package/template/docs/technical/betterauth/polar.md +476 -0
- package/template/docs/technical/react-markdown.md +123 -0
- package/template/drizzle/0000_chilly_the_phantom.sql +50 -0
- package/template/drizzle/0001_last_warpath.sql +5 -0
- package/template/drizzle/meta/0000_snapshot.json +326 -0
- package/template/drizzle/meta/0001_snapshot.json +410 -0
- package/template/drizzle/meta/_journal.json +20 -0
- package/template/drizzle.config.ts +10 -0
- package/template/env.example +26 -0
- package/template/eslint.config.mjs +75 -0
- package/template/next-env.d.ts +6 -0
- package/template/next.config.ts +57 -0
- package/template/package.json +79 -0
- package/template/postcss.config.mjs +5 -0
- package/template/public/file.svg +1 -0
- package/template/public/globe.svg +1 -0
- package/template/public/next.svg +1 -0
- package/template/public/vercel.svg +1 -0
- package/template/public/window.svg +1 -0
- package/template/scripts/setup.ts +277 -0
- package/template/skills-lock.json +61 -0
- package/template/specs/ui-polish-responsive/README.md +59 -0
- package/template/specs/ui-polish-responsive/action-required.md +3 -0
- package/template/specs/ui-polish-responsive/requirements.md +53 -0
- package/template/specs/ui-polish-responsive/tasks/task-01-globals-css.md +144 -0
- package/template/specs/ui-polish-responsive/tasks/task-02-layout.md +66 -0
- package/template/specs/ui-polish-responsive/tasks/task-03-site-header.md +79 -0
- package/template/specs/ui-polish-responsive/tasks/task-04-site-footer.md +63 -0
- package/template/specs/ui-polish-responsive/tasks/task-05-home-page.md +215 -0
- package/template/specs/ui-polish-responsive/tasks/task-06-dashboard.md +222 -0
- package/template/specs/ui-polish-responsive/tasks/task-07-chat-page.md +225 -0
- package/template/specs/ui-polish-responsive/tasks/task-08-profile-page.md +192 -0
- package/template/specs/ui-polish-responsive/tasks/task-09-auth-pages.md +97 -0
- package/template/specs/ui-polish-responsive/tasks/task-10-setup-checklist.md +120 -0
- package/template/specs/ui-polish-responsive/tasks/task-11-starter-prompt-modal.md +87 -0
- package/template/src/app/(auth)/forgot-password/page.tsx +35 -0
- package/template/src/app/(auth)/layout.tsx +7 -0
- package/template/src/app/(auth)/login/page.tsx +44 -0
- package/template/src/app/(auth)/register/page.tsx +33 -0
- package/template/src/app/(auth)/reset-password/page.tsx +36 -0
- package/template/src/app/api/auth/[...all]/route.ts +4 -0
- package/template/src/app/api/chat/route.ts +80 -0
- package/template/src/app/api/diagnostics/route.ts +162 -0
- package/template/src/app/chat/error.tsx +46 -0
- package/template/src/app/chat/loading.tsx +42 -0
- package/template/src/app/chat/page.tsx +348 -0
- package/template/src/app/dashboard/loading.tsx +63 -0
- package/template/src/app/dashboard/page.tsx +79 -0
- package/template/src/app/error.tsx +44 -0
- package/template/src/app/favicon.ico +0 -0
- package/template/src/app/globals.css +175 -0
- package/template/src/app/layout.tsx +108 -0
- package/template/src/app/manifest.ts +21 -0
- package/template/src/app/not-found.tsx +28 -0
- package/template/src/app/page.tsx +152 -0
- package/template/src/app/profile/page.tsx +416 -0
- package/template/src/app/robots.ts +16 -0
- package/template/src/app/sitemap.ts +26 -0
- package/template/src/components/auth/forgot-password-form.tsx +83 -0
- package/template/src/components/auth/reset-password-form.tsx +107 -0
- package/template/src/components/auth/sign-in-button.tsx +97 -0
- package/template/src/components/auth/sign-out-button.tsx +31 -0
- package/template/src/components/auth/sign-up-form.tsx +121 -0
- package/template/src/components/auth/user-profile.tsx +91 -0
- package/template/src/components/setup-checklist.tsx +180 -0
- package/template/src/components/site-footer.tsx +24 -0
- package/template/src/components/site-header.tsx +46 -0
- package/template/src/components/starter-prompt-modal.tsx +202 -0
- package/template/src/components/theme-provider.tsx +11 -0
- package/template/src/components/ui/avatar.tsx +52 -0
- package/template/src/components/ui/badge.tsx +35 -0
- package/template/src/components/ui/button.tsx +58 -0
- package/template/src/components/ui/card.tsx +78 -0
- package/template/src/components/ui/dialog.tsx +142 -0
- package/template/src/components/ui/dropdown-menu.tsx +256 -0
- package/template/src/components/ui/github-stars.tsx +53 -0
- package/template/src/components/ui/input.tsx +20 -0
- package/template/src/components/ui/label.tsx +23 -0
- package/template/src/components/ui/mode-toggle.tsx +38 -0
- package/template/src/components/ui/separator.tsx +23 -0
- package/template/src/components/ui/skeleton.tsx +13 -0
- package/template/src/components/ui/sonner.tsx +42 -0
- package/template/src/components/ui/spinner.tsx +21 -0
- package/template/src/components/ui/textarea.tsx +17 -0
- package/template/src/hooks/use-diagnostics.ts +86 -0
- package/template/src/lib/auth-client.ts +16 -0
- package/template/src/lib/auth.ts +25 -0
- package/template/src/lib/db.ts +12 -0
- package/template/src/lib/env.ts +117 -0
- package/template/src/lib/schema.ts +82 -0
- package/template/src/lib/session.ts +48 -0
- package/template/src/lib/storage.ts +225 -0
- package/template/src/lib/utils.ts +6 -0
- package/template/src/proxy.ts +25 -0
- package/template/tsconfig.json +48 -0
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
- `docs/device-loss.md` - Handling GPU device loss and recovery
|
|
32
|
+
- `docs/limits-and-features.md` - WebGPU device limits and optional features
|
|
33
|
+
|
|
34
|
+
### Examples
|
|
35
|
+
- `examples/basic-setup.js` - Minimal WebGPU project
|
|
36
|
+
- `examples/custom-material.js` - Custom shader material
|
|
37
|
+
- `examples/particle-system.js` - GPU compute particles
|
|
38
|
+
- `examples/post-processing.js` - Effect pipeline
|
|
39
|
+
- `examples/earth-shader.js` - Complete Earth with atmosphere
|
|
40
|
+
|
|
41
|
+
### Templates
|
|
42
|
+
- `templates/webgpu-project.js` - Starter project template
|
|
43
|
+
- `templates/compute-shader.js` - Compute shader template
|
|
44
|
+
|
|
45
|
+
### Reference
|
|
46
|
+
- `REFERENCE.md` - Quick reference cheatsheet
|
|
47
|
+
|
|
48
|
+
## Key Concepts
|
|
49
|
+
|
|
50
|
+
### Import Pattern
|
|
51
|
+
```javascript
|
|
52
|
+
// Always use the WebGPU entry point
|
|
53
|
+
import * as THREE from 'three/webgpu';
|
|
54
|
+
import { /* TSL functions */ } from 'three/tsl';
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Node Materials
|
|
58
|
+
Replace standard material properties with TSL nodes:
|
|
59
|
+
```javascript
|
|
60
|
+
material.colorNode = texture(map); // instead of material.map
|
|
61
|
+
material.roughnessNode = float(0.5); // instead of material.roughness
|
|
62
|
+
material.positionNode = displaced; // vertex displacement
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Method Chaining
|
|
66
|
+
TSL uses method chaining for operations:
|
|
67
|
+
```javascript
|
|
68
|
+
// Instead of: sin(time * 2.0 + offset) * 0.5 + 0.5
|
|
69
|
+
time.mul(2.0).add(offset).sin().mul(0.5).add(0.5)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Custom Functions
|
|
73
|
+
Use `Fn()` for reusable shader logic:
|
|
74
|
+
```javascript
|
|
75
|
+
const fresnel = Fn(([power = 2.0]) => {
|
|
76
|
+
const nDotV = normalWorld.dot(viewDir).saturate();
|
|
77
|
+
return float(1.0).sub(nDotV).pow(power);
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## When to Use This Skill
|
|
82
|
+
|
|
83
|
+
- Setting up Three.js with WebGPU renderer
|
|
84
|
+
- Creating custom shader materials with TSL
|
|
85
|
+
- Writing GPU compute shaders
|
|
86
|
+
- Building post-processing pipelines
|
|
87
|
+
- Migrating from GLSL to TSL
|
|
88
|
+
- Implementing visual effects (particles, water, terrain, etc.)
|
|
89
|
+
|
|
90
|
+
## Resources
|
|
91
|
+
|
|
92
|
+
- [Three.js TSL Wiki](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language)
|
|
93
|
+
- [WebGPU Examples](https://github.com/mrdoob/three.js/tree/master/examples) (files prefixed with `webgpu_`)
|
|
@@ -0,0 +1,578 @@
|
|
|
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
|
+
## CRITICAL: TSL Node Property Assignment vs JS Variable Reassignment
|
|
6
|
+
|
|
7
|
+
**TSL can intercept property assignments on nodes, but NOT JavaScript variable reassignment.**
|
|
8
|
+
|
|
9
|
+
### What Works vs What Doesn't
|
|
10
|
+
|
|
11
|
+
| Pattern | Works? | Why |
|
|
12
|
+
|---------|--------|-----|
|
|
13
|
+
| `node.y = value` | ✅ | Property setter - TSL intercepts |
|
|
14
|
+
| `node.x.assign(value)` | ✅ | TSL method call |
|
|
15
|
+
| `buffer.element(i).assign(v)` | ✅ | TSL method call |
|
|
16
|
+
| `variable = variable.add(1)` | ❌ | JS variable reassignment - TSL can't see it |
|
|
17
|
+
|
|
18
|
+
### This WORKS (property assignment on vec3):
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
// ✅ CORRECT - Property assignment on node object
|
|
22
|
+
const computeShader = Fn(() => {
|
|
23
|
+
const result = vec3(position);
|
|
24
|
+
|
|
25
|
+
If(result.y.greaterThan(limit), () => {
|
|
26
|
+
result.y = limit; // TSL intercepts property setters!
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return result;
|
|
30
|
+
})();
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### This does NOT work (JS variable reassignment):
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
// ❌ WRONG - JavaScript variable reassignment inside If()
|
|
37
|
+
const computeShader = Fn(() => {
|
|
38
|
+
let value = buffer.element(index).toFloat(); // Scalar float - no .x/.y properties
|
|
39
|
+
|
|
40
|
+
If(condition, () => {
|
|
41
|
+
value = value.add(1.0); // JS reassigns variable to NEW node - TSL can't track this!
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
buffer.element(index).assign(value); // Uses ORIGINAL node, not the add result!
|
|
45
|
+
})().compute(count);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Why it fails:** `value = value.add(1.0)` creates a new TSL node and reassigns the JavaScript variable to point to it. But TSL can't intercept JavaScript variable assignment - it can only intercept property setters and method calls on TSL node objects. Since `value` is a scalar float (no `.x`/`.y` properties), you can't use property assignment.
|
|
49
|
+
|
|
50
|
+
### Solution 1: Use `select()` for Conditional Values
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
// ✅ CORRECT - Use select() for inline conditionals
|
|
54
|
+
import { select } from 'three/tsl';
|
|
55
|
+
|
|
56
|
+
const computeShader = Fn(() => {
|
|
57
|
+
const currentValue = buffer.element(index).toFloat();
|
|
58
|
+
|
|
59
|
+
// select(condition, valueIfTrue, valueIfFalse)
|
|
60
|
+
const newValue = select(
|
|
61
|
+
condition,
|
|
62
|
+
currentValue.add(1.0), // If true
|
|
63
|
+
currentValue // If false
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
buffer.element(index).assign(newValue);
|
|
67
|
+
})().compute(count);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Solution 2: Use `.assign()` Directly on Buffer Elements Inside If()
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
// ✅ CORRECT - Direct buffer assignment inside If() works
|
|
74
|
+
const computeShader = Fn(() => {
|
|
75
|
+
const element = buffer.element(index);
|
|
76
|
+
|
|
77
|
+
If(condition, () => {
|
|
78
|
+
// Direct assignment to buffer element works!
|
|
79
|
+
element.assign(element.add(1.0));
|
|
80
|
+
});
|
|
81
|
+
})().compute(count);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Solution 3: Use `.toVar()` for Mutable Variables
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
// ✅ CORRECT - Use .toVar() for variables that need mutation
|
|
88
|
+
const computeShader = Fn(() => {
|
|
89
|
+
// .toVar() creates a proper GPU variable that can be reassigned
|
|
90
|
+
const value = buffer.element(index).toFloat().toVar();
|
|
91
|
+
|
|
92
|
+
If(condition, () => {
|
|
93
|
+
value.assign(value.add(1.0)); // This works with .toVar()!
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
buffer.element(index).assign(value);
|
|
97
|
+
})().compute(count);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Quick Reference: When to Use What
|
|
101
|
+
|
|
102
|
+
| Pattern | Use Case |
|
|
103
|
+
|---------|----------|
|
|
104
|
+
| `select(cond, a, b)` | Simple conditional value selection |
|
|
105
|
+
| `element.assign()` inside `If()` | Direct buffer writes |
|
|
106
|
+
| `.toVar()` + `assign()` | Complex logic with multiple conditionals |
|
|
107
|
+
| Regular `If()` with direct assigns | Multiple buffer element updates |
|
|
108
|
+
|
|
109
|
+
### Example: Correct Stamp/Fade Pattern
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
// ✅ CORRECT implementation of conditional stamping
|
|
113
|
+
const computeShader = Fn(() => {
|
|
114
|
+
const currentFoam = foamBuffer.element(index).toFloat();
|
|
115
|
+
|
|
116
|
+
// Calculate distance
|
|
117
|
+
const dist = worldPos.distance(stampPos);
|
|
118
|
+
const radius = float(50.0);
|
|
119
|
+
|
|
120
|
+
// Calculate falloff (will be 0 outside radius due to select)
|
|
121
|
+
const falloff = float(1.0).sub(dist.div(radius));
|
|
122
|
+
|
|
123
|
+
// Use select() - returns falloff if inside radius, 0 if outside
|
|
124
|
+
const foamToAdd = select(dist.lessThan(radius), falloff, float(0.0));
|
|
125
|
+
|
|
126
|
+
// Combine and write
|
|
127
|
+
const newFoam = max(currentFoam, foamToAdd);
|
|
128
|
+
foamBuffer.element(index).assign(clamp(newFoam, 0.0, 1.0));
|
|
129
|
+
})().compute(bufferSize);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Basic Setup
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
import * as THREE from 'three/webgpu';
|
|
138
|
+
import { Fn, instancedArray, instanceIndex, vec3 } from 'three/tsl';
|
|
139
|
+
|
|
140
|
+
// Create storage buffer
|
|
141
|
+
const count = 100000;
|
|
142
|
+
const positions = instancedArray(count, 'vec3');
|
|
143
|
+
|
|
144
|
+
// Create compute shader
|
|
145
|
+
const computeShader = Fn(() => {
|
|
146
|
+
const position = positions.element(instanceIndex);
|
|
147
|
+
position.x.addAssign(0.01);
|
|
148
|
+
})().compute(count);
|
|
149
|
+
|
|
150
|
+
// Initialize renderer first, then use synchronous compute
|
|
151
|
+
await renderer.init();
|
|
152
|
+
renderer.compute(computeShader);
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Read-Only Storage Buffers
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
import { attributeArray } from 'three/tsl';
|
|
159
|
+
|
|
160
|
+
// attributeArray() creates read-only storage buffers (vs instancedArray for read-write)
|
|
161
|
+
const lookupTable = attributeArray(data, 'float');
|
|
162
|
+
|
|
163
|
+
// Use in compute or materials - data is read-only on GPU
|
|
164
|
+
const value = lookupTable.element(index);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Storage Buffers
|
|
168
|
+
|
|
169
|
+
### Instanced Arrays
|
|
170
|
+
|
|
171
|
+
```javascript
|
|
172
|
+
import { instancedArray } from 'three/tsl';
|
|
173
|
+
|
|
174
|
+
// Create typed storage buffers
|
|
175
|
+
const positions = instancedArray(count, 'vec3');
|
|
176
|
+
const velocities = instancedArray(count, 'vec3');
|
|
177
|
+
const colors = instancedArray(count, 'vec4');
|
|
178
|
+
const indices = instancedArray(count, 'uint');
|
|
179
|
+
const values = instancedArray(count, 'float');
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Accessing Elements
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
const computeShader = Fn(() => {
|
|
186
|
+
// Get element at current index
|
|
187
|
+
const position = positions.element(instanceIndex);
|
|
188
|
+
const velocity = velocities.element(instanceIndex);
|
|
189
|
+
|
|
190
|
+
// Read values
|
|
191
|
+
const x = position.x;
|
|
192
|
+
const speed = velocity.length();
|
|
193
|
+
|
|
194
|
+
// Write values
|
|
195
|
+
position.assign(vec3(0, 0, 0));
|
|
196
|
+
position.x.assign(1.0);
|
|
197
|
+
position.addAssign(velocity);
|
|
198
|
+
})().compute(count);
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Accessing Other Elements
|
|
202
|
+
|
|
203
|
+
```javascript
|
|
204
|
+
const computeShader = Fn(() => {
|
|
205
|
+
const myIndex = instanceIndex;
|
|
206
|
+
const neighborIndex = myIndex.add(1).mod(count);
|
|
207
|
+
|
|
208
|
+
const myPos = positions.element(myIndex);
|
|
209
|
+
const neighborPos = positions.element(neighborIndex);
|
|
210
|
+
|
|
211
|
+
// Calculate distance to neighbor
|
|
212
|
+
const dist = myPos.distance(neighborPos);
|
|
213
|
+
})().compute(count);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Compute Shader Patterns
|
|
217
|
+
|
|
218
|
+
### Initialize Particles
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
const computeInit = Fn(() => {
|
|
222
|
+
const position = positions.element(instanceIndex);
|
|
223
|
+
const velocity = velocities.element(instanceIndex);
|
|
224
|
+
|
|
225
|
+
// Random positions using hash
|
|
226
|
+
position.x.assign(hash(instanceIndex).mul(10).sub(5));
|
|
227
|
+
position.y.assign(hash(instanceIndex.add(1)).mul(10).sub(5));
|
|
228
|
+
position.z.assign(hash(instanceIndex.add(2)).mul(10).sub(5));
|
|
229
|
+
|
|
230
|
+
// Zero velocity
|
|
231
|
+
velocity.assign(vec3(0));
|
|
232
|
+
})().compute(count);
|
|
233
|
+
|
|
234
|
+
// Run once at startup (after await renderer.init())
|
|
235
|
+
renderer.compute(computeInit);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Physics Update
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
const gravity = uniform(-9.8);
|
|
242
|
+
const deltaTimeUniform = uniform(0);
|
|
243
|
+
const groundY = uniform(0);
|
|
244
|
+
|
|
245
|
+
const computeUpdate = Fn(() => {
|
|
246
|
+
const position = positions.element(instanceIndex);
|
|
247
|
+
const velocity = velocities.element(instanceIndex);
|
|
248
|
+
const dt = deltaTimeUniform;
|
|
249
|
+
|
|
250
|
+
// Apply gravity
|
|
251
|
+
velocity.y.addAssign(gravity.mul(dt));
|
|
252
|
+
|
|
253
|
+
// Update position
|
|
254
|
+
position.addAssign(velocity.mul(dt));
|
|
255
|
+
|
|
256
|
+
// Ground collision
|
|
257
|
+
If(position.y.lessThan(groundY), () => {
|
|
258
|
+
position.y.assign(groundY);
|
|
259
|
+
velocity.y.assign(velocity.y.negate().mul(0.8)); // Bounce
|
|
260
|
+
velocity.xz.mulAssign(0.95); // Friction
|
|
261
|
+
});
|
|
262
|
+
})().compute(count);
|
|
263
|
+
|
|
264
|
+
// In animation loop
|
|
265
|
+
function animate() {
|
|
266
|
+
deltaTimeUniform.value = clock.getDelta();
|
|
267
|
+
renderer.compute(computeUpdate);
|
|
268
|
+
renderer.render(scene, camera);
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Attraction to Point
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
const attractorPos = uniform(new THREE.Vector3(0, 0, 0));
|
|
276
|
+
const attractorStrength = uniform(1.0);
|
|
277
|
+
|
|
278
|
+
const computeAttract = Fn(() => {
|
|
279
|
+
const position = positions.element(instanceIndex);
|
|
280
|
+
const velocity = velocities.element(instanceIndex);
|
|
281
|
+
|
|
282
|
+
// Direction to attractor
|
|
283
|
+
const toAttractor = attractorPos.sub(position);
|
|
284
|
+
const distance = toAttractor.length();
|
|
285
|
+
const direction = toAttractor.normalize();
|
|
286
|
+
|
|
287
|
+
// Apply force (inverse square falloff)
|
|
288
|
+
const force = direction.mul(attractorStrength).div(distance.mul(distance).add(0.1));
|
|
289
|
+
velocity.addAssign(force.mul(deltaTimeUniform));
|
|
290
|
+
})().compute(count);
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Neighbor Interaction (Boids-like)
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
const computeBoids = Fn(() => {
|
|
297
|
+
const myPos = positions.element(instanceIndex);
|
|
298
|
+
const myVel = velocities.element(instanceIndex);
|
|
299
|
+
|
|
300
|
+
const separation = vec3(0).toVar();
|
|
301
|
+
const alignment = vec3(0).toVar();
|
|
302
|
+
const cohesion = vec3(0).toVar();
|
|
303
|
+
const neighborCount = int(0).toVar();
|
|
304
|
+
|
|
305
|
+
// Check nearby particles
|
|
306
|
+
Loop(count, ({ i }) => {
|
|
307
|
+
If(i.notEqual(instanceIndex), () => {
|
|
308
|
+
const otherPos = positions.element(i);
|
|
309
|
+
const otherVel = velocities.element(i);
|
|
310
|
+
const dist = myPos.distance(otherPos);
|
|
311
|
+
|
|
312
|
+
If(dist.lessThan(2.0), () => {
|
|
313
|
+
// Separation
|
|
314
|
+
const diff = myPos.sub(otherPos).normalize().div(dist);
|
|
315
|
+
separation.addAssign(diff);
|
|
316
|
+
|
|
317
|
+
// Alignment
|
|
318
|
+
alignment.addAssign(otherVel);
|
|
319
|
+
|
|
320
|
+
// Cohesion
|
|
321
|
+
cohesion.addAssign(otherPos);
|
|
322
|
+
|
|
323
|
+
neighborCount.addAssign(1);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
If(neighborCount.greaterThan(0), () => {
|
|
329
|
+
const n = neighborCount.toFloat();
|
|
330
|
+
alignment.divAssign(n);
|
|
331
|
+
cohesion.divAssign(n);
|
|
332
|
+
cohesion.assign(cohesion.sub(myPos));
|
|
333
|
+
|
|
334
|
+
myVel.addAssign(separation.mul(0.05));
|
|
335
|
+
myVel.addAssign(alignment.sub(myVel).mul(0.05));
|
|
336
|
+
myVel.addAssign(cohesion.mul(0.05));
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// Limit speed
|
|
340
|
+
const speed = myVel.length();
|
|
341
|
+
If(speed.greaterThan(2.0), () => {
|
|
342
|
+
myVel.assign(myVel.normalize().mul(2.0));
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
myPos.addAssign(myVel.mul(deltaTimeUniform));
|
|
346
|
+
})().compute(count);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Workgroups and Synchronization
|
|
350
|
+
|
|
351
|
+
### Workgroup Size
|
|
352
|
+
|
|
353
|
+
```javascript
|
|
354
|
+
// Default workgroup size is typically 64 or 256
|
|
355
|
+
// Pass workgroup size as an array
|
|
356
|
+
const computeShader = Fn(() => {
|
|
357
|
+
// shader code
|
|
358
|
+
})().compute(count, [64]);
|
|
359
|
+
|
|
360
|
+
// 2D workgroup
|
|
361
|
+
const compute2D = Fn(() => {
|
|
362
|
+
// shader code
|
|
363
|
+
})().compute(width * height, [8, 8]);
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Compute Builtins
|
|
367
|
+
|
|
368
|
+
```javascript
|
|
369
|
+
import {
|
|
370
|
+
globalId, localId, workgroupId, numWorkgroups, subgroupSize,
|
|
371
|
+
invocationLocalIndex, invocationSubgroupIndex, subgroupIndex
|
|
372
|
+
} from 'three/tsl';
|
|
373
|
+
|
|
374
|
+
const computeShader = Fn(() => {
|
|
375
|
+
// Global invocation ID across all workgroups
|
|
376
|
+
const gid = globalId;
|
|
377
|
+
|
|
378
|
+
// Local invocation ID within the workgroup
|
|
379
|
+
const lid = localId;
|
|
380
|
+
|
|
381
|
+
// Workgroup ID
|
|
382
|
+
const wid = workgroupId;
|
|
383
|
+
|
|
384
|
+
// Total number of workgroups
|
|
385
|
+
const nwg = numWorkgroups;
|
|
386
|
+
})().compute(count, [64]);
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Barriers
|
|
390
|
+
|
|
391
|
+
```javascript
|
|
392
|
+
import { workgroupBarrier, storageBarrier, textureBarrier } from 'three/tsl';
|
|
393
|
+
|
|
394
|
+
const computeShader = Fn(() => {
|
|
395
|
+
// Write data
|
|
396
|
+
sharedData.element(localIndex).assign(value);
|
|
397
|
+
|
|
398
|
+
// Ensure all workgroup threads reach this point
|
|
399
|
+
workgroupBarrier();
|
|
400
|
+
|
|
401
|
+
// Now safe to read data written by other threads
|
|
402
|
+
const neighborValue = sharedData.element(localIndex.add(1));
|
|
403
|
+
})().compute(count);
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Atomic Operations
|
|
407
|
+
|
|
408
|
+
For thread-safe read-modify-write operations:
|
|
409
|
+
|
|
410
|
+
```javascript
|
|
411
|
+
import { atomicAdd, atomicSub, atomicMax, atomicMin, atomicAnd, atomicOr, atomicXor } from 'three/tsl';
|
|
412
|
+
|
|
413
|
+
const counter = instancedArray(1, 'uint');
|
|
414
|
+
|
|
415
|
+
const computeShader = Fn(() => {
|
|
416
|
+
// Atomically increment counter
|
|
417
|
+
atomicAdd(counter.element(0), 1);
|
|
418
|
+
|
|
419
|
+
// Atomic max
|
|
420
|
+
atomicMax(maxValue.element(0), localValue);
|
|
421
|
+
})().compute(count);
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## Using Compute Results in Materials
|
|
425
|
+
|
|
426
|
+
### Instanced Mesh with Computed Positions
|
|
427
|
+
|
|
428
|
+
```javascript
|
|
429
|
+
// Create instanced mesh
|
|
430
|
+
const geometry = new THREE.SphereGeometry(0.1, 16, 16);
|
|
431
|
+
const material = new THREE.MeshStandardNodeMaterial();
|
|
432
|
+
|
|
433
|
+
// Use computed positions
|
|
434
|
+
material.positionNode = positions.element(instanceIndex);
|
|
435
|
+
|
|
436
|
+
// Optionally use computed colors
|
|
437
|
+
material.colorNode = colors.element(instanceIndex);
|
|
438
|
+
|
|
439
|
+
const mesh = new THREE.InstancedMesh(geometry, material, count);
|
|
440
|
+
scene.add(mesh);
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Points with Computed Positions
|
|
444
|
+
|
|
445
|
+
```javascript
|
|
446
|
+
const geometry = new THREE.BufferGeometry();
|
|
447
|
+
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
|
|
448
|
+
|
|
449
|
+
const material = new THREE.PointsNodeMaterial();
|
|
450
|
+
material.positionNode = positions.element(instanceIndex);
|
|
451
|
+
material.colorNode = colors.element(instanceIndex);
|
|
452
|
+
material.sizeNode = float(5.0);
|
|
453
|
+
|
|
454
|
+
const points = new THREE.Points(geometry, material);
|
|
455
|
+
scene.add(points);
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Execution Methods
|
|
459
|
+
|
|
460
|
+
```javascript
|
|
461
|
+
// IMPORTANT: Always initialize the renderer first
|
|
462
|
+
await renderer.init();
|
|
463
|
+
|
|
464
|
+
// Synchronous compute (preferred since r181)
|
|
465
|
+
renderer.compute(computeShader);
|
|
466
|
+
|
|
467
|
+
// Multiple computes
|
|
468
|
+
renderer.compute(computeInit);
|
|
469
|
+
renderer.compute(computePhysics);
|
|
470
|
+
renderer.compute(computeCollisions);
|
|
471
|
+
|
|
472
|
+
// Note: computeAsync() is deprecated since r181.
|
|
473
|
+
// Use await renderer.init() at startup, then renderer.compute() synchronously.
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
## Reading Back Data (GPU to CPU)
|
|
477
|
+
|
|
478
|
+
```javascript
|
|
479
|
+
// Create buffer for readback
|
|
480
|
+
const readBuffer = new Float32Array(count * 3);
|
|
481
|
+
|
|
482
|
+
// Read data back from GPU
|
|
483
|
+
await renderer.readRenderTargetPixelsAsync(
|
|
484
|
+
computeTexture,
|
|
485
|
+
0, 0, width, height,
|
|
486
|
+
readBuffer
|
|
487
|
+
);
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## Complete Example: Particle System
|
|
491
|
+
|
|
492
|
+
```javascript
|
|
493
|
+
import * as THREE from 'three/webgpu';
|
|
494
|
+
import {
|
|
495
|
+
Fn, If, instancedArray, instanceIndex, uniform,
|
|
496
|
+
vec3, float, hash, time
|
|
497
|
+
} from 'three/tsl';
|
|
498
|
+
|
|
499
|
+
// Setup
|
|
500
|
+
const count = 50000;
|
|
501
|
+
const positions = instancedArray(count, 'vec3');
|
|
502
|
+
const velocities = instancedArray(count, 'vec3');
|
|
503
|
+
const lifetimes = instancedArray(count, 'float');
|
|
504
|
+
|
|
505
|
+
// Uniforms
|
|
506
|
+
const emitterPos = uniform(new THREE.Vector3(0, 0, 0));
|
|
507
|
+
const gravity = uniform(-2.0);
|
|
508
|
+
const dt = uniform(0);
|
|
509
|
+
|
|
510
|
+
// Initialize
|
|
511
|
+
const computeInit = Fn(() => {
|
|
512
|
+
const pos = positions.element(instanceIndex);
|
|
513
|
+
const vel = velocities.element(instanceIndex);
|
|
514
|
+
const life = lifetimes.element(instanceIndex);
|
|
515
|
+
|
|
516
|
+
pos.assign(emitterPos);
|
|
517
|
+
|
|
518
|
+
// Random velocity in cone
|
|
519
|
+
const angle = hash(instanceIndex).mul(Math.PI * 2);
|
|
520
|
+
const speed = hash(instanceIndex.add(1)).mul(2).add(1);
|
|
521
|
+
vel.x.assign(angle.cos().mul(speed).mul(0.3));
|
|
522
|
+
vel.y.assign(speed);
|
|
523
|
+
vel.z.assign(angle.sin().mul(speed).mul(0.3));
|
|
524
|
+
|
|
525
|
+
// Random lifetime
|
|
526
|
+
life.assign(hash(instanceIndex.add(2)).mul(2).add(1));
|
|
527
|
+
})().compute(count);
|
|
528
|
+
|
|
529
|
+
// Update
|
|
530
|
+
const computeUpdate = Fn(() => {
|
|
531
|
+
const pos = positions.element(instanceIndex);
|
|
532
|
+
const vel = velocities.element(instanceIndex);
|
|
533
|
+
const life = lifetimes.element(instanceIndex);
|
|
534
|
+
|
|
535
|
+
// Apply gravity
|
|
536
|
+
vel.y.addAssign(gravity.mul(dt));
|
|
537
|
+
|
|
538
|
+
// Update position
|
|
539
|
+
pos.addAssign(vel.mul(dt));
|
|
540
|
+
|
|
541
|
+
// Decrease lifetime
|
|
542
|
+
life.subAssign(dt);
|
|
543
|
+
|
|
544
|
+
// Respawn dead particles
|
|
545
|
+
If(life.lessThan(0), () => {
|
|
546
|
+
pos.assign(emitterPos);
|
|
547
|
+
const angle = hash(instanceIndex.add(time.mul(1000))).mul(Math.PI * 2);
|
|
548
|
+
const speed = hash(instanceIndex.add(time.mul(1000)).add(1)).mul(2).add(1);
|
|
549
|
+
vel.x.assign(angle.cos().mul(speed).mul(0.3));
|
|
550
|
+
vel.y.assign(speed);
|
|
551
|
+
vel.z.assign(angle.sin().mul(speed).mul(0.3));
|
|
552
|
+
life.assign(hash(instanceIndex.add(time.mul(1000)).add(2)).mul(2).add(1));
|
|
553
|
+
});
|
|
554
|
+
})().compute(count);
|
|
555
|
+
|
|
556
|
+
// Material
|
|
557
|
+
const material = new THREE.PointsNodeMaterial();
|
|
558
|
+
material.positionNode = positions.element(instanceIndex);
|
|
559
|
+
material.sizeNode = float(3.0);
|
|
560
|
+
material.colorNode = vec3(1, 0.5, 0.2);
|
|
561
|
+
|
|
562
|
+
// Geometry (dummy positions)
|
|
563
|
+
const geometry = new THREE.BufferGeometry();
|
|
564
|
+
geometry.setAttribute('position', new THREE.Float32BufferAttribute(new Float32Array(count * 3), 3));
|
|
565
|
+
|
|
566
|
+
const points = new THREE.Points(geometry, material);
|
|
567
|
+
scene.add(points);
|
|
568
|
+
|
|
569
|
+
// Init (after await renderer.init())
|
|
570
|
+
renderer.compute(computeInit);
|
|
571
|
+
|
|
572
|
+
// Animation loop
|
|
573
|
+
function animate() {
|
|
574
|
+
dt.value = Math.min(clock.getDelta(), 0.1);
|
|
575
|
+
renderer.compute(computeUpdate);
|
|
576
|
+
renderer.render(scene, camera);
|
|
577
|
+
}
|
|
578
|
+
```
|