From b4b2a00a3cb0279621b4f91b22144d60f592f476 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Sat, 21 Feb 2026 11:28:23 +0100 Subject: [PATCH 01/23] fix: Lift compound assignment restrictions --- packages/typegpu/src/tgsl/wgslGenerator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/typegpu/src/tgsl/wgslGenerator.ts b/packages/typegpu/src/tgsl/wgslGenerator.ts index ec8ea50a30..49833fbea4 100644 --- a/packages/typegpu/src/tgsl/wgslGenerator.ts +++ b/packages/typegpu/src/tgsl/wgslGenerator.ts @@ -405,7 +405,8 @@ ${this.ctx.pre}}`; ); } - if (!isEphemeralSnippet(rhsExpr)) { + // Compound assignment operators are okay, e.g. +=, -=, *=, /=, ... + if (op === '=' && !isEphemeralSnippet(rhsExpr)) { throw new WgslTypeError( `'${lhsStr} = ${rhsStr}' is invalid, because references cannot be assigned.\n-----\nTry '${lhsStr} = ${ this.ctx.resolve(rhsExpr.dataType).value From a4c968371ba4d02099f7d05e2134109f859b5dff Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Fri, 13 Feb 2026 20:29:15 +0100 Subject: [PATCH 02/23] feat: `tsover` support --- apps/typegpu-docs/tsconfig.json | 1 + package.json | 1 + packages/typegpu/package.json | 1 + packages/typegpu/src/data/numeric.ts | 1 + packages/typegpu/src/data/vectorImpl.ts | 8 + packages/typegpu/src/data/wgslTypes.ts | 6 + packages/unplugin-typegpu/src/babel.ts | 189 ++++++-- packages/unplugin-typegpu/src/common.ts | 11 + packages/unplugin-typegpu/src/rollup-impl.ts | 39 ++ .../test/tgsl-transpiling.test.ts | 5 +- .../test/use-gpu-directive.test.ts | 81 +++- pnpm-lock.yaml | 459 +++++++++++------- pnpm-workspace.yaml | 2 +- 13 files changed, 563 insertions(+), 241 deletions(-) diff --git a/apps/typegpu-docs/tsconfig.json b/apps/typegpu-docs/tsconfig.json index 117bde7ac6..80558304ce 100644 --- a/apps/typegpu-docs/tsconfig.json +++ b/apps/typegpu-docs/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "react", + "lib": ["ESNext", "DOM"], "types": ["@webgpu/types"] }, "include": [".astro/types.d.ts", "**/*"], diff --git a/package.json b/package.json index b9d297e45c..4f6d9ad641 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ ], "overrides": { "rollup": "4.34.8", + "typescript": "catalog:types", "three": "catalog:example" } } diff --git a/packages/typegpu/package.json b/packages/typegpu/package.json index e474d7a733..44b5bda4e0 100644 --- a/packages/typegpu/package.json +++ b/packages/typegpu/package.json @@ -79,6 +79,7 @@ "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67", "dependencies": { "tinyest": "workspace:~0.2.0", + "tsover-runtime": "^0.0.2", "typed-binary": "^4.3.1" } } diff --git a/packages/typegpu/src/data/numeric.ts b/packages/typegpu/src/data/numeric.ts index cbf5f36f76..d2001d0eab 100644 --- a/packages/typegpu/src/data/numeric.ts +++ b/packages/typegpu/src/data/numeric.ts @@ -11,6 +11,7 @@ import type { U32, } from './wgslTypes.ts'; import { callableSchema } from '../core/function/createCallableSchema.ts'; +import { Operator } from 'tsover-runtime'; export const abstractInt = { [$internal]: {}, diff --git a/packages/typegpu/src/data/vectorImpl.ts b/packages/typegpu/src/data/vectorImpl.ts index 98135fd880..db25ab3073 100644 --- a/packages/typegpu/src/data/vectorImpl.ts +++ b/packages/typegpu/src/data/vectorImpl.ts @@ -1,3 +1,4 @@ +import { Operator } from 'tsover-runtime'; import { $internal, $resolve } from '../shared/symbols.ts'; import type { SelfResolvable } from '../types.ts'; import { bool, f16, f32, i32, u32 } from './numeric.ts'; @@ -177,6 +178,13 @@ abstract class Vec2 extends VecBase implements Tuple2 { set g(value: S) { this[1] = this.castElement()(value); } + + [Operator.plus](lhs: Vec2, rhs: Vec2) { + return new this._Vec2( + (lhs[0] as number) + (rhs[0] as number) as S, + (lhs[1] as number) + (rhs[1] as number) as S, + ); + } } abstract class Vec3 extends VecBase implements Tuple3 { diff --git a/packages/typegpu/src/data/wgslTypes.ts b/packages/typegpu/src/data/wgslTypes.ts index 721a3aa308..3c67d44599 100644 --- a/packages/typegpu/src/data/wgslTypes.ts +++ b/packages/typegpu/src/data/wgslTypes.ts @@ -1,3 +1,4 @@ +import { Operator } from 'tsover-runtime'; import type { TgpuNamable } from '../shared/meta.ts'; import type { ExtractInvalidSchemaError, @@ -69,6 +70,11 @@ export interface vecInfixNotation { div(other: number): T; div(other: T): T; + + [Operator.plus](lhs: T | number, rhs: T | number): T; + [Operator.minus](lhs: T | number, rhs: T | number): T; + [Operator.star](lhs: T | number, rhs: T | number): T; + [Operator.slash](lhs: T, rhs: T | number): T; } /** diff --git a/packages/unplugin-typegpu/src/babel.ts b/packages/unplugin-typegpu/src/babel.ts index f4dc5e7558..44c7968729 100644 --- a/packages/unplugin-typegpu/src/babel.ts +++ b/packages/unplugin-typegpu/src/babel.ts @@ -12,6 +12,7 @@ import { gatherTgpuAliases, getFunctionName, isShellImplementationCall, + operators, type Options, performExpressionNaming, useGpuDirective, @@ -43,11 +44,22 @@ function i(identifier: string): babel.Identifier { return types.identifier(identifier); } +const fnNodeToOriginalMap = new WeakMap< + | babel.FunctionDeclaration + | babel.FunctionExpression + | babel.ArrowFunctionExpression, + | babel.FunctionDeclaration + | babel.FunctionExpression + | babel.ArrowFunctionExpression +>(); + function functionToTranspiled( node: babel.ArrowFunctionExpression | babel.FunctionExpression, parent: babel.Node | null, ): babel.CallExpression { - const { params, body, externalNames } = transpileFn(node); + const { params, body, externalNames } = transpileFn( + fnNodeToOriginalMap.get(node) ?? node, + ); const maybeName = getFunctionName(node, parent); const metadata = types.objectExpression([ @@ -128,6 +140,8 @@ function wrapInAutoName( } function functionVisitor(ctx: Context): TraverseOptions { + let useGpuDepth = 0; + return { VariableDeclarator(path) { performExpressionNaming(ctx, path.node, (node, name) => { @@ -136,6 +150,24 @@ function functionVisitor(ctx: Context): TraverseOptions { }, AssignmentExpression(path) { + if (useGpuDepth > 0) { + const runtimeFn = + operators[path.node.operator as keyof typeof operators]; + + if (runtimeFn) { + path.replaceWith( + types.assignmentExpression( + '=', + path.node.left, + types.callExpression(types.identifier(runtimeFn), [ + path.node.left as babel.Expression, + path.node.right as babel.Expression, + ]), + ), + ); + } + } + performExpressionNaming(ctx, path.node, (node, name) => { path.get('right').replaceWith(wrapInAutoName(node, name)); }); @@ -157,71 +189,126 @@ function functionVisitor(ctx: Context): TraverseOptions { gatherTgpuAliases(path.node, ctx); }, - ArrowFunctionExpression(path) { - const node = path.node; - const parent = path.parentPath.node; - if (containsUseGpuDirective(node)) { - path.replaceWith(functionToTranspiled(node, parent)); - path.skip(); - } + BinaryExpression: { + exit(path) { + if (useGpuDepth <= 0) { + return; + } + + const runtimeFn = + operators[path.node.operator as keyof typeof operators]; + + if (runtimeFn) { + path.replaceWith( + types.callExpression(types.identifier(runtimeFn), [ + path.node.left as babel.Expression, + path.node.right as babel.Expression, + ]), + ); + } + }, }, - FunctionExpression(path) { - const node = path.node; - const parent = path.parentPath.node; - if (containsUseGpuDirective(node)) { - path.replaceWith(functionToTranspiled(node, parent)); - path.skip(); - } + ArrowFunctionExpression: { + enter(path) { + if (containsUseGpuDirective(path.node)) { + fnNodeToOriginalMap.set(path.node, types.cloneNode(path.node, true)); + useGpuDepth++; + } + }, + exit(path) { + const node = path.node; + if (containsUseGpuDirective(node)) { + useGpuDepth--; + const parent = path.parentPath.node; + path.replaceWith(functionToTranspiled(node, parent)); + path.skip(); + } + }, }, - FunctionDeclaration(path) { - const node = path.node; - const parent = path.parentPath.node; - const expression = types.functionExpression( - node.id, - node.params, - node.body, - ); - - if (containsUseGpuDirective(path.node) && node.id) { - path.replaceWith( - types.variableDeclaration('const', [ - types.variableDeclarator( - node.id, - functionToTranspiled(expression, parent), - ), - ]), - ); - path.skip(); - } + FunctionExpression: { + enter(path) { + if (containsUseGpuDirective(path.node)) { + fnNodeToOriginalMap.set(path.node, types.cloneNode(path.node, true)); + useGpuDepth++; + } + }, + exit(path) { + const node = path.node; + if (containsUseGpuDirective(node)) { + useGpuDepth--; + const parent = path.parentPath.node; + path.replaceWith(functionToTranspiled(node, parent)); + path.skip(); + } + }, }, - CallExpression(path) { - const node = path.node; + FunctionDeclaration: { + enter(path) { + if (containsUseGpuDirective(path.node)) { + fnNodeToOriginalMap.set(path.node, types.cloneNode(path.node, true)); + useGpuDepth++; + } + }, + exit(path) { + const node = (fnNodeToOriginalMap.get(path.node) ?? + path.node) as babel.FunctionDeclaration; + if (containsUseGpuDirective(node)) { + useGpuDepth--; - if (isShellImplementationCall(node, ctx)) { - const implementation = node.arguments[0]; + if (!node.id) { + return; + } - if ( - implementation && - (implementation.type === 'FunctionExpression' || - implementation.type === 'ArrowFunctionExpression') - ) { - const transpiled = functionToTranspiled( - implementation, - null, + const parent = path.parentPath.node; + const expression = types.functionExpression( + node.id, + node.params, + node.body, ); path.replaceWith( - types.callExpression(node.callee, [ - transpiled, + types.variableDeclaration('const', [ + types.variableDeclarator( + node.id, + functionToTranspiled(expression, parent), + ), ]), ); - path.skip(); } - } + }, + }, + + CallExpression: { + exit(path) { + const node = path.node; + + if (isShellImplementationCall(node, ctx)) { + const implementation = node.arguments[0]; + + if ( + implementation && + (implementation.type === 'FunctionExpression' || + implementation.type === 'ArrowFunctionExpression') + ) { + const transpiled = functionToTranspiled( + implementation, + null, + ) as babel.CallExpression; + + path.replaceWith( + types.callExpression(node.callee, [ + transpiled, + ]), + ); + + path.skip(); + } + } + }, }, }; } diff --git a/packages/unplugin-typegpu/src/common.ts b/packages/unplugin-typegpu/src/common.ts index f7fb832d31..ccbc52c766 100644 --- a/packages/unplugin-typegpu/src/common.ts +++ b/packages/unplugin-typegpu/src/common.ts @@ -323,3 +323,14 @@ export const useGpuDirective = 'use gpu'; /** Regular expressions used for early pruning (to avoid unnecessary parsing, which is expensive) */ export const earlyPruneRegex = [/["']use gpu["']/, /t(ype)?gpu/]; + +export const operators = { + '+': '__tsover_add', + '-': '__tsover_sub', + '*': '__tsover_mul', + '/': '__tsover_div', + '+=': '__tsover_add', + '-=': '__tsover_sub', + '*=': '__tsover_mul', + '/=': '__tsover_div', +}; diff --git a/packages/unplugin-typegpu/src/rollup-impl.ts b/packages/unplugin-typegpu/src/rollup-impl.ts index 7469ade2c6..2bdebb7957 100644 --- a/packages/unplugin-typegpu/src/rollup-impl.ts +++ b/packages/unplugin-typegpu/src/rollup-impl.ts @@ -9,6 +9,7 @@ import { gatherTgpuAliases, getFunctionName, isShellImplementationCall, + operators, type Options, performExpressionNaming, useGpuDirective, @@ -183,6 +184,44 @@ export const rollUpImpl = (rawOptions: Options) => { const { params, body, externalNames } = transpileFn(def); const isFunctionStatement = def.type === 'FunctionDeclaration'; + walk(def as Node, { + leave(_node) { + const node = _node as acorn.AnyNode; + + if (node.type === 'AssignmentExpression') { + const runtimeFn = + operators[node.operator as keyof typeof operators]; + + if (runtimeFn) { + const left = node.left; + const right = node.right; + + const lhs = magicString.sliceNode(left); + const rhs = magicString.sliceNode(right); + magicString.overwriteNode( + node, + `${lhs} = ${runtimeFn}(${lhs}, ${rhs})`, + ); + } + } else if (node.type === 'BinaryExpression') { + const runtimeFn = + operators[node.operator as keyof typeof operators]; + + if (runtimeFn) { + const left = node.left; + const right = node.right; + + const lhs = magicString.sliceNode(left); + const rhs = magicString.sliceNode(right); + magicString.overwriteNode( + node, + `${runtimeFn}(${lhs}, ${rhs})`, + ); + } + } + }, + }); + if ( isFunctionStatement && name && diff --git a/packages/unplugin-typegpu/test/tgsl-transpiling.test.ts b/packages/unplugin-typegpu/test/tgsl-transpiling.test.ts index 73e6f5933e..6c77485c9f 100644 --- a/packages/unplugin-typegpu/test/tgsl-transpiling.test.ts +++ b/packages/unplugin-typegpu/test/tgsl-transpiling.test.ts @@ -256,8 +256,8 @@ describe('[ROLLUP] plugin for transpiling tgsl functions to tinyest', () => { .computeFn({ in: { num: d.builtin.numWorkgroups }, workgroupSize: [1] })((($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((input) => { const tmp = counter.$.x; counter.$.x = counter.$.y; - counter.$.y += tmp; - counter.$.z += d.f32(input.num.x); + counter.$.y = __tsover_add(counter.$.y, tmp); + counter.$.z = __tsover_add(counter.$.z, d.f32(input.num.x)); }), { v: 1, name: undefined, @@ -298,6 +298,7 @@ describe('[ROLLUP] plugin for transpiling tgsl functions to tinyest', () => { }) && $.f)({}))); tgpu.fn([])((($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (() => { + __tsover_add(2, 2); }), { v: 1, name: undefined, diff --git a/packages/unplugin-typegpu/test/use-gpu-directive.test.ts b/packages/unplugin-typegpu/test/use-gpu-directive.test.ts index c632b44e98..2ea4f848fe 100644 --- a/packages/unplugin-typegpu/test/use-gpu-directive.test.ts +++ b/packages/unplugin-typegpu/test/use-gpu-directive.test.ts @@ -21,7 +21,7 @@ describe('[BABEL] "use gpu" directive', () => { const addGPU = ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (a, b) => { 'use gpu'; - return a + b; + return __tsover_add(a, b); }, { v: 1, name: "addGPU", @@ -58,7 +58,7 @@ describe('[BABEL] "use gpu" directive', () => { shell(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (a, b) => { 'use gpu'; - return a + b; + return __tsover_add(a, b); }, { v: 1, name: void 0, @@ -95,7 +95,7 @@ describe('[BABEL] "use gpu" directive', () => { shell(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = function (a, b) { 'use gpu'; - return a + b; + return __tsover_add(a, b); }, { v: 1, name: void 0, @@ -132,7 +132,7 @@ describe('[BABEL] "use gpu" directive', () => { shell(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = function addGPU(a, b) { 'use gpu'; - return a + b; + return __tsover_add(a, b); }, { v: 1, name: "addGPU", @@ -284,6 +284,35 @@ describe('[BABEL] "use gpu" directive', () => { ;" `); }); + + it('transforms numeric operations', async () => { + const code = `\ + import tgpu from 'typegpu'; + + const main = (a, b) => { + 'use gpu'; + let c = a + b + 2; + c += 2 * b; + }; + `; + + expect(babelTransform(code)).toMatchInlineSnapshot(` + "import tgpu from 'typegpu'; + const main = ($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (a, b) => { + 'use gpu'; + + let c = __tsover_add(__tsover_add(a, b), 2); + c = __tsover_add(c, __tsover_mul(2, b)); + }, { + v: 1, + name: "main", + ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[12,"c",[1,[1,"a","+","b"],"+",[5,"2"]]],[2,"c","+=",[1,[5,"2"],"*","b"]]]],"externalNames":[]}, + externals: () => { + return {}; + } + }) && $.f)({});" + `); + }); }); describe('[ROLLUP] "use gpu" directive', () => { @@ -320,7 +349,7 @@ describe('[ROLLUP] "use gpu" directive', () => { const addGPU = (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((a, b) => { 'use gpu'; - return a + b; + return __tsover_add(a, b); }), { v: 1, name: "addGPU", @@ -362,7 +391,7 @@ describe('[ROLLUP] "use gpu" directive', () => { shell((($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((a, b) => { 'use gpu'; - return a + b; + return __tsover_add(a, b); }), { v: 1, name: undefined, @@ -399,7 +428,7 @@ describe('[ROLLUP] "use gpu" directive', () => { shell((($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (function(a, b){ 'use gpu'; - return a + b; + return __tsover_add(a, b); }), { v: 1, name: undefined, @@ -437,7 +466,7 @@ describe('[ROLLUP] "use gpu" directive', () => { shell((($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (function addGPU(a, b){ 'use gpu'; - return a + b; + return __tsover_add(a, b); }), { v: 1, name: "addGPU", @@ -458,7 +487,7 @@ describe('[ROLLUP] "use gpu" directive', () => { function addGPU(a, b) { 'use gpu'; - return a + b; + return a + b * 3; } console.log(addGPU); @@ -475,11 +504,11 @@ describe('[ROLLUP] "use gpu" directive', () => { const addGPU = (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (function addGPU(a, b) { 'use gpu'; - return a + b; + return __tsover_add(a, __tsover_mul(b, 3)); }), { v: 1, name: "addGPU", - ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","+","b"]]]],"externalNames":[]}, + ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[10,[1,"a","+",[1,"b","*",[5,"3"]]]]]],"externalNames":[]}, externals: () => ({}), }) && $.f)({})); @@ -579,7 +608,7 @@ describe('[ROLLUP] "use gpu" directive', () => { expect(await rollupTransform(code)).toMatchInlineSnapshot(` "(($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (function add(a, b) { 'use gpu'; - return a + b; + return __tsover_add(a, b); }), { v: 1, name: "add", @@ -607,4 +636,32 @@ describe('[ROLLUP] "use gpu" directive', () => { " `); }); + + it('transforms numeric operations', async () => { + const code = `\ + import tgpu from 'typegpu'; + + const main = (a, b) => { + 'use gpu'; + let c = a + b + 2; + c += 2 * b; + }; + `; + + expect(await rollupTransform(code)).toMatchInlineSnapshot(` + "import 'typegpu'; + + (($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = ((a, b) => { + 'use gpu'; + let c = __tsover_add(__tsover_add(a, b), 2); + c = __tsover_add(c, __tsover_mul(2, b)); + }), { + v: 1, + name: "main", + ast: {"params":[{"type":"i","name":"a"},{"type":"i","name":"b"}],"body":[0,[[12,"c",[1,[1,"a","+","b"],"+",[5,"2"]]],[2,"c","+=",[1,[5,"2"],"*","b"]]]],"externalNames":[]}, + externals: () => ({}), + }) && $.f)({})); + " + `); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d4c9040acb..a3dd1521ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,12 +41,10 @@ catalogs: '@webgpu/types': specifier: ^0.1.66 version: 0.1.66 - typescript: - specifier: ^5.9.3 - version: 5.9.3 overrides: rollup: 4.34.8 + typescript: npm:tsover@^5.9.5 three: ^0.181.0 importers: @@ -58,7 +56,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -81,8 +79,8 @@ importers: specifier: ^0.0.62 version: 0.0.62 typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unplugin-typegpu: specifier: workspace:* version: link:packages/unplugin-typegpu @@ -91,7 +89,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -102,8 +100,8 @@ importers: specifier: 'workspace:' version: link:../../packages/typegpu typescript: - specifier: ^5 - version: 5.8.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unplugin-typegpu: specifier: 'workspace:' version: link:../../packages/unplugin-typegpu @@ -138,16 +136,16 @@ importers: version: 0.25.10 ts-loader: specifier: ^9.5.4 - version: 9.5.4(typescript@5.9.3)(webpack@5.104.1) + version: 9.5.4(tsover@5.9.5)(webpack@5.104.1) tsdown: specifier: ^0.15.6 - version: 0.15.12(typescript@5.9.3)(unrun@0.2.27) + version: 0.15.12(tsover@5.9.5)(unrun@0.2.27) tsx: specifier: ^4.19.2 version: 4.20.6 typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 webpack: specifier: ^5.102.0 version: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) @@ -159,7 +157,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.8.0)(typescript@5.9.3) + version: 0.9.4(prettier@3.8.0)(tsover@5.9.5) '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.10.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -168,13 +166,13 @@ importers: version: 3.7.0 '@astrojs/starlight': specifier: ^0.36.1 - version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/starlight-tailwind': specifier: ^4.0.1 - version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(tailwindcss@4.1.11) + version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@4.1.11) + version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) '@babel/standalone': specifier: ^7.28.6 version: 7.28.6 @@ -231,13 +229,13 @@ importers: version: 2.1.28 astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) classnames: specifier: ^2.5.1 version: 2.5.1 expressive-code-twoslash: specifier: ^0.5.3 - version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(typescript@5.9.3) + version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.5) fuse.js: specifier: catalog:frontend version: 7.1.0 @@ -291,10 +289,10 @@ importers: version: 0.34.2 starlight-blog: specifier: ^0.23.2 - version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) starlight-typedoc: specifier: ^0.19.0 - version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(typescript@5.9.3)))(typedoc@0.27.9(typescript@5.9.3)) + version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)))(typedoc@0.27.9(tsover@5.9.5)) three: specifier: ^0.181.0 version: 0.181.2 @@ -303,16 +301,16 @@ importers: version: 3.1.1 typedoc: specifier: ^0.27.9 - version: 0.27.9(typescript@5.9.3) + version: 0.27.9(tsover@5.9.5) typedoc-plugin-markdown: specifier: 4.3.0 - version: 4.3.0(typedoc@0.27.9(typescript@5.9.3)) + version: 4.3.0(typedoc@0.27.9(tsover@5.9.5)) typegpu: specifier: workspace:* version: link:../../packages/typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unplugin-typegpu: specifier: workspace:* version: link:../../packages/unplugin-typegpu @@ -349,7 +347,7 @@ importers: version: 0.1.66 astro-vtbot: specifier: ^2.1.10 - version: 2.1.10(prettier@3.8.0)(typescript@5.9.3) + version: 2.1.10(prettier@3.8.0)(tsover@5.9.5) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -373,23 +371,23 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.53.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) devDependencies: '@types/node': specifier: ^25.0.10 version: 25.1.0 '@typescript-eslint/rule-tester': specifier: ^8.53.1 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 vitest: specifier: ^4.0.17 - version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -447,10 +445,10 @@ importers: version: link:../tgpu-dev-cli tsdown: specifier: catalog:build - version: 0.20.3(typescript@5.9.3) + version: 0.20.3(tsover@5.9.5) typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 publishDirectory: dist packages/tinyest-for-wgsl: @@ -473,10 +471,10 @@ importers: version: 8.14.1 tsdown: specifier: catalog:build - version: 0.20.3(typescript@5.9.3) + version: 0.20.3(tsover@5.9.5) typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 publishDirectory: dist packages/typegpu: @@ -484,13 +482,16 @@ importers: tinyest: specifier: workspace:~0.2.0 version: link:../tinyest + tsover-runtime: + specifier: ^0.0.2 + version: 0.0.2 typed-binary: specifier: ^4.3.1 version: 4.3.2 devDependencies: '@ark/attest': specifier: ^0.56.0 - version: 0.56.0(typescript@5.9.3) + version: 0.56.0(tsover@5.9.5) '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli @@ -508,10 +509,10 @@ importers: version: 27.0.0(canvas@3.2.0)(postcss@8.5.6) tsdown: specifier: catalog:build - version: 0.20.3(typescript@5.9.3) + version: 0.20.3(tsover@5.9.5) typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -532,11 +533,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.5) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -576,11 +577,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.5) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -598,11 +599,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.5) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -620,11 +621,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.5) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -649,11 +650,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.5) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -730,10 +731,10 @@ importers: version: 4.34.8 tsdown: specifier: catalog:build - version: 0.20.3(typescript@5.9.3) + version: 0.20.3(tsover@5.9.5) typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.5 + version: tsover@5.9.5 publishDirectory: dist packages: @@ -6904,6 +6905,13 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsover-runtime@0.0.2: + resolution: {integrity: sha512-H5CM5cg1aBobvrp7q80iLzxoSlvAQvIVHWBSkod68OeqzwFXWEYiNywOnesH7gT86De/xxYdOjCihXA4vR4BPg==} + + tsover@5.9.5: + resolution: {integrity: sha512-pwheV1NLujdWnj25CHFhmzZDCuga4jYj6xV4lxu20OjGJUwXMYX/jWEaRODgUUsRZuRPSSAiCR04sxtvShsPuw==} + hasBin: true + tsx@4.20.6: resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} engines: {node: '>=18.0.0'} @@ -6965,11 +6973,6 @@ packages: typescript-auto-import-cache@0.3.6: resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -7818,16 +7821,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/attest@0.56.0(typescript@5.9.3)': + '@ark/attest@0.56.0(tsover@5.9.5)': dependencies: '@ark/fs': 0.56.0 '@ark/util': 0.56.0 '@prettier/sync': 0.6.1(prettier@3.6.2) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(typescript@5.9.3) + '@typescript/vfs': 1.6.1(tsover@5.9.5) arktype: 2.1.28 prettier: 3.6.2 - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color @@ -7857,23 +7860,23 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@astrojs/check@0.9.4(prettier@3.8.0)(typescript@5.9.3)': + '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.5)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.8.0)(typescript@5.9.3) + '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.5) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.9.3 + typescript: tsover@5.9.5 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.6(prettier@3.8.0)(typescript@5.9.3)': + '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.5)': dependencies: - '@astrojs/language-server': 2.16.3(prettier@3.8.0)(typescript@5.9.3) + '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.5) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.9.3 + typescript: tsover@5.9.5 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -7887,12 +7890,12 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/language-server@2.15.4(prettier@3.8.0)(typescript@5.9.3)': + '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.5)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.11(typescript@5.9.3) + '@volar/kit': 2.4.11(tsover@5.9.5) '@volar/language-core': 2.4.11 '@volar/language-server': 2.4.11 '@volar/language-service': 2.4.11 @@ -7912,12 +7915,12 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/language-server@2.16.3(prettier@3.8.0)(typescript@5.9.3)': + '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.5)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.27(typescript@5.9.3) + '@volar/kit': 2.4.27(tsover@5.9.5) '@volar/language-core': 2.4.27 '@volar/language-server': 2.4.27 '@volar/language-service': 2.4.27 @@ -8015,12 +8018,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))': + '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -8076,22 +8079,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: 4.1.11 - '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))': + '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.6 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) - astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) + astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -8114,9 +8117,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) autoprefixer: 10.4.21(postcss@8.5.3) postcss: 8.5.3 postcss-load-config: 4.0.2(postcss@8.5.3) @@ -10061,32 +10064,32 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.54.0(tsover@5.9.5)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.5) '@typescript-eslint/types': 8.54.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': dependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) ajv: 6.12.6 eslint: 9.39.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 @@ -10101,35 +10104,35 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.5)': dependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.5)': dependencies: - '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.54.0(tsover@5.9.5) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.5) '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(tsover@5.9.5) + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) eslint: 9.39.2(jiti@2.6.1) - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color @@ -10149,10 +10152,10 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@typescript/vfs@1.6.1(typescript@5.9.3)': + '@typescript/vfs@1.6.1(tsover@5.9.5)': dependencies: debug: 4.4.3 - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color @@ -10174,6 +10177,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + dependencies: + '@testing-library/dom': 10.4.0 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 3.2.4 + magic-string: 0.30.17 + sirv: 3.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 @@ -10190,6 +10210,7 @@ snapshots: - msw - utf-8-validate - vite + optional: true '@vitest/coverage-v8@3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4)': dependencies: @@ -10205,9 +10226,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -10228,6 +10249,15 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.5) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 @@ -10237,13 +10267,13 @@ snapshots: msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.5) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': @@ -10294,21 +10324,21 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@volar/kit@2.4.11(typescript@5.9.3)': + '@volar/kit@2.4.11(tsover@5.9.5)': dependencies: '@volar/language-service': 2.4.11 '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 - typescript: 5.9.3 + typescript: tsover@5.9.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - '@volar/kit@2.4.27(typescript@5.9.3)': + '@volar/kit@2.4.27(tsover@5.9.5)': dependencies: '@volar/language-service': 2.4.27 '@volar/typescript': 2.4.27 typesafe-path: 0.2.2 - typescript: 5.9.3 + typescript: tsover@5.9.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -10388,9 +10418,9 @@ snapshots: '@vtbag/element-crossing@1.1.0': {} - '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(typescript@5.9.3)': + '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.5)': dependencies: - '@astrojs/check': 0.9.6(prettier@3.8.0)(typescript@5.9.3) + '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.5) transitivePeerDependencies: - prettier - prettier-plugin-astro @@ -10606,9 +10636,9 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): + astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) rehype-expressive-code: 0.41.2 astro-remote@0.3.3: @@ -10619,11 +10649,11 @@ snapshots: marked-smartypants: 1.1.9(marked@12.0.2) ultrahtml: 1.6.0 - astro-vtbot@2.1.10(prettier@3.8.0)(typescript@5.9.3): + astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.5): dependencies: '@vtbag/cam-shaft': 1.0.6 '@vtbag/element-crossing': 1.1.0 - '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(typescript@5.9.3) + '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.5) '@vtbag/turn-signal': 1.3.1 '@vtbag/utensil-drawer': 1.2.14 transitivePeerDependencies: @@ -10631,7 +10661,7 @@ snapshots: - prettier-plugin-astro - typescript - astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): + astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -10681,7 +10711,7 @@ snapshots: smol-toml: 1.6.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(typescript@5.9.3) + tsconfck: 3.1.6(tsover@5.9.5) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 @@ -10694,7 +10724,7 @@ snapshots: yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) - zod-to-ts: 1.2.0(typescript@5.9.3)(zod@3.25.76) + zod-to-ts: 1.2.0(tsover@5.9.5)(zod@3.25.76) optionalDependencies: sharp: 0.34.2 transitivePeerDependencies: @@ -11385,7 +11415,7 @@ snapshots: glob: 10.5.0 ora: 5.4.1 tslib: 2.8.1 - typescript: 5.9.3 + typescript: tsover@5.9.5 yargs: 17.7.2 dset@3.1.4: {} @@ -11682,15 +11712,15 @@ snapshots: expect-type@1.3.0: {} - expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(typescript@5.9.3): + expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.5): dependencies: '@expressive-code/core': 0.41.2 expressive-code: 0.41.2 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 - twoslash: 0.2.12(typescript@5.9.3) - typescript: 5.9.3 + twoslash: 0.2.12(tsover@5.9.5) + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color @@ -13119,7 +13149,7 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mkdist@2.2.0(typescript@5.9.3): + mkdist@2.2.0(tsover@5.9.5): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) citty: 0.1.6 @@ -13135,7 +13165,7 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 mlly@1.8.0: dependencies: @@ -13171,6 +13201,32 @@ snapshots: ms@2.1.3: {} + msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.21(@types/node@25.1.0) + '@mswjs/interceptors': 0.39.8 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.41.0 + yargs: 17.7.2 + optionalDependencies: + typescript: tsover@5.9.5 + transitivePeerDependencies: + - '@types/node' + optional: true + msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -14052,7 +14108,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(typescript@5.9.3): + rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.5): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.6 @@ -14065,11 +14121,11 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-beta.45 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(typescript@5.9.3): + rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.5): dependencies: '@babel/generator': 8.0.0-rc.1 '@babel/helper-validator-identifier': 8.0.0-rc.1 @@ -14082,7 +14138,7 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-rc.3 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - oxc-resolver @@ -14147,11 +14203,11 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - rollup-plugin-dts@6.1.1(rollup@4.34.8)(typescript@5.9.3): + rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.5): dependencies: magic-string: 0.30.21 rollup: 4.34.8 - typescript: 5.9.3 + typescript: tsover@5.9.5 optionalDependencies: '@babel/code-frame': 7.27.1 @@ -14334,12 +14390,12 @@ snapshots: stackback@0.0.2: {} - starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)): + starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/rss': 4.0.11 - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) astro-remote: 0.3.3 github-slugger: 2.0.0 marked: 15.0.7 @@ -14351,12 +14407,12 @@ snapshots: - astro - supports-color - starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(typescript@5.9.3)))(typedoc@0.27.9(typescript@5.9.3)): + starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)))(typedoc@0.27.9(tsover@5.9.5)): dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) github-slugger: 2.0.0 - typedoc: 0.27.9(typescript@5.9.3) - typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(typescript@5.9.3)) + typedoc: 0.27.9(tsover@5.9.5) + typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.5)) state-local@1.0.7: {} @@ -14582,25 +14638,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.4.0(tsover@5.9.5): dependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 - ts-loader@9.5.4(typescript@5.9.3)(webpack@5.104.1): + ts-loader@9.5.4(tsover@5.9.5)(webpack@5.104.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.4 - typescript: 5.9.3 + typescript: tsover@5.9.5 webpack: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) - tsconfck@3.1.6(typescript@5.9.3): + tsconfck@3.1.6(tsover@5.9.5): optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 - tsdown@0.15.12(typescript@5.9.3)(unrun@0.2.27): + tsdown@0.15.12(tsover@5.9.5)(unrun@0.2.27): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14610,14 +14666,14 @@ snapshots: empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.45 - rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(typescript@5.9.3) + rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.5) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.4.2 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 unrun: 0.2.27 transitivePeerDependencies: - '@ts-macro/tsc' @@ -14626,7 +14682,7 @@ snapshots: - supports-color - vue-tsc - tsdown@0.20.3(typescript@5.9.3): + tsdown@0.20.3(tsover@5.9.5): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14637,7 +14693,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.3 rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(typescript@5.9.3) + rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.5) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 @@ -14645,7 +14701,7 @@ snapshots: unconfig-core: 7.4.2 unrun: 0.2.27 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -14655,6 +14711,16 @@ snapshots: tslib@2.8.1: {} + tsover-runtime@0.0.2: + dependencies: + minimatch: 9.0.5 + unplugin: 2.3.5 + + tsover@5.9.5: + dependencies: + minimatch: 9.0.5 + unplugin: 2.3.5 + tsx@4.20.6: dependencies: esbuild: 0.25.10 @@ -14671,11 +14737,11 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(typescript@5.9.3): + twoslash@0.2.12(tsover@5.9.5): dependencies: - '@typescript/vfs': 1.6.1(typescript@5.9.3) + '@typescript/vfs': 1.6.1(tsover@5.9.5) twoslash-protocol: 0.2.12 - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - supports-color @@ -14691,17 +14757,17 @@ snapshots: typed-binary@4.3.2: {} - typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(typescript@5.9.3)): + typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)): dependencies: - typedoc: 0.27.9(typescript@5.9.3) + typedoc: 0.27.9(tsover@5.9.5) - typedoc@0.27.9(typescript@5.9.3): + typedoc@0.27.9(tsover@5.9.5): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.3 + typescript: tsover@5.9.5 yaml: 2.8.1 typesafe-path@0.2.2: {} @@ -14714,9 +14780,8 @@ snapshots: dependencies: semver: 7.7.3 - typescript@5.8.3: {} - - typescript@5.9.3: {} + typescript@5.9.3: + optional: true uc.micro@2.1.0: {} @@ -14724,7 +14789,7 @@ snapshots: ultrahtml@1.6.0: {} - unbuild@3.5.0(typescript@5.9.3): + unbuild@3.5.0(tsover@5.9.5): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) '@rollup/plugin-commonjs': 28.0.3(rollup@4.34.8) @@ -14740,18 +14805,18 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.2.0(typescript@5.9.3) + mkdist: 2.2.0(tsover@5.9.5) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.1.0 pretty-bytes: 6.1.1 rollup: 4.34.8 - rollup-plugin-dts: 6.1.1(rollup@4.34.8)(typescript@5.9.3) + rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.5) scule: 1.3.0 tinyglobby: 0.2.15 untyped: 2.0.0 optionalDependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 transitivePeerDependencies: - sass - vue @@ -15071,6 +15136,50 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 25.1.0 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 @@ -15115,10 +15224,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -15571,9 +15680,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): + zod-to-ts@1.2.0(tsover@5.9.5)(zod@3.25.76): dependencies: - typescript: 5.9.3 + typescript: tsover@5.9.5 zod: 3.25.76 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 19499a81a8..66439eb64a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,7 +11,7 @@ catalogs: unbuild: ^3.5.0 jiti: ^2.6.0 types: - typescript: ^5.9.3 + typescript: npm:tsover@^5.9.5 '@webgpu/types': ^0.1.66 '@types/three': '^0.181.0' test: From a4c479deadc587a76718c1df7621e011484842a4 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Sat, 14 Feb 2026 07:01:36 +0100 Subject: [PATCH 03/23] [tsover] Rewrote XorDev Centrifuge 2 to use tsover --- .../rendering/xor-dev-centrifuge-2/index.ts | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts b/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts index c2cc43bf40..27696880d1 100644 --- a/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts @@ -12,7 +12,7 @@ import tgpu, { d } from 'typegpu'; // deno-fmt-ignore: just a list of standard functions -import { abs, atan2, cos, gt, length, normalize, select, sign, sub, tanh } from 'typegpu/std'; +import { abs, atan2, cos, gt, length, normalize, select, sign, tanh } from 'typegpu/std'; import { defineControls } from '../../common/defineControls.ts'; // NOTE: Some APIs are still unstable (are being finalized based on feedback), but @@ -32,16 +32,20 @@ const safeTanh = (v: d.v3f) => { // shaders, etc. const root = await tgpu.init(); -// Uniforms are used to send read-only data to the GPU -const time = root.createUniform(d.f32); -const aspectRatio = root.createUniform(d.f32); +const Params = d.struct({ + time: d.f32, + aspectRatio: d.f32, -const cameraPos = root.createUniform(d.vec2f); -const tunnelDepth = root.createUniform(d.i32); -const bigStrips = root.createUniform(d.f32); -const smallStrips = root.createUniform(d.f32); -const dollyZoom = root.createUniform(d.f32); -const color = root.createUniform(d.vec3f); + cameraPos: d.vec2f, + tunnelDepth: d.i32, + bigStrips: d.f32, + smallStrips: d.f32, + dollyZoom: d.f32, + color: d.vec3f, +}); + +// Uniforms are used to send read-only data to the GPU +const paramsUniform = root.createUniform(Params); const tunnelRadius = 11; const moveSpeed = 5; @@ -50,31 +54,33 @@ const fragmentMain = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })(({ uv }) => { - const ratio = d.vec2f(aspectRatio.$, 1); - const dir = normalize(d.vec3f(uv.mul(ratio), -1)); + 'use gpu'; + const params = paramsUniform.$; + const ratio = d.vec2f(params.aspectRatio, 1); + const dir = normalize(d.vec3f(uv * ratio, -1)); let z = d.f32(0); let acc = d.vec3f(); - for (let i = 0; i < tunnelDepth.$; i++) { - const p = dir.mul(z); - p.x += cameraPos.$.x; - p.y += cameraPos.$.y; + for (let i = 0; i < params.tunnelDepth; i++) { + const p = dir * z; + p.x += params.cameraPos.x; + p.y += params.cameraPos.y; const coords = d.vec3f( - atan2(p.y, p.x) * bigStrips.$ + time.$, - p.z * dollyZoom.$ - moveSpeed * time.$, + atan2(p.y, p.x) * params.bigStrips + params.time, + p.z * params.dollyZoom - moveSpeed * params.time, length(p.xy) - tunnelRadius, ); - const coords2 = cos(coords.add(cos(coords.mul(smallStrips.$)))).sub(1); + const coords2 = cos(coords + cos(coords * params.smallStrips)) - 1; const dd = length(d.vec4f(coords.z, coords2)) * 0.5 - 0.1; - acc = acc.add(sub(1.2, cos(color.$.mul(p.z))).div(dd)); + acc = acc + (1.2 - cos(params.color * p.z)) / dd; z += dd; } // Tone mapping - acc = safeTanh(acc.mul(0.005)); + acc = safeTanh(acc * 0.005); return d.vec4f(acc, 1); }); @@ -107,8 +113,10 @@ let isRunning = true; function draw(timestamp: number) { if (!isRunning) return; - aspectRatio.write(canvas.clientWidth / canvas.clientHeight); - time.write((timestamp * 0.001) % 1000); + paramsUniform.writePartial({ + aspectRatio: canvas.clientWidth / canvas.clientHeight, + time: (timestamp * 0.001) % 1000, + }); pipeline .withColorAttachment({ view: context }) @@ -128,7 +136,7 @@ export const controls = defineControls({ max: 200, step: 1, onSliderChange(v: number) { - tunnelDepth.write(v); + paramsUniform.writePartial({ tunnelDepth: v }); }, }, 'big strips': { @@ -137,7 +145,7 @@ export const controls = defineControls({ max: 60, step: 0.01, onSliderChange(v: number) { - bigStrips.write(v); + paramsUniform.writePartial({ bigStrips: v }); }, }, 'small strips': { @@ -146,7 +154,7 @@ export const controls = defineControls({ max: 10, step: 0.01, onSliderChange(v: number) { - smallStrips.write(v); + paramsUniform.writePartial({ smallStrips: v }); }, }, 'dolly zoom': { @@ -155,7 +163,7 @@ export const controls = defineControls({ max: 1, step: 0.01, onSliderChange(v: number) { - dollyZoom.write(v); + paramsUniform.writePartial({ dollyZoom: v }); }, }, 'camera pos': { @@ -164,13 +172,13 @@ export const controls = defineControls({ initial: d.vec2f(0, -7), step: d.vec2f(0.01, 0.01), onVectorSliderChange(v) { - cameraPos.write(v); + paramsUniform.writePartial({ cameraPos: v }); }, }, color: { initial: d.vec3f(0.2, 0, 0.3), onColorChange(value) { - color.write(value); + paramsUniform.writePartial({ color: value }); }, }, }); From 6cdbccb4c9cf79d2d76945d21631d3d97adcbaab Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Wed, 18 Feb 2026 13:25:31 +0100 Subject: [PATCH 04/23] De-tsover transform script --- apps/typegpu-docs/.gitignore | 4 + apps/typegpu-docs/package.json | 6 +- .../scripts/transform-overloads.ts | 293 ++++++++++++++++++ .../rendering/xor-dev-centrifuge-2/index.ts | 2 +- pnpm-lock.yaml | 23 +- 5 files changed, 309 insertions(+), 19 deletions(-) create mode 100644 apps/typegpu-docs/scripts/transform-overloads.ts diff --git a/apps/typegpu-docs/.gitignore b/apps/typegpu-docs/.gitignore index b15ba8429a..52cb68c9c7 100644 --- a/apps/typegpu-docs/.gitignore +++ b/apps/typegpu-docs/.gitignore @@ -26,3 +26,7 @@ src/content/docs/api # tests tests/artifacts !tests/artifacts/README.md + +# generated transformed files +*.tsnotover.ts +*.tsnotover.tsx diff --git a/apps/typegpu-docs/package.json b/apps/typegpu-docs/package.json index 51bc663e03..7045152623 100644 --- a/apps/typegpu-docs/package.json +++ b/apps/typegpu-docs/package.json @@ -4,8 +4,9 @@ "version": "0.0.1", "private": true, "scripts": { - "dev": "astro dev", - "build": "astro check && astro build", + "transform-overloads": "find . -type f -name '*.tsnotover.ts' -delete && node scripts/transform-overloads.ts", + "dev": "pnpm run transform-overloads && astro dev", + "build": "pnpm run transform-overloads && astro check && astro build", "test:types": "astro check", "preview": "astro preview", "astro": "astro" @@ -78,6 +79,7 @@ "@webgpu/types": "catalog:types", "astro-vtbot": "^2.1.10", "autoprefixer": "^10.4.21", + "magic-string": "^0.30.21", "tailwindcss": "^4.1.11", "tailwindcss-motion": "^1.1.1", "vite-imagetools": "catalog:frontend", diff --git a/apps/typegpu-docs/scripts/transform-overloads.ts b/apps/typegpu-docs/scripts/transform-overloads.ts new file mode 100644 index 0000000000..b3fa637b4a --- /dev/null +++ b/apps/typegpu-docs/scripts/transform-overloads.ts @@ -0,0 +1,293 @@ +import ts from 'typescript'; +import MagicString from 'magic-string'; +import { readdir } from 'fs/promises'; +import { basename, dirname, extname, join, relative } from 'path'; +import { fileURLToPath } from 'url'; +import { writeFile } from 'fs/promises'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const projectRoot = join(__dirname, '..'); +const examplesDir = join(projectRoot, 'src', 'examples'); + +const operatorToMethod: Record = { + [ts.SyntaxKind.PlusToken]: 'add', + [ts.SyntaxKind.MinusToken]: 'sub', + [ts.SyntaxKind.AsteriskToken]: 'mul', + [ts.SyntaxKind.SlashToken]: 'div', +}; + +const compoundToBaseOperator: Record = { + [ts.SyntaxKind.PlusEqualsToken]: ts.SyntaxKind.PlusToken, + [ts.SyntaxKind.MinusEqualsToken]: ts.SyntaxKind.MinusToken, + [ts.SyntaxKind.AsteriskEqualsToken]: ts.SyntaxKind.AsteriskToken, + [ts.SyntaxKind.SlashEqualsToken]: ts.SyntaxKind.SlashToken, +}; + +async function findTypeScriptFiles(dir: string): Promise { + const files: string[] = []; + + async function walk(currentDir: string): Promise { + const entries = await readdir(currentDir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = join(currentDir, entry.name); + + if (entry.isDirectory()) { + await walk(fullPath); + } else if (entry.isFile()) { + const ext = extname(entry.name); + if ( + (ext === '.ts' || ext === '.tsx') && + !entry.name.endsWith('.d.ts') && + !entry.name.endsWith('.d.tsx') && + !entry.name.endsWith('.tsnotover.ts') && + !entry.name.endsWith('.tsnotover.tsx') + ) { + files.push(fullPath); + } + } + } + } + + await walk(dir); + return files; +} + +function isOverloadedBinary( + node: ts.BinaryExpression, + checker: ts.TypeChecker, +): { isOverloaded: boolean; useLeftMethod: boolean } { + const methodName = operatorToMethod[node.operatorToken.kind]; + if (!methodName) { + return { isOverloaded: false, useLeftMethod: false }; + } + + // Get the types of both operands + const leftType = checker.getTypeAtLocation(node.left); + const rightType = checker.getTypeAtLocation(node.right); + + const overloadType = checker.__tsover__getOverloadReturnType( + node.left, + node.operatorToken.kind, + node.right, + leftType, + rightType, + ); + + if (!overloadType) { + return { isOverloaded: false, useLeftMethod: false }; + } + + // For division, only use left method + if (node.operatorToken.kind === ts.SyntaxKind.SlashToken) { + return { isOverloaded: true, useLeftMethod: true }; + } + + // For other operators, prefer left method, fall back to right + const leftHasMethod = leftType.getProperty(methodName) !== undefined; + + return { isOverloaded: true, useLeftMethod: leftHasMethod }; +} + +function isOverloadedCompoundAssignment( + node: ts.BinaryExpression, + checker: ts.TypeChecker, +): { isOverloaded: boolean; baseOperator: ts.SyntaxKind | undefined } { + const baseOperator = compoundToBaseOperator[node.operatorToken.kind]; + if (!baseOperator) { + return { isOverloaded: false, baseOperator: undefined }; + } + + const methodName = operatorToMethod[baseOperator]; + if (!methodName) { + return { isOverloaded: false, baseOperator: undefined }; + } + + // Get the types of both operands + const leftType = checker.getTypeAtLocation(node.left); + const rightType = checker.getTypeAtLocation(node.right); + + const overloadType = checker.__tsover__getOverloadReturnType( + node.left, + baseOperator, + node.right, + leftType, + rightType, + ); + + if (!overloadType) { + return { isOverloaded: false, baseOperator: undefined }; + } + + // Check if left operand has the method (compound assignment only uses left method) + const leftHasMethod = leftType.getProperty(methodName) !== undefined; + + return { isOverloaded: leftHasMethod, baseOperator }; +} + +function createProgram(allFiles: string[]): ts.Program { + const configPath = join(projectRoot, 'tsconfig.json'); + const configText = ts.sys.readFile(configPath); + + if (!configText) { + throw new Error(`Could not read tsconfig.json at ${configPath}`); + } + + const { config } = ts.parseConfigFileTextToJson(configPath, configText); + const parsedConfig = ts.parseJsonConfigFileContent( + config, + ts.sys, + projectRoot, + ); + + const compilerOptions: ts.CompilerOptions = { + ...parsedConfig.options, + noEmit: true, + }; + + const host = ts.createCompilerHost(compilerOptions, true); + + return ts.createProgram(allFiles, compilerOptions, host); +} + +function transformFile( + sourceFilePath: string, + program: ts.Program, +): { code: string; hasChanges: boolean } { + const checker = program.getTypeChecker(); + const sourceFile = program.getSourceFile(sourceFilePath); + + if (!sourceFile) { + throw new Error(`Could not get source file for ${sourceFilePath}`); + } + + const sourceText = sourceFile.text; + const magic = new MagicString(sourceText); + let hasChanges = false; + + function visit(node: ts.Node): void { + ts.forEachChild(node, visit); + + if (ts.isBinaryExpression(node)) { + const { isOverloaded, useLeftMethod } = isOverloadedBinary(node, checker); + + if (isOverloaded) { + const methodName = operatorToMethod[node.operatorToken.kind]; + if (methodName) { + hasChanges = true; + + const start = node.getStart(); + const end = node.getEnd(); + const leftStart = node.left.getStart(); + const leftEnd = node.left.getEnd(); + const rightStart = node.right.getStart(); + const rightEnd = node.right.getEnd(); + + const leftText = magic.slice(leftStart, leftEnd); + const rightText = magic.slice(rightStart, rightEnd); + + if (useLeftMethod) { + magic.overwrite( + start, + end, + `${leftText}.${methodName}(${rightText})`, + ); + } else { + magic.overwrite( + start, + end, + `${rightText}.${methodName}(${leftText})`, + ); + } + } + } + + // Handle compound assignment operators (+=, -=, *=, /=) + const { isOverloaded: isCompoundOverloaded, baseOperator } = + isOverloadedCompoundAssignment(node, checker); + + if (isCompoundOverloaded && baseOperator) { + const methodName = operatorToMethod[baseOperator]; + if (methodName) { + hasChanges = true; + + const start = node.getStart(); + const end = node.getEnd(); + const leftStart = node.left.getStart(); + const leftEnd = node.left.getEnd(); + const rightStart = node.right.getStart(); + const rightEnd = node.right.getEnd(); + + const leftText = magic.slice(leftStart, leftEnd); + const rightText = magic.slice(rightStart, rightEnd); + + // Transform a += b into a = a.add(b) + magic.overwrite( + start, + end, + `${leftText} = ${leftText}.${methodName}(${rightText})`, + ); + } + } + } + } + + visit(sourceFile); + + return { code: magic.toString(), hasChanges }; +} + +async function main() { + console.log('Finding TypeScript files in examples directory...'); + + const allFiles = await findTypeScriptFiles(examplesDir); + + console.log(`Found ${allFiles.length} files to process`); + console.log('Creating TypeScript program...'); + + const program = createProgram(allFiles); + + console.log('Transforming files...'); + + let transformedCount = 0; + let errorCount = 0; + + for (const filePath of allFiles) { + try { + const { code, hasChanges } = transformFile(filePath, program); + + const ext = filePath.endsWith('.tsx') ? '.tsx' : '.ts'; + const baseName = basename(filePath, ext); + const dir = dirname(filePath); + const outputPath = join(dir, `${baseName}.tsnotover${ext}`); + + if (hasChanges) { + transformedCount++; + await writeFile(outputPath, code, 'utf-8'); + console.log(`Transformed: ${relative(projectRoot, filePath)}`); + } + } catch (error) { + errorCount++; + const errorMessage = error instanceof Error + ? error.message + : String(error); + console.error( + `Error processing ${relative(projectRoot, filePath)}: ${errorMessage}`, + ); + throw new Error( + `Failed to transform ${ + relative(projectRoot, filePath) + }: ${errorMessage}`, + ); + } + } + + console.log( + `\nDone! Transformed ${transformedCount} files, ${errorCount} errors.`, + ); +} + +main().catch((error) => { + console.error('Fatal error:', error); + process.exit(1); +}); diff --git a/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts b/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts index 27696880d1..516d9536e2 100644 --- a/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/xor-dev-centrifuge-2/index.ts @@ -75,7 +75,7 @@ const fragmentMain = tgpu.fragmentFn({ const coords2 = cos(coords + cos(coords * params.smallStrips)) - 1; const dd = length(d.vec4f(coords.z, coords2)) * 0.5 - 0.1; - acc = acc + (1.2 - cos(params.color * p.z)) / dd; + acc += (1.2 - cos(params.color * p.z)) / dd; z += dd; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3dd1521ec..21395c09fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -351,6 +351,9 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) + magic-string: + specifier: ^0.30.21 + version: 0.30.21 tailwindcss: specifier: ^4.1.11 version: 4.1.11 @@ -1898,9 +1901,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -5253,9 +5253,6 @@ packages: resolution: {integrity: sha512-8rbuNizut2gW94kv7pqgt0dvk+AHLPVIm0iJtpSgQJ9dx21eWx5SBel8z3jp1xtC0j6/iyK3AWGhAR1H61s7LA==} engines: {node: '>=20.18.0'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -8932,8 +8929,6 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': @@ -10183,7 +10178,7 @@ snapshots: '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.21 sirv: 3.0.1 tinyrainbow: 2.0.0 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -10200,7 +10195,7 @@ snapshots: '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.21 sirv: 3.0.1 tinyrainbow: 2.0.0 vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -10221,7 +10216,7 @@ snapshots: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.17 + magic-string: 0.30.21 magicast: 0.3.5 std-env: 3.9.0 test-exclude: 7.0.1 @@ -12537,11 +12532,7 @@ snapshots: magic-string-ast@1.0.0: dependencies: - magic-string: 0.30.17 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + magic-string: 0.30.21 magic-string@0.30.21: dependencies: From 8bfc76651dfac8180873cfa120d9116397c39208 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Wed, 18 Feb 2026 18:47:37 +0100 Subject: [PATCH 05/23] Updates to example view code --- .../scripts/transform-overloads.ts | 1 + .../src/components/CodeEditor.tsx | 2 +- .../components/stackblitz/openInStackBlitz.ts | 4 +- .../src/examples/exampleContent.ts | 53 +++++++++++-------- apps/typegpu-docs/src/utils/examples/types.ts | 10 ++++ 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/apps/typegpu-docs/scripts/transform-overloads.ts b/apps/typegpu-docs/scripts/transform-overloads.ts index b3fa637b4a..2367579f12 100644 --- a/apps/typegpu-docs/scripts/transform-overloads.ts +++ b/apps/typegpu-docs/scripts/transform-overloads.ts @@ -278,6 +278,7 @@ async function main() { `Failed to transform ${ relative(projectRoot, filePath) }: ${errorMessage}`, + { cause: error }, ); } } diff --git a/apps/typegpu-docs/src/components/CodeEditor.tsx b/apps/typegpu-docs/src/components/CodeEditor.tsx index 7e3c7b4d7a..a11d327a18 100644 --- a/apps/typegpu-docs/src/components/CodeEditor.tsx +++ b/apps/typegpu-docs/src/components/CodeEditor.tsx @@ -84,7 +84,7 @@ const createCodeEditorComponent = ( > = {}; for (const file of example.tsFiles) { - tsFiles[`src/${file.path}`] = file.content; + tsFiles[`src/${file.path}`] = file.tsnotoverContent ?? file.content; } for (const file of common) { - tsFiles[`src/common/${file.path}`] = file.content; + tsFiles[`src/common/${file.path}`] = file.tsnotoverContent ?? file.content; } for (const key of Object.keys(tsFiles)) { diff --git a/apps/typegpu-docs/src/examples/exampleContent.ts b/apps/typegpu-docs/src/examples/exampleContent.ts index 1e0f2b74df..94133ef2c7 100644 --- a/apps/typegpu-docs/src/examples/exampleContent.ts +++ b/apps/typegpu-docs/src/examples/exampleContent.ts @@ -47,26 +47,13 @@ function pathToExampleKey(path: string): string { ); } -function globToExampleFiles( - record: Record, -): Record { - return R.pipe( - record, - R.mapValues((content, key): ExampleSrcFile => { - const pathRelToExamples = pathe.relative('./', key); - const categoryDir = pathRelToExamples.split('/')[0]; - const exampleDir = pathRelToExamples.split('/')[1]; - const examplePath = pathe.join(categoryDir, exampleDir); - - return { - exampleKey: pathToExampleKey(key), - path: pathe.relative(examplePath, key), - content, - }; - }), - R.values(), - R.groupBy(R.prop('exampleKey')), - ); +function pathToRelativePath(path: string): string { + const pathRelToExamples = pathe.relative('./', path); + const categoryDir = pathRelToExamples.split('/')[0]; + const exampleDir = pathRelToExamples.split('/')[1]; + const examplePath = pathe.join(categoryDir, exampleDir); + + return pathe.relative(examplePath, path); } const metaFiles = R.pipe( @@ -77,6 +64,14 @@ const metaFiles = R.pipe( R.mapKeys(pathToExampleKey), ); +// Files that were generated by stripping away use of overloaded operators in .ts files +// './//.tsnotover.ts' +const exampleTsnotoverFiles = import.meta.glob('./*/*/*.tsnotover.ts', { + query: 'raw', + eager: true, + import: 'default', +}) as Record; + const exampleTsFiles = R.pipe( // './//.ts' import.meta.glob('./*/*/*.ts', { @@ -84,7 +79,15 @@ const exampleTsFiles = R.pipe( eager: true, import: 'default', }) as Record, - globToExampleFiles, + R.entries(), + R.filter(([key]) => !key.endsWith('.tsnotover.ts')), + R.map(([key, content]): ExampleSrcFile => ({ + exampleKey: pathToExampleKey(key), + path: pathToRelativePath(key), + content, + tsnotoverContent: exampleTsnotoverFiles[`${key}notover.ts`], + })), + R.groupBy(R.prop('exampleKey')), ); const tsFilesImportFunctions = R.pipe( @@ -101,7 +104,13 @@ const htmlFiles = R.pipe( eager: true, import: 'default', }) as Record, - globToExampleFiles, + R.entries(), + R.map(([key, content]): ExampleSrcFile => ({ + exampleKey: pathToExampleKey(key), + path: pathToRelativePath(key), + content, + })), + R.groupBy(R.prop('exampleKey')), ); const thumbnailFiles = R.pipe( diff --git a/apps/typegpu-docs/src/utils/examples/types.ts b/apps/typegpu-docs/src/utils/examples/types.ts index 70338722a0..4a4ac99a2e 100644 --- a/apps/typegpu-docs/src/utils/examples/types.ts +++ b/apps/typegpu-docs/src/utils/examples/types.ts @@ -26,6 +26,11 @@ export type ExampleSrcFile = { */ path: string; content: string; + /** + * Stripped down version of the content, without + * overloaded operators (if they were used) + */ + tsnotoverContent?: string | undefined; }; export type ExampleCommonFile = { @@ -35,6 +40,11 @@ export type ExampleCommonFile = { */ path: string; content: string; + /** + * Stripped down version of the content, without + * overloaded operators (if they were used) + */ + tsnotoverContent?: string | undefined; }; export interface ThumbnailPair { From bff5ed117fd517b3e7a34438ad619bfb93a9181c Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Thu, 19 Feb 2026 12:18:37 +0100 Subject: [PATCH 06/23] Runtime operator overloads --- packages/typegpu/src/data/index.ts | 31 ++++++++++++----------- packages/typegpu/src/data/wgslTypes.ts | 34 +++++++++++++------------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/packages/typegpu/src/data/index.ts b/packages/typegpu/src/data/index.ts index b60dc9b0c2..548bb1bb10 100644 --- a/packages/typegpu/src/data/index.ts +++ b/packages/typegpu/src/data/index.ts @@ -4,6 +4,7 @@ // NOTE: This is a barrel file, internal files should not import things from this file +import { Operator } from 'tsover-runtime'; import { type InfixOperator, infixOperators } from '../tgsl/accessProp.ts'; import { MatBase } from './matrix.ts'; import { VecBase } from './vectorImpl.ts'; @@ -11,29 +12,31 @@ import { VecBase } from './vectorImpl.ts'; function assignInfixOperator( object: T, operator: InfixOperator, + operatorSymbol: symbol, ) { - type Instance = InstanceType; - - const proto = object.prototype as { - [K in InfixOperator]?: (this: Instance, other: unknown) => unknown; - }; + // oxlint-disable-next-line typescript/no-explicit-any anything is possible + const proto = object.prototype as any; const opImpl = infixOperators[operator] as ( - lhs: Instance, + lhs: unknown, rhs: unknown, ) => unknown; - proto[operator] = function (this: Instance, other: unknown): unknown { + proto[operator] = function (this: unknown, other: unknown): unknown { return opImpl(this, other); }; + + proto[operatorSymbol] = (lhs: unknown, rhs: unknown): unknown => { + return opImpl(lhs, rhs); + }; } -assignInfixOperator(VecBase, 'add'); -assignInfixOperator(VecBase, 'sub'); -assignInfixOperator(VecBase, 'mul'); -assignInfixOperator(VecBase, 'div'); -assignInfixOperator(MatBase, 'add'); -assignInfixOperator(MatBase, 'sub'); -assignInfixOperator(MatBase, 'mul'); +assignInfixOperator(VecBase, 'add', Operator.plus); +assignInfixOperator(VecBase, 'sub', Operator.minus); +assignInfixOperator(VecBase, 'mul', Operator.star); +assignInfixOperator(VecBase, 'div', Operator.slash); +assignInfixOperator(MatBase, 'add', Operator.plus); +assignInfixOperator(MatBase, 'sub', Operator.minus); +assignInfixOperator(MatBase, 'mul', Operator.star); export { bool, f16, f32, i32, u16, u32 } from './numeric.ts'; export { diff --git a/packages/typegpu/src/data/wgslTypes.ts b/packages/typegpu/src/data/wgslTypes.ts index 3c67d44599..8531ce407c 100644 --- a/packages/typegpu/src/data/wgslTypes.ts +++ b/packages/typegpu/src/data/wgslTypes.ts @@ -58,22 +58,17 @@ export interface NumberArrayView { * but are instead assigned to `VecBase` after both `data` and `std` are initialized. */ export interface vecInfixNotation { - add(other: number): T; - add(other: T): T; - - sub(other: number): T; - sub(other: T): T; - - mul(other: number): T; - mul(other: T): T; - mul(other: mBaseForVec): T; - - div(other: number): T; - div(other: T): T; + add(other: T | number): T; + sub(other: T | number): T; + mul(other: mBaseForVec | T | number): T; + div(other: T | number): T; [Operator.plus](lhs: T | number, rhs: T | number): T; [Operator.minus](lhs: T | number, rhs: T | number): T; - [Operator.star](lhs: T | number, rhs: T | number): T; + [Operator.star]( + lhs: mBaseForVec | T | number, + rhs: mBaseForVec | T | number, + ): T; [Operator.slash](lhs: T, rhs: T | number): T; } @@ -86,12 +81,17 @@ export interface vecInfixNotation { */ export interface matInfixNotation { add(other: T): T; - sub(other: T): T; - - mul(other: number): T; + mul(other: T | number): T; mul(other: vBaseForMat): vBaseForMat; - mul(other: T): T; + + [Operator.plus](lhs: T, rhs: T): T; + [Operator.minus](lhs: T, rhs: T): T; + [Operator.star](lhs: T | number, rhs: T | number): T; + [Operator.star]( + lhs: T | vBaseForMat, + rhs: T | vBaseForMat, + ): vBaseForMat; } /** From a8ff72f3a52160bc10187892979fcdee64d82075 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Thu, 19 Feb 2026 12:18:51 +0100 Subject: [PATCH 07/23] [tsover] Rewrote 3D Fish to use tsover --- .../src/examples/rendering/3d-fish/compute.ts | 61 +++++++------------ .../src/examples/rendering/3d-fish/render.ts | 43 ++++--------- .../rendering/3d-fish/tgsl-helpers.ts | 22 +++---- 3 files changed, 43 insertions(+), 83 deletions(-) diff --git a/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts b/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts index d69c6547e0..2c917155a0 100644 --- a/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts +++ b/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts @@ -20,31 +20,28 @@ export const simulate = (fishIndex: number) => { } const other = layout.$.currentFishData[i]; - const dist = std.length(fishData.position.sub(other.position)); + const dist = std.distance(fishData.position, other.position); if (dist < layout.$.fishBehavior.separationDist) { - separation = separation.add(fishData.position.sub(other.position)); + separation = separation + fishData.position - other.position; } if (dist < layout.$.fishBehavior.alignmentDist) { - alignment = alignment.add(other.direction); + alignment = alignment + other.direction; alignmentCount = alignmentCount + 1; } if (dist < layout.$.fishBehavior.cohesionDist) { - cohesion = cohesion.add(other.position); + cohesion = cohesion + other.position; cohesionCount = cohesionCount + 1; } } if (alignmentCount > 0) { - alignment = alignment.mul(1 / d.f32(alignmentCount)); + alignment = alignment / alignmentCount; } if (cohesionCount > 0) { - cohesion = std.sub( - std.mul(1 / d.f32(cohesionCount), cohesion), - fishData.position, - ); + cohesion = cohesion / cohesionCount - fishData.position; } for (let i = 0; i < 3; i += 1) { const repulsion = d.vec3f(); - repulsion[i] = 1.0; + repulsion[i] = 1; const axisAquariumSize = p.aquariumSize[i] / 2; const axisPosition = fishData.position[i]; @@ -52,50 +49,34 @@ export const simulate = (fishIndex: number) => { if (axisPosition > axisAquariumSize - distance) { const str = axisPosition - (axisAquariumSize - distance); - wallRepulsion = wallRepulsion.sub(repulsion.mul(str)); + wallRepulsion = wallRepulsion - (repulsion * str); } if (axisPosition < -axisAquariumSize + distance) { const str = -axisAquariumSize + distance - axisPosition; - wallRepulsion = wallRepulsion.add(repulsion.mul(str)); + wallRepulsion = wallRepulsion + (repulsion * str); } } - const proj = projectPointOnLine( - fishData.position, - layout.$.mouseRay, - ); - const diff = fishData.position.sub(proj); + const proj = projectPointOnLine(fishData.position, layout.$.mouseRay); + const diff = fishData.position - proj; const limit = p.fishMouseRayRepulsionDistance; const str = std.pow(2, std.clamp(limit - std.length(diff), 0, limit)) - 1; - rayRepulsion = std.normalize(diff).mul(str); + rayRepulsion = std.normalize(diff) * str; let direction = d.vec3f(fishData.direction); - direction = direction.add( - separation.mul(layout.$.fishBehavior.separationStr), - ); - direction = direction.add( - alignment.mul(layout.$.fishBehavior.alignmentStr), - ); - direction = direction.add( - cohesion.mul(layout.$.fishBehavior.cohesionStr), - ); - direction = direction.add( - wallRepulsion.mul(p.fishWallRepulsionStrength), - ); - direction = direction.add( - rayRepulsion.mul(p.fishMouseRayRepulsionStrength), - ); - direction = std.normalize(direction).mul( - std.clamp(std.length(fishData.direction), 0, 0.01), - ); + direction += separation * layout.$.fishBehavior.separationStr; + direction += alignment * layout.$.fishBehavior.alignmentStr; + direction += cohesion * layout.$.fishBehavior.cohesionStr; + direction += wallRepulsion * p.fishWallRepulsionStrength; + direction += rayRepulsion * p.fishMouseRayRepulsionStrength; + direction = std.normalize(direction) * + (std.clamp(std.length(fishData.direction), 0, 0.01)); - const translation = direction.mul( - d.f32(std.min(999, layout.$.timePassed)) / 8, - ); + const translation = direction * (std.min(999, layout.$.timePassed) / 8); const nextFishData = layout.$.nextFishData[fishIndex]; - nextFishData.position = fishData.position.add(translation); + nextFishData.position = fishData.position + translation; nextFishData.direction = d.vec3f(direction); }; diff --git a/apps/typegpu-docs/src/examples/rendering/3d-fish/render.ts b/apps/typegpu-docs/src/examples/rendering/3d-fish/render.ts index c619569fa7..e4a46a12fd 100644 --- a/apps/typegpu-docs/src/examples/rendering/3d-fish/render.ts +++ b/apps/typegpu-docs/src/examples/rendering/3d-fish/render.ts @@ -12,6 +12,7 @@ export const vertexShader = tgpu.vertexFn({ in: { ...ModelVertexInput, instanceIndex: d.builtin.instanceIndex }, out: ModelVertexOutput, })((input) => { + 'use gpu'; // rotate the model so that it aligns with model's direction of movement // https://simple.wikipedia.org/wiki/Pitch,_yaw,_and_roll const currentModelData = layout.$.modelData[input.instanceIndex]; @@ -42,32 +43,18 @@ export const vertexShader = tgpu.vertexFn({ const yawMatrix = d.mat4x4f.rotationY(yaw); const translationMatrix = d.mat4x4f.translation(currentModelData.position); - const worldPosition = std.mul( - translationMatrix, - std.mul( - yawMatrix, - std.mul( - pitchMatrix, - std.mul( - scaleMatrix, - d.vec4f(wavedVertex.position, 1), - ), - ), - ), - ); + const worldPosition = translationMatrix * yawMatrix * pitchMatrix * + scaleMatrix * d.vec4f(wavedVertex.position, 1); // calculate where the normal vector points to const worldNormal = std.normalize( - std.mul(yawMatrix, std.mul(pitchMatrix, d.vec4f(wavedVertex.normal, 1))) - .xyz, + (yawMatrix * pitchMatrix * d.vec4f(wavedVertex.normal, 1)).xyz, ); // project the world position into the camera const worldPositionUniform = worldPosition; - const canvasPosition = std.mul( - layout.$.camera.projection, - std.mul(layout.$.camera.view, worldPositionUniform), - ); + const canvasPosition = layout.$.camera.projection * layout.$.camera.view * + worldPositionUniform; return { canvasPosition: canvasPosition, @@ -95,32 +82,28 @@ export const fragmentShader = tgpu.fragmentFn({ input.textureUV, ); const textureColor = textureColorWithAlpha.rgb; - - const ambient = std.mul(0.5, std.mul(textureColor, p.lightColor)); + const ambient = 0.5 * textureColor * p.lightColor; const cosTheta = std.dot(input.worldNormal, p.lightDirection); - const diffuse = std.mul( - std.max(0, cosTheta), - std.mul(textureColor, p.lightColor), - ); + const diffuse = std.max(0, cosTheta) * textureColor * p.lightColor; const viewSource = std.normalize( - std.sub(layout.$.camera.position.xyz, input.worldPosition), + layout.$.camera.position.xyz - input.worldPosition, ); const reflectSource = std.normalize( - std.reflect(std.mul(-1, p.lightDirection), input.worldNormal), + std.reflect(-1 * p.lightDirection, input.worldNormal), ); const specularStrength = std.pow( std.max(0, std.dot(viewSource, reflectSource)), 16, ); - const specular = std.mul(specularStrength, p.lightColor); + const specular = specularStrength * p.lightColor; - const lightedColor = std.add(ambient, std.add(diffuse, specular)); + const lightedColor = ambient + diffuse + specular; // apply desaturation const distanceFromCamera = std.length( - std.sub(layout.$.camera.position.xyz, input.worldPosition), + layout.$.camera.position.xyz - input.worldPosition, ); let desaturatedColor = d.vec3f(lightedColor); diff --git a/apps/typegpu-docs/src/examples/rendering/3d-fish/tgsl-helpers.ts b/apps/typegpu-docs/src/examples/rendering/3d-fish/tgsl-helpers.ts index 8860c939c3..eb50ab93c6 100644 --- a/apps/typegpu-docs/src/examples/rendering/3d-fish/tgsl-helpers.ts +++ b/apps/typegpu-docs/src/examples/rendering/3d-fish/tgsl-helpers.ts @@ -1,12 +1,11 @@ -import { d } from 'typegpu'; -import { add, cos, dot, normalize, sin } from 'typegpu/std'; +import { d, std } from 'typegpu'; import type { Line3 } from './schemas.ts'; export const projectPointOnLine = (point: d.v3f, line: Line3): d.v3f => { 'use gpu'; - const pointVector = point.sub(line.origin); - const projection = dot(pointVector, line.dir); - return line.origin.add(line.dir.mul(projection)); + const pointVector = point - line.origin; + const projection = std.dot(pointVector, line.dir); + return line.origin + line.dir * projection; }; type PosAndNormal = d.Infer; @@ -27,18 +26,15 @@ export const applySinWave = ( // z += sin(index + (time / a + x) / b) / c const posMod = d.vec3f(); - posMod.z = sin(d.f32(index) + (time / a + vertex.position.x) / b) / c; + posMod.z = std.sin(d.f32(index) + (time / a + vertex.position.x) / b) / c; - const coeff = cos(d.f32(index) + (time / a + vertex.position.x) / b) / c; - const newOX = normalize(d.vec3f(1, 0, coeff)); + const coeff = std.cos(d.f32(index) + (time / a + vertex.position.x) / b) / c; + const newOX = std.normalize(d.vec3f(1, 0, coeff)); const newOZ = d.vec3f(-newOX.z, 0, newOX.x); - const newNormalXZ = add( - newOX.mul(vertex.normal.x), - newOZ.mul(vertex.normal.z), - ); + const newNormalXZ = newOX * vertex.normal.x + newOZ * vertex.normal.z; const wavedNormal = d.vec3f(newNormalXZ.x, vertex.normal.y, newNormalXZ.z); - const wavedPosition = vertex.position.add(posMod); + const wavedPosition = vertex.position + posMod; return PosAndNormal({ position: wavedPosition, From 3be9ee6574692bab1eb8ab5ccf1d3721a825f4c9 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Thu, 19 Feb 2026 12:31:41 +0100 Subject: [PATCH 08/23] Self review --- packages/typegpu/package.json | 2 +- packages/typegpu/src/data/numeric.ts | 1 - packages/typegpu/src/data/vectorImpl.ts | 8 - packages/typegpu/src/data/wgslTypes.ts | 2 +- pnpm-lock.yaml | 366 ++++++++++++------------ pnpm-workspace.yaml | 16 +- 6 files changed, 193 insertions(+), 202 deletions(-) diff --git a/packages/typegpu/package.json b/packages/typegpu/package.json index 44b5bda4e0..6ba2f1cb40 100644 --- a/packages/typegpu/package.json +++ b/packages/typegpu/package.json @@ -79,7 +79,7 @@ "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67", "dependencies": { "tinyest": "workspace:~0.2.0", - "tsover-runtime": "^0.0.2", + "tsover-runtime": "^0.0.3", "typed-binary": "^4.3.1" } } diff --git a/packages/typegpu/src/data/numeric.ts b/packages/typegpu/src/data/numeric.ts index d2001d0eab..cbf5f36f76 100644 --- a/packages/typegpu/src/data/numeric.ts +++ b/packages/typegpu/src/data/numeric.ts @@ -11,7 +11,6 @@ import type { U32, } from './wgslTypes.ts'; import { callableSchema } from '../core/function/createCallableSchema.ts'; -import { Operator } from 'tsover-runtime'; export const abstractInt = { [$internal]: {}, diff --git a/packages/typegpu/src/data/vectorImpl.ts b/packages/typegpu/src/data/vectorImpl.ts index db25ab3073..98135fd880 100644 --- a/packages/typegpu/src/data/vectorImpl.ts +++ b/packages/typegpu/src/data/vectorImpl.ts @@ -1,4 +1,3 @@ -import { Operator } from 'tsover-runtime'; import { $internal, $resolve } from '../shared/symbols.ts'; import type { SelfResolvable } from '../types.ts'; import { bool, f16, f32, i32, u32 } from './numeric.ts'; @@ -178,13 +177,6 @@ abstract class Vec2 extends VecBase implements Tuple2 { set g(value: S) { this[1] = this.castElement()(value); } - - [Operator.plus](lhs: Vec2, rhs: Vec2) { - return new this._Vec2( - (lhs[0] as number) + (rhs[0] as number) as S, - (lhs[1] as number) + (rhs[1] as number) as S, - ); - } } abstract class Vec3 extends VecBase implements Tuple3 { diff --git a/packages/typegpu/src/data/wgslTypes.ts b/packages/typegpu/src/data/wgslTypes.ts index 8531ce407c..4187434129 100644 --- a/packages/typegpu/src/data/wgslTypes.ts +++ b/packages/typegpu/src/data/wgslTypes.ts @@ -1,4 +1,4 @@ -import { Operator } from 'tsover-runtime'; +import type { Operator } from 'tsover-runtime'; import type { TgpuNamable } from '../shared/meta.ts'; import type { ExtractInvalidSchemaError, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21395c09fe..a3c62eb7c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ catalogs: overrides: rollup: 4.34.8 - typescript: npm:tsover@^5.9.5 + typescript: npm:tsover@^5.9.6 three: ^0.181.0 importers: @@ -56,7 +56,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -79,8 +79,8 @@ importers: specifier: ^0.0.62 version: 0.0.62 typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unplugin-typegpu: specifier: workspace:* version: link:packages/unplugin-typegpu @@ -89,7 +89,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -100,8 +100,8 @@ importers: specifier: 'workspace:' version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unplugin-typegpu: specifier: 'workspace:' version: link:../../packages/unplugin-typegpu @@ -136,16 +136,16 @@ importers: version: 0.25.10 ts-loader: specifier: ^9.5.4 - version: 9.5.4(tsover@5.9.5)(webpack@5.104.1) + version: 9.5.4(tsover@5.9.6)(webpack@5.104.1) tsdown: specifier: ^0.15.6 - version: 0.15.12(tsover@5.9.5)(unrun@0.2.27) + version: 0.15.12(tsover@5.9.6)(unrun@0.2.27) tsx: specifier: ^4.19.2 version: 4.20.6 typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 webpack: specifier: ^5.102.0 version: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) @@ -157,7 +157,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.8.0)(tsover@5.9.5) + version: 0.9.4(prettier@3.8.0)(tsover@5.9.6) '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.10.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -166,13 +166,13 @@ importers: version: 3.7.0 '@astrojs/starlight': specifier: ^0.36.1 - version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/starlight-tailwind': specifier: ^4.0.1 - version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) + version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) + version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) '@babel/standalone': specifier: ^7.28.6 version: 7.28.6 @@ -229,13 +229,13 @@ importers: version: 2.1.28 astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) + version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) classnames: specifier: ^2.5.1 version: 2.5.1 expressive-code-twoslash: specifier: ^0.5.3 - version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.5) + version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.6) fuse.js: specifier: catalog:frontend version: 7.1.0 @@ -289,10 +289,10 @@ importers: version: 0.34.2 starlight-blog: specifier: ^0.23.2 - version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) starlight-typedoc: specifier: ^0.19.0 - version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)))(typedoc@0.27.9(tsover@5.9.5)) + version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)))(typedoc@0.27.9(tsover@5.9.6)) three: specifier: ^0.181.0 version: 0.181.2 @@ -301,16 +301,16 @@ importers: version: 3.1.1 typedoc: specifier: ^0.27.9 - version: 0.27.9(tsover@5.9.5) + version: 0.27.9(tsover@5.9.6) typedoc-plugin-markdown: specifier: 4.3.0 - version: 4.3.0(typedoc@0.27.9(tsover@5.9.5)) + version: 4.3.0(typedoc@0.27.9(tsover@5.9.6)) typegpu: specifier: workspace:* version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unplugin-typegpu: specifier: workspace:* version: link:../../packages/unplugin-typegpu @@ -347,7 +347,7 @@ importers: version: 0.1.66 astro-vtbot: specifier: ^2.1.10 - version: 2.1.10(prettier@3.8.0)(tsover@5.9.5) + version: 2.1.10(prettier@3.8.0)(tsover@5.9.6) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -374,23 +374,23 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.53.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) devDependencies: '@types/node': specifier: ^25.0.10 version: 25.1.0 '@typescript-eslint/rule-tester': specifier: ^8.53.1 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 vitest: specifier: ^4.0.17 - version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -448,10 +448,10 @@ importers: version: link:../tgpu-dev-cli tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.5) + version: 0.20.3(tsover@5.9.6) typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 publishDirectory: dist packages/tinyest-for-wgsl: @@ -474,10 +474,10 @@ importers: version: 8.14.1 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.5) + version: 0.20.3(tsover@5.9.6) typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 publishDirectory: dist packages/typegpu: @@ -486,15 +486,15 @@ importers: specifier: workspace:~0.2.0 version: link:../tinyest tsover-runtime: - specifier: ^0.0.2 - version: 0.0.2 + specifier: ^0.0.3 + version: 0.0.3 typed-binary: specifier: ^4.3.1 version: 4.3.2 devDependencies: '@ark/attest': specifier: ^0.56.0 - version: 0.56.0(tsover@5.9.5) + version: 0.56.0(tsover@5.9.6) '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli @@ -512,10 +512,10 @@ importers: version: 27.0.0(canvas@3.2.0)(postcss@8.5.6) tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.5) + version: 0.20.3(tsover@5.9.6) typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -536,11 +536,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.5) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -580,11 +580,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.5) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -602,11 +602,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.5) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -624,11 +624,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.5) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -653,11 +653,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.5) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -734,10 +734,10 @@ importers: version: 4.34.8 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.5) + version: 0.20.3(tsover@5.9.6) typescript: - specifier: npm:tsover@^5.9.5 - version: tsover@5.9.5 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 publishDirectory: dist packages: @@ -6902,11 +6902,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsover-runtime@0.0.2: - resolution: {integrity: sha512-H5CM5cg1aBobvrp7q80iLzxoSlvAQvIVHWBSkod68OeqzwFXWEYiNywOnesH7gT86De/xxYdOjCihXA4vR4BPg==} + tsover-runtime@0.0.3: + resolution: {integrity: sha512-jMv9JQN04DsQLyxBoDxOJZxQVPM84BimxvGyP8Ee8mdExCW0UGa0abkKQhlcAPlJGG3N+pd4MubrOTDfQzWugg==} - tsover@5.9.5: - resolution: {integrity: sha512-pwheV1NLujdWnj25CHFhmzZDCuga4jYj6xV4lxu20OjGJUwXMYX/jWEaRODgUUsRZuRPSSAiCR04sxtvShsPuw==} + tsover@5.9.6: + resolution: {integrity: sha512-5+WtKcSyOzOd71T1tb68Vk+WF1uvaoDnerm7cUH+0bOElSVRem5cJr9n88NLEXzVRiQVwGlspFExC174bEMDSA==} hasBin: true tsx@4.20.6: @@ -7818,16 +7818,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/attest@0.56.0(tsover@5.9.5)': + '@ark/attest@0.56.0(tsover@5.9.6)': dependencies: '@ark/fs': 0.56.0 '@ark/util': 0.56.0 '@prettier/sync': 0.6.1(prettier@3.6.2) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(tsover@5.9.5) + '@typescript/vfs': 1.6.1(tsover@5.9.6) arktype: 2.1.28 prettier: 3.6.2 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color @@ -7857,23 +7857,23 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.5)': + '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.6)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.5) + '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.6) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.5)': + '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.6)': dependencies: - '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.5) + '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.6) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -7887,12 +7887,12 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.5)': + '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.6)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.11(tsover@5.9.5) + '@volar/kit': 2.4.11(tsover@5.9.6) '@volar/language-core': 2.4.11 '@volar/language-server': 2.4.11 '@volar/language-service': 2.4.11 @@ -7912,12 +7912,12 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.5)': + '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.6)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.27(tsover@5.9.5) + '@volar/kit': 2.4.27(tsover@5.9.6) '@volar/language-core': 2.4.27 '@volar/language-server': 2.4.27 '@volar/language-service': 2.4.27 @@ -8015,12 +8015,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -8076,22 +8076,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: 4.1.11 - '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.6 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) - astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) + astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -8114,9 +8114,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) autoprefixer: 10.4.21(postcss@8.5.3) postcss: 8.5.3 postcss-load-config: 4.0.2(postcss@8.5.3) @@ -10059,32 +10059,32 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(tsover@5.9.5)': + '@typescript-eslint/project-service@8.54.0(tsover@5.9.6)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.5) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.6) '@typescript-eslint/types': 8.54.0 debug: 4.4.3 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': + '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': dependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) ajv: 6.12.6 eslint: 9.39.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 @@ -10099,35 +10099,35 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.5)': + '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.6)': dependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.5)': + '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.6)': dependencies: - '@typescript-eslint/project-service': 8.54.0(tsover@5.9.5) - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.5) + '@typescript-eslint/project-service': 8.54.0(tsover@5.9.6) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.6) '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(tsover@5.9.5) - typescript: tsover@5.9.5 + ts-api-utils: 2.4.0(tsover@5.9.6) + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.5)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.5) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color @@ -10147,10 +10147,10 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@typescript/vfs@1.6.1(tsover@5.9.5)': + '@typescript/vfs@1.6.1(tsover@5.9.6)': dependencies: debug: 4.4.3 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color @@ -10172,16 +10172,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -10221,9 +10221,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -10244,13 +10244,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.5) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.6) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': @@ -10262,13 +10262,13 @@ snapshots: msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.5) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.6) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': @@ -10319,21 +10319,21 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@volar/kit@2.4.11(tsover@5.9.5)': + '@volar/kit@2.4.11(tsover@5.9.6)': dependencies: '@volar/language-service': 2.4.11 '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - '@volar/kit@2.4.27(tsover@5.9.5)': + '@volar/kit@2.4.27(tsover@5.9.6)': dependencies: '@volar/language-service': 2.4.27 '@volar/typescript': 2.4.27 typesafe-path: 0.2.2 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -10413,9 +10413,9 @@ snapshots: '@vtbag/element-crossing@1.1.0': {} - '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.5)': + '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.6)': dependencies: - '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.5) + '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.6) transitivePeerDependencies: - prettier - prettier-plugin-astro @@ -10631,9 +10631,9 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)): + astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) rehype-expressive-code: 0.41.2 astro-remote@0.3.3: @@ -10644,11 +10644,11 @@ snapshots: marked-smartypants: 1.1.9(marked@12.0.2) ultrahtml: 1.6.0 - astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.5): + astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.6): dependencies: '@vtbag/cam-shaft': 1.0.6 '@vtbag/element-crossing': 1.1.0 - '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.5) + '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.6) '@vtbag/turn-signal': 1.3.1 '@vtbag/utensil-drawer': 1.2.14 transitivePeerDependencies: @@ -10656,7 +10656,7 @@ snapshots: - prettier-plugin-astro - typescript - astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1): + astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -10706,7 +10706,7 @@ snapshots: smol-toml: 1.6.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(tsover@5.9.5) + tsconfck: 3.1.6(tsover@5.9.6) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 @@ -10719,7 +10719,7 @@ snapshots: yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) - zod-to-ts: 1.2.0(tsover@5.9.5)(zod@3.25.76) + zod-to-ts: 1.2.0(tsover@5.9.6)(zod@3.25.76) optionalDependencies: sharp: 0.34.2 transitivePeerDependencies: @@ -11410,7 +11410,7 @@ snapshots: glob: 10.5.0 ora: 5.4.1 tslib: 2.8.1 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 yargs: 17.7.2 dset@3.1.4: {} @@ -11707,15 +11707,15 @@ snapshots: expect-type@1.3.0: {} - expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.5): + expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.6): dependencies: '@expressive-code/core': 0.41.2 expressive-code: 0.41.2 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 - twoslash: 0.2.12(tsover@5.9.5) - typescript: tsover@5.9.5 + twoslash: 0.2.12(tsover@5.9.6) + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color @@ -13140,7 +13140,7 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mkdist@2.2.0(tsover@5.9.5): + mkdist@2.2.0(tsover@5.9.6): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) citty: 0.1.6 @@ -13156,7 +13156,7 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 mlly@1.8.0: dependencies: @@ -13192,7 +13192,7 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5): + msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 @@ -13213,7 +13213,7 @@ snapshots: type-fest: 4.41.0 yargs: 17.7.2 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - '@types/node' optional: true @@ -14099,7 +14099,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.5): + rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.6): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.6 @@ -14112,11 +14112,11 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-beta.45 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.5): + rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.6): dependencies: '@babel/generator': 8.0.0-rc.1 '@babel/helper-validator-identifier': 8.0.0-rc.1 @@ -14129,7 +14129,7 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-rc.3 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - oxc-resolver @@ -14194,11 +14194,11 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.5): + rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.6): dependencies: magic-string: 0.30.21 rollup: 4.34.8 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 optionalDependencies: '@babel/code-frame': 7.27.1 @@ -14381,12 +14381,12 @@ snapshots: stackback@0.0.2: {} - starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)): + starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/rss': 4.0.11 - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) astro-remote: 0.3.3 github-slugger: 2.0.0 marked: 15.0.7 @@ -14398,12 +14398,12 @@ snapshots: - astro - supports-color - starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)))(typedoc@0.27.9(tsover@5.9.5)): + starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)))(typedoc@0.27.9(tsover@5.9.6)): dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.5)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) github-slugger: 2.0.0 - typedoc: 0.27.9(tsover@5.9.5) - typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.5)) + typedoc: 0.27.9(tsover@5.9.6) + typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.6)) state-local@1.0.7: {} @@ -14629,25 +14629,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(tsover@5.9.5): + ts-api-utils@2.4.0(tsover@5.9.6): dependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 - ts-loader@9.5.4(tsover@5.9.5)(webpack@5.104.1): + ts-loader@9.5.4(tsover@5.9.6)(webpack@5.104.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.4 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 webpack: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) - tsconfck@3.1.6(tsover@5.9.5): + tsconfck@3.1.6(tsover@5.9.6): optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 - tsdown@0.15.12(tsover@5.9.5)(unrun@0.2.27): + tsdown@0.15.12(tsover@5.9.6)(unrun@0.2.27): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14657,14 +14657,14 @@ snapshots: empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.45 - rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.5) + rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.6) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.4.2 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 unrun: 0.2.27 transitivePeerDependencies: - '@ts-macro/tsc' @@ -14673,7 +14673,7 @@ snapshots: - supports-color - vue-tsc - tsdown@0.20.3(tsover@5.9.5): + tsdown@0.20.3(tsover@5.9.6): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14684,7 +14684,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.3 rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.5) + rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.6) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 @@ -14692,7 +14692,7 @@ snapshots: unconfig-core: 7.4.2 unrun: 0.2.27 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -14702,12 +14702,12 @@ snapshots: tslib@2.8.1: {} - tsover-runtime@0.0.2: + tsover-runtime@0.0.3: dependencies: minimatch: 9.0.5 unplugin: 2.3.5 - tsover@5.9.5: + tsover@5.9.6: dependencies: minimatch: 9.0.5 unplugin: 2.3.5 @@ -14728,11 +14728,11 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(tsover@5.9.5): + twoslash@0.2.12(tsover@5.9.6): dependencies: - '@typescript/vfs': 1.6.1(tsover@5.9.5) + '@typescript/vfs': 1.6.1(tsover@5.9.6) twoslash-protocol: 0.2.12 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - supports-color @@ -14748,17 +14748,17 @@ snapshots: typed-binary@4.3.2: {} - typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.5)): + typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)): dependencies: - typedoc: 0.27.9(tsover@5.9.5) + typedoc: 0.27.9(tsover@5.9.6) - typedoc@0.27.9(tsover@5.9.5): + typedoc@0.27.9(tsover@5.9.6): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 yaml: 2.8.1 typesafe-path@0.2.2: {} @@ -14780,7 +14780,7 @@ snapshots: ultrahtml@1.6.0: {} - unbuild@3.5.0(tsover@5.9.5): + unbuild@3.5.0(tsover@5.9.6): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) '@rollup/plugin-commonjs': 28.0.3(rollup@4.34.8) @@ -14796,18 +14796,18 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.2.0(tsover@5.9.5) + mkdist: 2.2.0(tsover@5.9.6) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.1.0 pretty-bytes: 6.1.1 rollup: 4.34.8 - rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.5) + rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.6) scule: 1.3.0 tinyglobby: 0.2.15 untyped: 2.0.0 optionalDependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 transitivePeerDependencies: - sass - vue @@ -15127,11 +15127,11 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15155,7 +15155,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 25.1.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -15215,10 +15215,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.5))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -15671,9 +15671,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(tsover@5.9.5)(zod@3.25.76): + zod-to-ts@1.2.0(tsover@5.9.6)(zod@3.25.76): dependencies: - typescript: tsover@5.9.5 + typescript: tsover@5.9.6 zod: 3.25.76 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 66439eb64a..acd7aa53de 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,6 @@ packages: - - 'packages/*' - - 'apps/*' + - "packages/*" + - "apps/*" catalog: arktype: ^2.1.22 @@ -11,14 +11,14 @@ catalogs: unbuild: ^3.5.0 jiti: ^2.6.0 types: - typescript: npm:tsover@^5.9.5 - '@webgpu/types': ^0.1.66 - '@types/three': '^0.181.0' + typescript: npm:tsover@^5.9.6 + "@webgpu/types": ^0.1.66 + "@types/three": "^0.181.0" test: vitest: ^3.2.4 frontend: - 'vite-imagetools': ^9.0.0 - 'fuse.js': ^7.1.0 + "vite-imagetools": ^9.0.0 + "fuse.js": ^7.1.0 example: - 'wgpu-matrix': ^3.4.0 + "wgpu-matrix": ^3.4.0 three: ^0.181.0 From 52d5de9306e9ceabf88dfbb7732c43820c12199f Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Thu, 19 Feb 2026 12:45:01 +0100 Subject: [PATCH 09/23] Update snapshots --- apps/typegpu-docs/tsconfig.json | 2 +- .../tests/examples/individual/3d-fish.test.ts | 30 +++++++------- .../individual/xor-dev-centrifuge-2.test.ts | 40 +++++++++---------- pnpm-workspace.yaml | 14 +++---- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/apps/typegpu-docs/tsconfig.json b/apps/typegpu-docs/tsconfig.json index 80558304ce..7a408f61bb 100644 --- a/apps/typegpu-docs/tsconfig.json +++ b/apps/typegpu-docs/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "react", - "lib": ["ESNext", "DOM"], + "lib": ["ESNext", "DOM", "DOM.Iterable"], "types": ["@webgpu/types"] }, "include": [".astro/types.d.ts", "**/*"], diff --git a/packages/typegpu/tests/examples/individual/3d-fish.test.ts b/packages/typegpu/tests/examples/individual/3d-fish.test.ts index 4c75b546b6..f5d60e2251 100644 --- a/packages/typegpu/tests/examples/individual/3d-fish.test.ts +++ b/packages/typegpu/tests/examples/individual/3d-fish.test.ts @@ -141,9 +141,9 @@ describe('3d fish example', () => { continue; } let other = (¤tFishData[i]); - let dist = length(((*fishData).position - (*other).position)); + let dist = distance((*fishData).position, (*other).position); if ((dist < fishBehavior.separationDist)) { - separation = (separation + ((*fishData).position - (*other).position)); + separation = ((separation + (*fishData).position) - (*other).position); } if ((dist < fishBehavior.alignmentDist)) { alignment = (alignment + (*other).direction); @@ -155,10 +155,10 @@ describe('3d fish example', () => { } } if ((alignmentCount > 0i)) { - alignment = (alignment * (1f / f32(alignmentCount))); + alignment = (alignment / f32(alignmentCount)); } if ((cohesionCount > 0i)) { - cohesion = (((1f / f32(cohesionCount)) * cohesion) - (*fishData).position); + cohesion = ((cohesion / f32(cohesionCount)) - (*fishData).position); } for (var i = 0; (i < 3i); i += 1i) { var repulsion = vec3f(); @@ -181,11 +181,11 @@ describe('3d fish example', () => { let str = (pow(2f, clamp((limit - length(diff)), 0f, limit)) - 1f); rayRepulsion = (normalize(diff) * str); var direction = (*fishData).direction; - direction = (direction + (separation * fishBehavior.separationStr)); - direction = (direction + (alignment * fishBehavior.alignmentStr)); - direction = (direction + (cohesion * fishBehavior.cohesionStr)); - direction = (direction + (wallRepulsion * 1e-4f)); - direction = (direction + (rayRepulsion * 0.0015f)); + direction += (separation * fishBehavior.separationStr); + direction += (alignment * fishBehavior.alignmentStr); + direction += (cohesion * fishBehavior.cohesionStr); + direction += (wallRepulsion * 1e-4f); + direction += (rayRepulsion * 0.0015f); direction = (normalize(direction) * clamp(length((*fishData).direction), 0f, 0.01f)); var translation = (direction * (min(999f, timePassed) / 8f)); let nextFishData_1 = (&nextFishData[fishIndex]); @@ -277,10 +277,10 @@ describe('3d fish example', () => { var pitchMatrix = mat4x4f(cos(pitch), sin(pitch), 0, 0, -sin(pitch), cos(pitch), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); var yawMatrix = mat4x4f(cos(yaw), 0, -sin(yaw), 0, 0, 1, 0, 0, sin(yaw), 0, cos(yaw), 0, 0, 0, 0, 1); var translationMatrix = mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, (*currentModelData).position.x, (*currentModelData).position.y, (*currentModelData).position.z, 1); - var worldPosition = (translationMatrix * (yawMatrix * (pitchMatrix * (scaleMatrix * vec4f(wavedVertex.position, 1f))))); - var worldNormal = normalize((yawMatrix * (pitchMatrix * vec4f(wavedVertex.normal, 1f))).xyz); + var worldPosition = ((((translationMatrix * yawMatrix) * pitchMatrix) * scaleMatrix) * vec4f(wavedVertex.position, 1f)); + var worldNormal = normalize(((yawMatrix * pitchMatrix) * vec4f(wavedVertex.normal, 1f)).xyz); let worldPositionUniform = (&worldPosition); - var canvasPosition = (camera.projection * (camera.view * (*worldPositionUniform))); + var canvasPosition = ((camera.projection * camera.view) * (*worldPositionUniform)); return vertexShader_Output(worldPosition.xyz, worldNormal, canvasPosition, (*currentModelData).variant, input.textureUV, (*currentModelData).applySeaFog, (*currentModelData).applySeaDesaturation); } @@ -401,14 +401,14 @@ describe('3d fish example', () => { @fragment fn fragmentShader(input: fragmentShader_Input) -> @location(0) vec4f { var textureColorWithAlpha = textureSample(modelTexture, sampler_1, input.textureUV); var textureColor = textureColorWithAlpha.rgb; - var ambient = (0.5f * (textureColor * vec3f(0.800000011920929, 0.800000011920929, 1))); + var ambient = ((0.5f * textureColor) * vec3f(0.800000011920929, 0.800000011920929, 1)); let cosTheta = dot(input.worldNormal, vec3f(-0.2357022613286972, 0.9428090453147888, -0.2357022613286972)); - var diffuse = (max(0f, cosTheta) * (textureColor * vec3f(0.800000011920929, 0.800000011920929, 1))); + var diffuse = ((max(0f, cosTheta) * textureColor) * vec3f(0.800000011920929, 0.800000011920929, 1)); var viewSource = normalize((camera.position.xyz - input.worldPosition)); var reflectSource = normalize(reflect(vec3f(0.2357022613286972, -0.9428090453147888, 0.2357022613286972), input.worldNormal)); let specularStrength = pow(max(0f, dot(viewSource, reflectSource)), 16f); var specular = (specularStrength * vec3f(0.800000011920929, 0.800000011920929, 1)); - var lightedColor = (ambient + (diffuse + specular)); + var lightedColor = ((ambient + diffuse) + specular); let distanceFromCamera = length((camera.position.xyz - input.worldPosition)); var desaturatedColor = lightedColor; if ((input.applySeaDesaturation == 1u)) { diff --git a/packages/typegpu/tests/examples/individual/xor-dev-centrifuge-2.test.ts b/packages/typegpu/tests/examples/individual/xor-dev-centrifuge-2.test.ts index e83c208e69..feac263073 100644 --- a/packages/typegpu/tests/examples/individual/xor-dev-centrifuge-2.test.ts +++ b/packages/typegpu/tests/examples/individual/xor-dev-centrifuge-2.test.ts @@ -31,21 +31,18 @@ describe('xor dev centrifuge example', () => { return vertexMain_Output(vec4f(pos[input.vertexIndex], 0f, 1f), pos[input.vertexIndex]); } - @group(0) @binding(0) var aspectRatio: f32; - - @group(0) @binding(1) var tunnelDepth: i32; - - @group(0) @binding(2) var cameraPos: vec2f; - - @group(0) @binding(3) var bigStrips: f32; - - @group(0) @binding(4) var time: f32; - - @group(0) @binding(5) var dollyZoom: f32; - - @group(0) @binding(6) var smallStrips: f32; + struct Params { + time: f32, + aspectRatio: f32, + cameraPos: vec2f, + tunnelDepth: i32, + bigStrips: f32, + smallStrips: f32, + dollyZoom: f32, + color: vec3f, + } - @group(0) @binding(7) var color: vec3f; + @group(0) @binding(0) var paramsUniform: Params; fn safeTanh(v: vec3f) -> vec3f { return select(tanh(v), sign(v), (abs(v) > vec3f(10))); @@ -56,18 +53,19 @@ describe('xor dev centrifuge example', () => { } @fragment fn fragmentMain(_arg_0: fragmentMain_Input) -> @location(0) vec4f { - var ratio = vec2f(aspectRatio, 1f); + let params = (¶msUniform); + var ratio = vec2f((*params).aspectRatio, 1f); var dir = normalize(vec3f((_arg_0.uv * ratio), -1f)); var z = 0f; var acc = vec3f(); - for (var i = 0; (i < tunnelDepth); i++) { + for (var i = 0; (i < (*params).tunnelDepth); i++) { var p = (dir * z); - p.x += cameraPos.x; - p.y += cameraPos.y; - var coords = vec3f(((atan2(p.y, p.x) * bigStrips) + time), ((p.z * dollyZoom) - (5f * time)), (length(p.xy) - 11f)); - var coords2 = (cos((coords + cos((coords * smallStrips)))) - 1f); + p.x += (*params).cameraPos.x; + p.y += (*params).cameraPos.y; + var coords = vec3f(((atan2(p.y, p.x) * (*params).bigStrips) + (*params).time), ((p.z * (*params).dollyZoom) - (5f * (*params).time)), (length(p.xy) - 11f)); + var coords2 = (cos((coords + cos((coords * (*params).smallStrips)))) - 1f); let dd = ((length(vec4f(coords.z, coords2)) * 0.5f) - 0.1f); - acc = (acc + ((1.2f - cos((color * p.z))) / dd)); + acc += ((1.2f - cos(((*params).color * p.z))) / dd); z += dd; } acc = safeTanh((acc * 5e-3f)); diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index acd7aa53de..254f1bd8f0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,6 @@ packages: - - "packages/*" - - "apps/*" + - 'packages/*' + - 'apps/*' catalog: arktype: ^2.1.22 @@ -12,13 +12,13 @@ catalogs: jiti: ^2.6.0 types: typescript: npm:tsover@^5.9.6 - "@webgpu/types": ^0.1.66 - "@types/three": "^0.181.0" + '@webgpu/types': ^0.1.66 + '@types/three': '^0.181.0' test: vitest: ^3.2.4 frontend: - "vite-imagetools": ^9.0.0 - "fuse.js": ^7.1.0 + 'vite-imagetools': ^9.0.0 + 'fuse.js': ^7.1.0 example: - "wgpu-matrix": ^3.4.0 + 'wgpu-matrix': ^3.4.0 three: ^0.181.0 From e46beb388235c6190ed210fc7ecd79cc72578b02 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Thu, 19 Feb 2026 18:32:47 +0100 Subject: [PATCH 10/23] Review fixes --- .../scripts/transform-overloads.ts | 154 ++++++------------ packages/typegpu/src/data/wgslTypes.ts | 8 +- 2 files changed, 56 insertions(+), 106 deletions(-) diff --git a/apps/typegpu-docs/scripts/transform-overloads.ts b/apps/typegpu-docs/scripts/transform-overloads.ts index 2367579f12..c69cbc78e8 100644 --- a/apps/typegpu-docs/scripts/transform-overloads.ts +++ b/apps/typegpu-docs/scripts/transform-overloads.ts @@ -11,17 +11,21 @@ const examplesDir = join(projectRoot, 'src', 'examples'); const operatorToMethod: Record = { [ts.SyntaxKind.PlusToken]: 'add', + [ts.SyntaxKind.PlusEqualsToken]: 'add', [ts.SyntaxKind.MinusToken]: 'sub', + [ts.SyntaxKind.MinusEqualsToken]: 'sub', [ts.SyntaxKind.AsteriskToken]: 'mul', + [ts.SyntaxKind.AsteriskEqualsToken]: 'mul', [ts.SyntaxKind.SlashToken]: 'div', + [ts.SyntaxKind.SlashEqualsToken]: 'div', }; -const compoundToBaseOperator: Record = { - [ts.SyntaxKind.PlusEqualsToken]: ts.SyntaxKind.PlusToken, - [ts.SyntaxKind.MinusEqualsToken]: ts.SyntaxKind.MinusToken, - [ts.SyntaxKind.AsteriskEqualsToken]: ts.SyntaxKind.AsteriskToken, - [ts.SyntaxKind.SlashEqualsToken]: ts.SyntaxKind.SlashToken, -}; +const assignmentOperators = [ + ts.SyntaxKind.PlusEqualsToken, + ts.SyntaxKind.MinusEqualsToken, + ts.SyntaxKind.AsteriskEqualsToken, + ts.SyntaxKind.SlashEqualsToken, +]; async function findTypeScriptFiles(dir: string): Promise { const files: string[] = []; @@ -89,42 +93,6 @@ function isOverloadedBinary( return { isOverloaded: true, useLeftMethod: leftHasMethod }; } -function isOverloadedCompoundAssignment( - node: ts.BinaryExpression, - checker: ts.TypeChecker, -): { isOverloaded: boolean; baseOperator: ts.SyntaxKind | undefined } { - const baseOperator = compoundToBaseOperator[node.operatorToken.kind]; - if (!baseOperator) { - return { isOverloaded: false, baseOperator: undefined }; - } - - const methodName = operatorToMethod[baseOperator]; - if (!methodName) { - return { isOverloaded: false, baseOperator: undefined }; - } - - // Get the types of both operands - const leftType = checker.getTypeAtLocation(node.left); - const rightType = checker.getTypeAtLocation(node.right); - - const overloadType = checker.__tsover__getOverloadReturnType( - node.left, - baseOperator, - node.right, - leftType, - rightType, - ); - - if (!overloadType) { - return { isOverloaded: false, baseOperator: undefined }; - } - - // Check if left operand has the method (compound assignment only uses left method) - const leftHasMethod = leftType.getProperty(methodName) !== undefined; - - return { isOverloaded: leftHasMethod, baseOperator }; -} - function createProgram(allFiles: string[]): ts.Program { const configPath = join(projectRoot, 'tsconfig.json'); const configText = ts.sys.readFile(configPath); @@ -166,68 +134,52 @@ function transformFile( let hasChanges = false; function visit(node: ts.Node): void { + // Visit all children of the node first, then process the node itself ts.forEachChild(node, visit); - if (ts.isBinaryExpression(node)) { - const { isOverloaded, useLeftMethod } = isOverloadedBinary(node, checker); - - if (isOverloaded) { - const methodName = operatorToMethod[node.operatorToken.kind]; - if (methodName) { - hasChanges = true; - - const start = node.getStart(); - const end = node.getEnd(); - const leftStart = node.left.getStart(); - const leftEnd = node.left.getEnd(); - const rightStart = node.right.getStart(); - const rightEnd = node.right.getEnd(); - - const leftText = magic.slice(leftStart, leftEnd); - const rightText = magic.slice(rightStart, rightEnd); - - if (useLeftMethod) { - magic.overwrite( - start, - end, - `${leftText}.${methodName}(${rightText})`, - ); - } else { - magic.overwrite( - start, - end, - `${rightText}.${methodName}(${leftText})`, - ); - } - } - } + if (!ts.isBinaryExpression(node)) { + return; + } - // Handle compound assignment operators (+=, -=, *=, /=) - const { isOverloaded: isCompoundOverloaded, baseOperator } = - isOverloadedCompoundAssignment(node, checker); - - if (isCompoundOverloaded && baseOperator) { - const methodName = operatorToMethod[baseOperator]; - if (methodName) { - hasChanges = true; - - const start = node.getStart(); - const end = node.getEnd(); - const leftStart = node.left.getStart(); - const leftEnd = node.left.getEnd(); - const rightStart = node.right.getStart(); - const rightEnd = node.right.getEnd(); - - const leftText = magic.slice(leftStart, leftEnd); - const rightText = magic.slice(rightStart, rightEnd); - - // Transform a += b into a = a.add(b) - magic.overwrite( - start, - end, - `${leftText} = ${leftText}.${methodName}(${rightText})`, - ); - } + const { isOverloaded, useLeftMethod } = isOverloadedBinary(node, checker); + const methodName = operatorToMethod[node.operatorToken.kind]; + + if (!isOverloaded || !methodName) { + return; + } + + hasChanges = true; + + const start = node.getStart(); + const end = node.getEnd(); + const leftStart = node.left.getStart(); + const leftEnd = node.left.getEnd(); + const rightStart = node.right.getStart(); + const rightEnd = node.right.getEnd(); + + const leftText = magic.slice(leftStart, leftEnd); + const rightText = magic.slice(rightStart, rightEnd); + + if (assignmentOperators.includes(node.operatorToken.kind)) { + // Transform a += b into a = a.add(b) + magic.overwrite( + start, + end, + `${leftText} = ${leftText}.${methodName}(${rightText})`, + ); + } else { + if (useLeftMethod) { + magic.overwrite( + start, + end, + `${leftText}.${methodName}(${rightText})`, + ); + } else { + magic.overwrite( + start, + end, + `${rightText}.${methodName}(${leftText})`, + ); } } } diff --git a/packages/typegpu/src/data/wgslTypes.ts b/packages/typegpu/src/data/wgslTypes.ts index 4187434129..19770bf441 100644 --- a/packages/typegpu/src/data/wgslTypes.ts +++ b/packages/typegpu/src/data/wgslTypes.ts @@ -69,7 +69,7 @@ export interface vecInfixNotation { lhs: mBaseForVec | T | number, rhs: mBaseForVec | T | number, ): T; - [Operator.slash](lhs: T, rhs: T | number): T; + [Operator.slash](lhs: T | number, rhs: T | number): T; } /** @@ -88,10 +88,8 @@ export interface matInfixNotation { [Operator.plus](lhs: T, rhs: T): T; [Operator.minus](lhs: T, rhs: T): T; [Operator.star](lhs: T | number, rhs: T | number): T; - [Operator.star]( - lhs: T | vBaseForMat, - rhs: T | vBaseForMat, - ): vBaseForMat; + [Operator.star](lhs: T, rhs: vBaseForMat): vBaseForMat; + [Operator.star](lhs: vBaseForMat, rhs: T): vBaseForMat; } /** From 179c5a24ec2aedae2dfd100449a21fb00a6623c6 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Fri, 20 Feb 2026 16:30:26 +0100 Subject: [PATCH 11/23] Update pnpm-lock.yaml --- pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3c62eb7c7..cd4976cc9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -558,11 +558,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: catalog:types - version: 5.9.3 + specifier: npm:tsover@^5.9.6 + version: tsover@5.9.6 unbuild: specifier: catalog:build - version: 3.5.0(typescript@5.9.3) + version: 3.5.0(tsover@5.9.6) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu From c43941071ff0d51f7942be5a44f12b509e418a27 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Sat, 21 Feb 2026 11:35:26 +0100 Subject: [PATCH 12/23] Tests --- .../tests/tgsl/operatorOverloads.test.ts | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 packages/typegpu/tests/tgsl/operatorOverloads.test.ts diff --git a/packages/typegpu/tests/tgsl/operatorOverloads.test.ts b/packages/typegpu/tests/tgsl/operatorOverloads.test.ts new file mode 100644 index 0000000000..af7666388a --- /dev/null +++ b/packages/typegpu/tests/tgsl/operatorOverloads.test.ts @@ -0,0 +1,89 @@ +import { expect } from 'vitest'; +import { d, tgpu } from '../../src/index.ts'; +import { test } from '../utils/extendedIt.ts'; + +test('vec3f() +', () => { + const main = () => { + 'use gpu'; + let result = d.vec3f(); + result += d.vec3f(1, 2, 3) + 1 /* comptime */; + result += 1; + return result; + }; + + expect(tgpu.resolve([main])).toMatchInlineSnapshot(` + "fn main() -> vec3f { + var result = vec3f(); + result += vec3f(2, 3, 4); + result += 1; + return result; + }" + `); + + expect(String(main())).toMatchInlineSnapshot(`"vec3f(3, 4, 5)"`); +}); + +test('vec3f() -', () => { + const main = () => { + 'use gpu'; + let result = d.vec3f(); + result -= d.vec3f(1, 2, 3) + 1 /* comptime */; + result -= 1; + return result; + }; + + expect(tgpu.resolve([main])).toMatchInlineSnapshot(` + "fn main() -> vec3f { + var result = vec3f(); + result -= vec3f(2, 3, 4); + result -= 1; + return result; + }" + `); + + expect(String(main())).toMatchInlineSnapshot(`"vec3f(-3, -4, -5)"`); +}); + +test('vec3f() *', () => { + const main = () => { + 'use gpu'; + let result = d.vec3f(1, 2, 3); + result *= d.vec3f(5, 4, 3); + result *= 2; + return result; + }; + + expect(tgpu.resolve([main])).toMatchInlineSnapshot(` + "fn main() -> vec3f { + var result = vec3f(1, 2, 3); + result *= vec3f(5, 4, 3); + result *= 2; + return result; + }" + `); + + expect(String(main())).toMatchInlineSnapshot(`"vec3f(10, 16, 18)"`); +}); + +test('vec3f() /', () => { + const main = () => { + 'use gpu'; + let result = d.vec3f(1, 2, 3); + result /= d.vec3f(2, 2, 3); + result /= 2; + return result; + }; + + expect(tgpu.resolve([main])).toMatchInlineSnapshot(` + "fn main() -> vec3f { + var result = vec3f(1, 2, 3); + result /= vec3f(2, 2, 3); + result /= 2; + return result; + }" + `); + + expect(String(main())).toMatchInlineSnapshot( + `"vec3f(0.25, 0.5, 0.5)"`, + ); +}); From 3db407feeee634940458c1a0b0398f3eef054370 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Sun, 22 Feb 2026 17:52:04 +0100 Subject: [PATCH 13/23] Update to tsover 5.9.9 --- pnpm-lock.yaml | 362 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 16 +- 2 files changed, 189 insertions(+), 189 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd4976cc9d..c792b3ce3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ catalogs: overrides: rollup: 4.34.8 - typescript: npm:tsover@^5.9.6 + typescript: npm:tsover@^5.9.9 three: ^0.181.0 importers: @@ -56,7 +56,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -79,8 +79,8 @@ importers: specifier: ^0.0.62 version: 0.0.62 typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unplugin-typegpu: specifier: workspace:* version: link:packages/unplugin-typegpu @@ -89,7 +89,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -100,8 +100,8 @@ importers: specifier: 'workspace:' version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unplugin-typegpu: specifier: 'workspace:' version: link:../../packages/unplugin-typegpu @@ -136,16 +136,16 @@ importers: version: 0.25.10 ts-loader: specifier: ^9.5.4 - version: 9.5.4(tsover@5.9.6)(webpack@5.104.1) + version: 9.5.4(tsover@5.9.9)(webpack@5.104.1) tsdown: specifier: ^0.15.6 - version: 0.15.12(tsover@5.9.6)(unrun@0.2.27) + version: 0.15.12(tsover@5.9.9)(unrun@0.2.27) tsx: specifier: ^4.19.2 version: 4.20.6 typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 webpack: specifier: ^5.102.0 version: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) @@ -157,7 +157,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.8.0)(tsover@5.9.6) + version: 0.9.4(prettier@3.8.0)(tsover@5.9.9) '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.10.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -166,13 +166,13 @@ importers: version: 3.7.0 '@astrojs/starlight': specifier: ^0.36.1 - version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/starlight-tailwind': specifier: ^4.0.1 - version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) + version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) + version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) '@babel/standalone': specifier: ^7.28.6 version: 7.28.6 @@ -229,13 +229,13 @@ importers: version: 2.1.28 astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) + version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) classnames: specifier: ^2.5.1 version: 2.5.1 expressive-code-twoslash: specifier: ^0.5.3 - version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.6) + version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.9) fuse.js: specifier: catalog:frontend version: 7.1.0 @@ -289,10 +289,10 @@ importers: version: 0.34.2 starlight-blog: specifier: ^0.23.2 - version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) starlight-typedoc: specifier: ^0.19.0 - version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)))(typedoc@0.27.9(tsover@5.9.6)) + version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)))(typedoc@0.27.9(tsover@5.9.9)) three: specifier: ^0.181.0 version: 0.181.2 @@ -301,16 +301,16 @@ importers: version: 3.1.1 typedoc: specifier: ^0.27.9 - version: 0.27.9(tsover@5.9.6) + version: 0.27.9(tsover@5.9.9) typedoc-plugin-markdown: specifier: 4.3.0 - version: 4.3.0(typedoc@0.27.9(tsover@5.9.6)) + version: 4.3.0(typedoc@0.27.9(tsover@5.9.9)) typegpu: specifier: workspace:* version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unplugin-typegpu: specifier: workspace:* version: link:../../packages/unplugin-typegpu @@ -347,7 +347,7 @@ importers: version: 0.1.66 astro-vtbot: specifier: ^2.1.10 - version: 2.1.10(prettier@3.8.0)(tsover@5.9.6) + version: 2.1.10(prettier@3.8.0)(tsover@5.9.9) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -374,23 +374,23 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.53.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) devDependencies: '@types/node': specifier: ^25.0.10 version: 25.1.0 '@typescript-eslint/rule-tester': specifier: ^8.53.1 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 vitest: specifier: ^4.0.17 - version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -448,10 +448,10 @@ importers: version: link:../tgpu-dev-cli tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.6) + version: 0.20.3(tsover@5.9.9) typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 publishDirectory: dist packages/tinyest-for-wgsl: @@ -474,10 +474,10 @@ importers: version: 8.14.1 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.6) + version: 0.20.3(tsover@5.9.9) typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 publishDirectory: dist packages/typegpu: @@ -494,7 +494,7 @@ importers: devDependencies: '@ark/attest': specifier: ^0.56.0 - version: 0.56.0(tsover@5.9.6) + version: 0.56.0(tsover@5.9.9) '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli @@ -512,10 +512,10 @@ importers: version: 27.0.0(canvas@3.2.0)(postcss@8.5.6) tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.6) + version: 0.20.3(tsover@5.9.9) typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -536,11 +536,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -558,11 +558,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -580,11 +580,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -602,11 +602,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -624,11 +624,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -653,11 +653,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.6) + version: 3.5.0(tsover@5.9.9) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -734,10 +734,10 @@ importers: version: 4.34.8 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.6) + version: 0.20.3(tsover@5.9.9) typescript: - specifier: npm:tsover@^5.9.6 - version: tsover@5.9.6 + specifier: npm:tsover@^5.9.9 + version: tsover@5.9.9 publishDirectory: dist packages: @@ -6905,8 +6905,8 @@ packages: tsover-runtime@0.0.3: resolution: {integrity: sha512-jMv9JQN04DsQLyxBoDxOJZxQVPM84BimxvGyP8Ee8mdExCW0UGa0abkKQhlcAPlJGG3N+pd4MubrOTDfQzWugg==} - tsover@5.9.6: - resolution: {integrity: sha512-5+WtKcSyOzOd71T1tb68Vk+WF1uvaoDnerm7cUH+0bOElSVRem5cJr9n88NLEXzVRiQVwGlspFExC174bEMDSA==} + tsover@5.9.9: + resolution: {integrity: sha512-t31vJiwnfwAmOC+d2LySJTHzfdmaxpYajuX2FYHYJ8D/X2FMMMJeFx/vBIMBuPya+4ntt47gsn/06HGbeawZ6w==} hasBin: true tsx@4.20.6: @@ -7818,16 +7818,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/attest@0.56.0(tsover@5.9.6)': + '@ark/attest@0.56.0(tsover@5.9.9)': dependencies: '@ark/fs': 0.56.0 '@ark/util': 0.56.0 '@prettier/sync': 0.6.1(prettier@3.6.2) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(tsover@5.9.6) + '@typescript/vfs': 1.6.1(tsover@5.9.9) arktype: 2.1.28 prettier: 3.6.2 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color @@ -7857,23 +7857,23 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.6)': + '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.9)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.6) + '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.9) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.6)': + '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.9)': dependencies: - '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.6) + '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.9) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -7887,12 +7887,12 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.6)': + '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.9)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.11(tsover@5.9.6) + '@volar/kit': 2.4.11(tsover@5.9.9) '@volar/language-core': 2.4.11 '@volar/language-server': 2.4.11 '@volar/language-service': 2.4.11 @@ -7912,12 +7912,12 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.6)': + '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.9)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.27(tsover@5.9.6) + '@volar/kit': 2.4.27(tsover@5.9.9) '@volar/language-core': 2.4.27 '@volar/language-server': 2.4.27 '@volar/language-service': 2.4.27 @@ -8015,12 +8015,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -8076,22 +8076,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: 4.1.11 - '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.6 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) - astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) + astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -8114,9 +8114,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) autoprefixer: 10.4.21(postcss@8.5.3) postcss: 8.5.3 postcss-load-config: 4.0.2(postcss@8.5.3) @@ -10059,32 +10059,32 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(tsover@5.9.6)': + '@typescript-eslint/project-service@8.54.0(tsover@5.9.9)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.6) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.9) '@typescript-eslint/types': 8.54.0 debug: 4.4.3 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': + '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': dependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) ajv: 6.12.6 eslint: 9.39.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 @@ -10099,35 +10099,35 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.6)': + '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.9)': dependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.6)': + '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.9)': dependencies: - '@typescript-eslint/project-service': 8.54.0(tsover@5.9.6) - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.6) + '@typescript-eslint/project-service': 8.54.0(tsover@5.9.9) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.9) '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(tsover@5.9.6) - typescript: tsover@5.9.6 + ts-api-utils: 2.4.0(tsover@5.9.9) + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.6)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.6) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color @@ -10147,10 +10147,10 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@typescript/vfs@1.6.1(tsover@5.9.6)': + '@typescript/vfs@1.6.1(tsover@5.9.9)': dependencies: debug: 4.4.3 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color @@ -10172,16 +10172,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -10221,9 +10221,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -10244,13 +10244,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.6) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.9) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': @@ -10262,13 +10262,13 @@ snapshots: msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.6) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.9) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': @@ -10319,21 +10319,21 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@volar/kit@2.4.11(tsover@5.9.6)': + '@volar/kit@2.4.11(tsover@5.9.9)': dependencies: '@volar/language-service': 2.4.11 '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - '@volar/kit@2.4.27(tsover@5.9.6)': + '@volar/kit@2.4.27(tsover@5.9.9)': dependencies: '@volar/language-service': 2.4.27 '@volar/typescript': 2.4.27 typesafe-path: 0.2.2 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -10413,9 +10413,9 @@ snapshots: '@vtbag/element-crossing@1.1.0': {} - '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.6)': + '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.9)': dependencies: - '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.6) + '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.9) transitivePeerDependencies: - prettier - prettier-plugin-astro @@ -10631,9 +10631,9 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)): + astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) rehype-expressive-code: 0.41.2 astro-remote@0.3.3: @@ -10644,11 +10644,11 @@ snapshots: marked-smartypants: 1.1.9(marked@12.0.2) ultrahtml: 1.6.0 - astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.6): + astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.9): dependencies: '@vtbag/cam-shaft': 1.0.6 '@vtbag/element-crossing': 1.1.0 - '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.6) + '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.9) '@vtbag/turn-signal': 1.3.1 '@vtbag/utensil-drawer': 1.2.14 transitivePeerDependencies: @@ -10656,7 +10656,7 @@ snapshots: - prettier-plugin-astro - typescript - astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1): + astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -10706,7 +10706,7 @@ snapshots: smol-toml: 1.6.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(tsover@5.9.6) + tsconfck: 3.1.6(tsover@5.9.9) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 @@ -10719,7 +10719,7 @@ snapshots: yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) - zod-to-ts: 1.2.0(tsover@5.9.6)(zod@3.25.76) + zod-to-ts: 1.2.0(tsover@5.9.9)(zod@3.25.76) optionalDependencies: sharp: 0.34.2 transitivePeerDependencies: @@ -11410,7 +11410,7 @@ snapshots: glob: 10.5.0 ora: 5.4.1 tslib: 2.8.1 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 yargs: 17.7.2 dset@3.1.4: {} @@ -11707,15 +11707,15 @@ snapshots: expect-type@1.3.0: {} - expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.6): + expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.9): dependencies: '@expressive-code/core': 0.41.2 expressive-code: 0.41.2 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 - twoslash: 0.2.12(tsover@5.9.6) - typescript: tsover@5.9.6 + twoslash: 0.2.12(tsover@5.9.9) + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color @@ -13140,7 +13140,7 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mkdist@2.2.0(tsover@5.9.6): + mkdist@2.2.0(tsover@5.9.9): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) citty: 0.1.6 @@ -13156,7 +13156,7 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 mlly@1.8.0: dependencies: @@ -13192,7 +13192,7 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6): + msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 @@ -13213,7 +13213,7 @@ snapshots: type-fest: 4.41.0 yargs: 17.7.2 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - '@types/node' optional: true @@ -14099,7 +14099,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.6): + rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.9): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.6 @@ -14112,11 +14112,11 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-beta.45 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.6): + rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.9): dependencies: '@babel/generator': 8.0.0-rc.1 '@babel/helper-validator-identifier': 8.0.0-rc.1 @@ -14129,7 +14129,7 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-rc.3 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - oxc-resolver @@ -14194,11 +14194,11 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.6): + rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.9): dependencies: magic-string: 0.30.21 rollup: 4.34.8 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 optionalDependencies: '@babel/code-frame': 7.27.1 @@ -14381,12 +14381,12 @@ snapshots: stackback@0.0.2: {} - starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)): + starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/rss': 4.0.11 - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) astro-remote: 0.3.3 github-slugger: 2.0.0 marked: 15.0.7 @@ -14398,12 +14398,12 @@ snapshots: - astro - supports-color - starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)))(typedoc@0.27.9(tsover@5.9.6)): + starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)))(typedoc@0.27.9(tsover@5.9.9)): dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.6)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) github-slugger: 2.0.0 - typedoc: 0.27.9(tsover@5.9.6) - typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.6)) + typedoc: 0.27.9(tsover@5.9.9) + typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.9)) state-local@1.0.7: {} @@ -14629,25 +14629,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(tsover@5.9.6): + ts-api-utils@2.4.0(tsover@5.9.9): dependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 - ts-loader@9.5.4(tsover@5.9.6)(webpack@5.104.1): + ts-loader@9.5.4(tsover@5.9.9)(webpack@5.104.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.4 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 webpack: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) - tsconfck@3.1.6(tsover@5.9.6): + tsconfck@3.1.6(tsover@5.9.9): optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 - tsdown@0.15.12(tsover@5.9.6)(unrun@0.2.27): + tsdown@0.15.12(tsover@5.9.9)(unrun@0.2.27): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14657,14 +14657,14 @@ snapshots: empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.45 - rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.6) + rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.9) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.4.2 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 unrun: 0.2.27 transitivePeerDependencies: - '@ts-macro/tsc' @@ -14673,7 +14673,7 @@ snapshots: - supports-color - vue-tsc - tsdown@0.20.3(tsover@5.9.6): + tsdown@0.20.3(tsover@5.9.9): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14684,7 +14684,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.3 rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.6) + rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.9) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 @@ -14692,7 +14692,7 @@ snapshots: unconfig-core: 7.4.2 unrun: 0.2.27 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -14707,7 +14707,7 @@ snapshots: minimatch: 9.0.5 unplugin: 2.3.5 - tsover@5.9.6: + tsover@5.9.9: dependencies: minimatch: 9.0.5 unplugin: 2.3.5 @@ -14728,11 +14728,11 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(tsover@5.9.6): + twoslash@0.2.12(tsover@5.9.9): dependencies: - '@typescript/vfs': 1.6.1(tsover@5.9.6) + '@typescript/vfs': 1.6.1(tsover@5.9.9) twoslash-protocol: 0.2.12 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - supports-color @@ -14748,17 +14748,17 @@ snapshots: typed-binary@4.3.2: {} - typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.6)): + typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)): dependencies: - typedoc: 0.27.9(tsover@5.9.6) + typedoc: 0.27.9(tsover@5.9.9) - typedoc@0.27.9(tsover@5.9.6): + typedoc@0.27.9(tsover@5.9.9): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 yaml: 2.8.1 typesafe-path@0.2.2: {} @@ -14780,7 +14780,7 @@ snapshots: ultrahtml@1.6.0: {} - unbuild@3.5.0(tsover@5.9.6): + unbuild@3.5.0(tsover@5.9.9): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) '@rollup/plugin-commonjs': 28.0.3(rollup@4.34.8) @@ -14796,18 +14796,18 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.2.0(tsover@5.9.6) + mkdist: 2.2.0(tsover@5.9.9) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.1.0 pretty-bytes: 6.1.1 rollup: 4.34.8 - rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.6) + rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.9) scule: 1.3.0 tinyglobby: 0.2.15 untyped: 2.0.0 optionalDependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 transitivePeerDependencies: - sass - vue @@ -15127,11 +15127,11 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15155,7 +15155,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 25.1.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -15215,10 +15215,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.6))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -15671,9 +15671,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(tsover@5.9.6)(zod@3.25.76): + zod-to-ts@1.2.0(tsover@5.9.9)(zod@3.25.76): dependencies: - typescript: tsover@5.9.6 + typescript: tsover@5.9.9 zod: 3.25.76 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 254f1bd8f0..4282f76a23 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,6 @@ packages: - - 'packages/*' - - 'apps/*' + - "packages/*" + - "apps/*" catalog: arktype: ^2.1.22 @@ -11,14 +11,14 @@ catalogs: unbuild: ^3.5.0 jiti: ^2.6.0 types: - typescript: npm:tsover@^5.9.6 - '@webgpu/types': ^0.1.66 - '@types/three': '^0.181.0' + typescript: npm:tsover@^5.9.9 + "@webgpu/types": ^0.1.66 + "@types/three": "^0.181.0" test: vitest: ^3.2.4 frontend: - 'vite-imagetools': ^9.0.0 - 'fuse.js': ^7.1.0 + "vite-imagetools": ^9.0.0 + "fuse.js": ^7.1.0 example: - 'wgpu-matrix': ^3.4.0 + "wgpu-matrix": ^3.4.0 three: ^0.181.0 From 4e643ab249ff369a2eba12f05b66a061d38cf4dd Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 13:02:44 +0100 Subject: [PATCH 14/23] Better transformation of ts-not-over files --- .../scripts/transform-overloads.ts | 84 ++-- packages/typegpu/package.json | 2 +- pnpm-lock.yaml | 372 +++++++++--------- pnpm-workspace.yaml | 2 +- 4 files changed, 232 insertions(+), 228 deletions(-) diff --git a/apps/typegpu-docs/scripts/transform-overloads.ts b/apps/typegpu-docs/scripts/transform-overloads.ts index c69cbc78e8..81ccaa1e1e 100644 --- a/apps/typegpu-docs/scripts/transform-overloads.ts +++ b/apps/typegpu-docs/scripts/transform-overloads.ts @@ -18,6 +18,8 @@ const operatorToMethod: Record = { [ts.SyntaxKind.AsteriskEqualsToken]: 'mul', [ts.SyntaxKind.SlashToken]: 'div', [ts.SyntaxKind.SlashEqualsToken]: 'div', + [ts.SyntaxKind.AsteriskAsteriskToken]: 'pow', + [ts.SyntaxKind.AsteriskAsteriskEqualsToken]: 'pow', }; const assignmentOperators = [ @@ -57,40 +59,47 @@ async function findTypeScriptFiles(dir: string): Promise { return files; } -function isOverloadedBinary( - node: ts.BinaryExpression, +type Pattern = + | 'left.op(right)' // e.g. vec + 2 => vec.add(2) + | 'right.op(left)' // e.g. 2 * vec => vec.mul(2) + | 'std.op(left, right)'; // e.g. 2 / vec => std.div(2, vec) + +function getOverloadPattern( checker: ts.TypeChecker, -): { isOverloaded: boolean; useLeftMethod: boolean } { + node: ts.BinaryExpression, +): Pattern | undefined { const methodName = operatorToMethod[node.operatorToken.kind]; if (!methodName) { - return { isOverloaded: false, useLeftMethod: false }; + // Not overlaoded + return undefined; } // Get the types of both operands const leftType = checker.getTypeAtLocation(node.left); const rightType = checker.getTypeAtLocation(node.right); - const overloadType = checker.__tsover__getOverloadReturnType( - node.left, - node.operatorToken.kind, - node.right, - leftType, - rightType, - ); - - if (!overloadType) { - return { isOverloaded: false, useLeftMethod: false }; + if ( + !checker.__tsover__couldHaveOverloadedOperators( + node.left, + node.operatorToken.kind, + node.right, + leftType, + rightType, + ) + ) { + // Not overlaoded + return undefined; } - // For division, only use left method - if (node.operatorToken.kind === ts.SyntaxKind.SlashToken) { - return { isOverloaded: true, useLeftMethod: true }; + // For non-commutative operators, use the standard library function + if (methodName === 'div' || methodName === 'pow') { + return 'std.op(left, right)'; } - // For other operators, prefer left method, fall back to right + // Since other supported operators are commutative, prefer left method, fall back to right const leftHasMethod = leftType.getProperty(methodName) !== undefined; - return { isOverloaded: true, useLeftMethod: leftHasMethod }; + return leftHasMethod ? 'left.op(right)' : 'right.op(left)'; } function createProgram(allFiles: string[]): ts.Program { @@ -141,10 +150,10 @@ function transformFile( return; } - const { isOverloaded, useLeftMethod } = isOverloadedBinary(node, checker); + const pattern = getOverloadPattern(checker, node); const methodName = operatorToMethod[node.operatorToken.kind]; - if (!isOverloaded || !methodName) { + if (!pattern || !methodName) { return; } @@ -160,27 +169,22 @@ function transformFile( const leftText = magic.slice(leftStart, leftEnd); const rightText = magic.slice(rightStart, rightEnd); + let replacement = ''; + if (pattern === 'std.op(left, right)') { + replacement = `std.${methodName}(${leftText}, ${rightText})`; + } else if (pattern === 'left.op(right)') { + replacement = `${leftText}.${methodName}(${rightText})`; + } else if (pattern === 'right.op(left)') { + replacement = `${rightText}.${methodName}(${leftText})`; + } else { + throw new Error(`Unsupported pattern: ${pattern}`); + } + if (assignmentOperators.includes(node.operatorToken.kind)) { - // Transform a += b into a = a.add(b) - magic.overwrite( - start, - end, - `${leftText} = ${leftText}.${methodName}(${rightText})`, - ); + // E.g. transforms a += b into a = a.add(b) + magic.overwrite(start, end, `${leftText} = ${replacement}`); } else { - if (useLeftMethod) { - magic.overwrite( - start, - end, - `${leftText}.${methodName}(${rightText})`, - ); - } else { - magic.overwrite( - start, - end, - `${rightText}.${methodName}(${leftText})`, - ); - } + magic.overwrite(start, end, replacement); } } diff --git a/packages/typegpu/package.json b/packages/typegpu/package.json index 6ba2f1cb40..ae9961c2cd 100644 --- a/packages/typegpu/package.json +++ b/packages/typegpu/package.json @@ -79,7 +79,7 @@ "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67", "dependencies": { "tinyest": "workspace:~0.2.0", - "tsover-runtime": "^0.0.3", + "tsover-runtime": "^0.0.4", "typed-binary": "^4.3.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c792b3ce3b..bdedf07102 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ catalogs: overrides: rollup: 4.34.8 - typescript: npm:tsover@^5.9.9 + typescript: npm:tsover@^5.9.10 three: ^0.181.0 importers: @@ -56,7 +56,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -79,8 +79,8 @@ importers: specifier: ^0.0.62 version: 0.0.62 typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unplugin-typegpu: specifier: workspace:* version: link:packages/unplugin-typegpu @@ -89,7 +89,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -100,8 +100,8 @@ importers: specifier: 'workspace:' version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unplugin-typegpu: specifier: 'workspace:' version: link:../../packages/unplugin-typegpu @@ -136,16 +136,16 @@ importers: version: 0.25.10 ts-loader: specifier: ^9.5.4 - version: 9.5.4(tsover@5.9.9)(webpack@5.104.1) + version: 9.5.4(tsover@5.9.10)(webpack@5.104.1) tsdown: specifier: ^0.15.6 - version: 0.15.12(tsover@5.9.9)(unrun@0.2.27) + version: 0.15.12(tsover@5.9.10)(unrun@0.2.27) tsx: specifier: ^4.19.2 version: 4.20.6 typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 webpack: specifier: ^5.102.0 version: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) @@ -157,7 +157,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.8.0)(tsover@5.9.9) + version: 0.9.4(prettier@3.8.0)(tsover@5.9.10) '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.10.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -166,13 +166,13 @@ importers: version: 3.7.0 '@astrojs/starlight': specifier: ^0.36.1 - version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/starlight-tailwind': specifier: ^4.0.1 - version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) + version: 4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11) '@astrojs/tailwind': specifier: ^6.0.2 - version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) + version: 6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11) '@babel/standalone': specifier: ^7.28.6 version: 7.28.6 @@ -229,13 +229,13 @@ importers: version: 2.1.28 astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) + version: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1) classnames: specifier: ^2.5.1 version: 2.5.1 expressive-code-twoslash: specifier: ^0.5.3 - version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.9) + version: 0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.10) fuse.js: specifier: catalog:frontend version: 7.1.0 @@ -289,10 +289,10 @@ importers: version: 0.34.2 starlight-blog: specifier: ^0.23.2 - version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + version: 0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) starlight-typedoc: specifier: ^0.19.0 - version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)))(typedoc@0.27.9(tsover@5.9.9)) + version: 0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.10)))(typedoc@0.27.9(tsover@5.9.10)) three: specifier: ^0.181.0 version: 0.181.2 @@ -301,16 +301,16 @@ importers: version: 3.1.1 typedoc: specifier: ^0.27.9 - version: 0.27.9(tsover@5.9.9) + version: 0.27.9(tsover@5.9.10) typedoc-plugin-markdown: specifier: 4.3.0 - version: 4.3.0(typedoc@0.27.9(tsover@5.9.9)) + version: 4.3.0(typedoc@0.27.9(tsover@5.9.10)) typegpu: specifier: workspace:* version: link:../../packages/typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unplugin-typegpu: specifier: workspace:* version: link:../../packages/unplugin-typegpu @@ -347,7 +347,7 @@ importers: version: 0.1.66 astro-vtbot: specifier: ^2.1.10 - version: 2.1.10(prettier@3.8.0)(tsover@5.9.9) + version: 2.1.10(prettier@3.8.0)(tsover@5.9.10) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -374,23 +374,23 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.53.0 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10) devDependencies: '@types/node': specifier: ^25.0.10 version: 25.1.0 '@typescript-eslint/rule-tester': specifier: ^8.53.1 - version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 vitest: specifier: ^4.0.17 - version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -448,10 +448,10 @@ importers: version: link:../tgpu-dev-cli tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.9) + version: 0.20.3(tsover@5.9.10) typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 publishDirectory: dist packages/tinyest-for-wgsl: @@ -474,10 +474,10 @@ importers: version: 8.14.1 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.9) + version: 0.20.3(tsover@5.9.10) typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 publishDirectory: dist packages/typegpu: @@ -486,15 +486,15 @@ importers: specifier: workspace:~0.2.0 version: link:../tinyest tsover-runtime: - specifier: ^0.0.3 - version: 0.0.3 + specifier: ^0.0.4 + version: 0.0.4 typed-binary: specifier: ^4.3.1 version: 4.3.2 devDependencies: '@ark/attest': specifier: ^0.56.0 - version: 0.56.0(tsover@5.9.9) + version: 0.56.0(tsover@5.9.10) '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli @@ -512,10 +512,10 @@ importers: version: 27.0.0(canvas@3.2.0)(postcss@8.5.6) tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.9) + version: 0.20.3(tsover@5.9.10) typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -536,11 +536,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -558,11 +558,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -580,11 +580,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -602,11 +602,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -624,11 +624,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -653,11 +653,11 @@ importers: specifier: workspace:* version: link:../typegpu typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 unbuild: specifier: catalog:build - version: 3.5.0(tsover@5.9.9) + version: 3.5.0(tsover@5.9.10) unplugin-typegpu: specifier: workspace:* version: link:../unplugin-typegpu @@ -734,10 +734,10 @@ importers: version: 4.34.8 tsdown: specifier: catalog:build - version: 0.20.3(tsover@5.9.9) + version: 0.20.3(tsover@5.9.10) typescript: - specifier: npm:tsover@^5.9.9 - version: tsover@5.9.9 + specifier: npm:tsover@^5.9.10 + version: tsover@5.9.10 publishDirectory: dist packages: @@ -6902,11 +6902,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsover-runtime@0.0.3: - resolution: {integrity: sha512-jMv9JQN04DsQLyxBoDxOJZxQVPM84BimxvGyP8Ee8mdExCW0UGa0abkKQhlcAPlJGG3N+pd4MubrOTDfQzWugg==} + tsover-runtime@0.0.4: + resolution: {integrity: sha512-vvv0kU8Yh2RXkdB0yE6mNzGims3ZBIhvyvXJpyawM6G3xtkw4Tzpj2RWtRO0bv0hbrpU5u83oG5/ugBuQKu1FQ==} - tsover@5.9.9: - resolution: {integrity: sha512-t31vJiwnfwAmOC+d2LySJTHzfdmaxpYajuX2FYHYJ8D/X2FMMMJeFx/vBIMBuPya+4ntt47gsn/06HGbeawZ6w==} + tsover@5.9.10: + resolution: {integrity: sha512-15EJyR8tgHh1ExCreWVb1Y2b5tYfLmYuNfD+H1D+LcXuvXHQH+YCkw4TQwTN05Bq1V0RfyY7NWDHCwQLi9fmnQ==} hasBin: true tsx@4.20.6: @@ -7818,16 +7818,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/attest@0.56.0(tsover@5.9.9)': + '@ark/attest@0.56.0(tsover@5.9.10)': dependencies: '@ark/fs': 0.56.0 '@ark/util': 0.56.0 '@prettier/sync': 0.6.1(prettier@3.6.2) '@typescript/analyze-trace': 0.10.1 - '@typescript/vfs': 1.6.1(tsover@5.9.9) + '@typescript/vfs': 1.6.1(tsover@5.9.10) arktype: 2.1.28 prettier: 3.6.2 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color @@ -7857,23 +7857,23 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.9)': + '@astrojs/check@0.9.4(prettier@3.8.0)(tsover@5.9.10)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.9) + '@astrojs/language-server': 2.15.4(prettier@3.8.0)(tsover@5.9.10) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.9)': + '@astrojs/check@0.9.6(prettier@3.8.0)(tsover@5.9.10)': dependencies: - '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.9) + '@astrojs/language-server': 2.16.3(prettier@3.8.0)(tsover@5.9.10) chokidar: 4.0.3 kleur: 4.1.5 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -7887,12 +7887,12 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.9)': + '@astrojs/language-server@2.15.4(prettier@3.8.0)(tsover@5.9.10)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.11(tsover@5.9.9) + '@volar/kit': 2.4.11(tsover@5.9.10) '@volar/language-core': 2.4.11 '@volar/language-server': 2.4.11 '@volar/language-service': 2.4.11 @@ -7912,12 +7912,12 @@ snapshots: transitivePeerDependencies: - typescript - '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.9)': + '@astrojs/language-server@2.16.3(prettier@3.8.0)(tsover@5.9.10)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@volar/kit': 2.4.27(tsover@5.9.9) + '@volar/kit': 2.4.27(tsover@5.9.10) '@volar/language-core': 2.4.27 '@volar/language-server': 2.4.27 '@volar/language-service': 2.4.27 @@ -8015,12 +8015,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/mdx@4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -8076,22 +8076,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@4.0.1(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) tailwindcss: 4.1.11 - '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))': + '@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@astrojs/markdown-remark': 6.3.6 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/sitemap': 3.7.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) - astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1) + astro-expressive-code: 0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.4 @@ -8114,9 +8114,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1) autoprefixer: 10.4.21(postcss@8.5.3) postcss: 8.5.3 postcss-load-config: 4.0.2(postcss@8.5.3) @@ -10059,32 +10059,32 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10)': dependencies: '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.10) '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(tsover@5.9.9)': + '@typescript-eslint/project-service@8.54.0(tsover@5.9.10)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.9) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.10) '@typescript-eslint/types': 8.54.0 debug: 4.4.3 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': + '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10)': dependencies: - '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.10) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10) ajv: 6.12.6 eslint: 9.39.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 @@ -10099,35 +10099,35 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.9)': + '@typescript-eslint/tsconfig-utils@8.54.0(tsover@5.9.10)': dependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.9)': + '@typescript-eslint/typescript-estree@8.54.0(tsover@5.9.10)': dependencies: - '@typescript-eslint/project-service': 8.54.0(tsover@5.9.9) - '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.9) + '@typescript-eslint/project-service': 8.54.0(tsover@5.9.10) + '@typescript-eslint/tsconfig-utils': 8.54.0(tsover@5.9.10) '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(tsover@5.9.9) - typescript: tsover@5.9.9 + ts-api-utils: 2.4.0(tsover@5.9.10) + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.9)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(tsover@5.9.10)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.9) + '@typescript-eslint/typescript-estree': 8.54.0(tsover@5.9.10) eslint: 9.39.2(jiti@2.6.1) - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color @@ -10147,10 +10147,10 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 - '@typescript/vfs@1.6.1(tsover@5.9.9)': + '@typescript/vfs@1.6.1(tsover@5.9.10)': dependencies: debug: 4.4.3 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color @@ -10172,16 +10172,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.21 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -10221,9 +10221,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -10244,13 +10244,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.9) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.10) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': @@ -10262,13 +10262,13 @@ snapshots: msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.9) + msw: 2.10.2(@types/node@25.1.0)(tsover@5.9.10) vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': @@ -10319,21 +10319,21 @@ snapshots: '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - '@volar/kit@2.4.11(tsover@5.9.9)': + '@volar/kit@2.4.11(tsover@5.9.10)': dependencies: '@volar/language-service': 2.4.11 '@volar/typescript': 2.4.11 typesafe-path: 0.2.2 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - '@volar/kit@2.4.27(tsover@5.9.9)': + '@volar/kit@2.4.27(tsover@5.9.10)': dependencies: '@volar/language-service': 2.4.27 '@volar/typescript': 2.4.27 typesafe-path: 0.2.2 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -10413,9 +10413,9 @@ snapshots: '@vtbag/element-crossing@1.1.0': {} - '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.9)': + '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(tsover@5.9.10)': dependencies: - '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.9) + '@astrojs/check': 0.9.6(prettier@3.8.0)(tsover@5.9.10) transitivePeerDependencies: - prettier - prettier-plugin-astro @@ -10631,9 +10631,9 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)): + astro-expressive-code@0.41.2(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1) + astro: 5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1) rehype-expressive-code: 0.41.2 astro-remote@0.3.3: @@ -10644,11 +10644,11 @@ snapshots: marked-smartypants: 1.1.9(marked@12.0.2) ultrahtml: 1.6.0 - astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.9): + astro-vtbot@2.1.10(prettier@3.8.0)(tsover@5.9.10): dependencies: '@vtbag/cam-shaft': 1.0.6 '@vtbag/element-crossing': 1.1.0 - '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.9) + '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(tsover@5.9.10) '@vtbag/turn-signal': 1.3.1 '@vtbag/utensil-drawer': 1.2.14 transitivePeerDependencies: @@ -10656,7 +10656,7 @@ snapshots: - prettier-plugin-astro - typescript - astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1): + astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -10706,7 +10706,7 @@ snapshots: smol-toml: 1.6.0 tinyexec: 1.0.2 tinyglobby: 0.2.15 - tsconfck: 3.1.6(tsover@5.9.9) + tsconfck: 3.1.6(tsover@5.9.10) ultrahtml: 1.6.0 unifont: 0.6.0 unist-util-visit: 5.0.0 @@ -10719,7 +10719,7 @@ snapshots: yocto-spinner: 0.2.3 zod: 3.25.76 zod-to-json-schema: 3.25.1(zod@3.25.76) - zod-to-ts: 1.2.0(tsover@5.9.9)(zod@3.25.76) + zod-to-ts: 1.2.0(tsover@5.9.10)(zod@3.25.76) optionalDependencies: sharp: 0.34.2 transitivePeerDependencies: @@ -11410,7 +11410,7 @@ snapshots: glob: 10.5.0 ora: 5.4.1 tslib: 2.8.1 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 yargs: 17.7.2 dset@3.1.4: {} @@ -11707,15 +11707,15 @@ snapshots: expect-type@1.3.0: {} - expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.9): + expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(tsover@5.9.10): dependencies: '@expressive-code/core': 0.41.2 expressive-code: 0.41.2 mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.0 - twoslash: 0.2.12(tsover@5.9.9) - typescript: tsover@5.9.9 + twoslash: 0.2.12(tsover@5.9.10) + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color @@ -13140,7 +13140,7 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mkdist@2.2.0(tsover@5.9.9): + mkdist@2.2.0(tsover@5.9.10): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) citty: 0.1.6 @@ -13156,7 +13156,7 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 mlly@1.8.0: dependencies: @@ -13192,7 +13192,7 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9): + msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 @@ -13213,7 +13213,7 @@ snapshots: type-fest: 4.41.0 yargs: 17.7.2 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - '@types/node' optional: true @@ -14099,7 +14099,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.9): + rolldown-plugin-dts@0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.10): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.6 @@ -14112,11 +14112,11 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-beta.45 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.9): + rolldown-plugin-dts@0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.10): dependencies: '@babel/generator': 8.0.0-rc.1 '@babel/helper-validator-identifier': 8.0.0-rc.1 @@ -14129,7 +14129,7 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0-rc.3 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - oxc-resolver @@ -14194,11 +14194,11 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.3 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.3 - rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.9): + rollup-plugin-dts@6.1.1(rollup@4.34.8)(tsover@5.9.10): dependencies: magic-string: 0.30.21 rollup: 4.34.8 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 optionalDependencies: '@babel/code-frame': 7.27.1 @@ -14381,12 +14381,12 @@ snapshots: stackback@0.0.2: {} - starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)): + starlight-blog@0.23.2(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@astrojs/markdown-remark': 6.3.1 - '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/mdx': 4.2.6(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) '@astrojs/rss': 4.0.11 - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) astro-remote: 0.3.3 github-slugger: 2.0.0 marked: 15.0.7 @@ -14398,12 +14398,12 @@ snapshots: - astro - supports-color - starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)))(typedoc@0.27.9(tsover@5.9.9)): + starlight-typedoc@0.19.0(@astrojs/starlight@0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)))(typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.10)))(typedoc@0.27.9(tsover@5.9.10)): dependencies: - '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.9)(tsx@4.20.6)(yaml@2.8.1)) + '@astrojs/starlight': 0.36.1(astro@5.15.9(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.34.8)(terser@5.44.1)(tsover@5.9.10)(tsx@4.20.6)(yaml@2.8.1)) github-slugger: 2.0.0 - typedoc: 0.27.9(tsover@5.9.9) - typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.9)) + typedoc: 0.27.9(tsover@5.9.10) + typedoc-plugin-markdown: 4.3.0(typedoc@0.27.9(tsover@5.9.10)) state-local@1.0.7: {} @@ -14629,25 +14629,25 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(tsover@5.9.9): + ts-api-utils@2.4.0(tsover@5.9.10): dependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 - ts-loader@9.5.4(tsover@5.9.9)(webpack@5.104.1): + ts-loader@9.5.4(tsover@5.9.10)(webpack@5.104.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.3 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.4 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 webpack: 5.104.1(esbuild@0.25.10)(webpack-cli@6.0.1) - tsconfck@3.1.6(tsover@5.9.9): + tsconfck@3.1.6(tsover@5.9.10): optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 - tsdown@0.15.12(tsover@5.9.9)(unrun@0.2.27): + tsdown@0.15.12(tsover@5.9.10)(unrun@0.2.27): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14657,14 +14657,14 @@ snapshots: empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.45 - rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.9) + rolldown-plugin-dts: 0.17.8(rolldown@1.0.0-beta.45)(tsover@5.9.10) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.4.2 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 unrun: 0.2.27 transitivePeerDependencies: - '@ts-macro/tsc' @@ -14673,7 +14673,7 @@ snapshots: - supports-color - vue-tsc - tsdown@0.20.3(tsover@5.9.9): + tsdown@0.20.3(tsover@5.9.10): dependencies: ansis: 4.2.0 cac: 6.7.14 @@ -14684,7 +14684,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.3 rolldown: 1.0.0-rc.3 - rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.9) + rolldown-plugin-dts: 0.22.1(rolldown@1.0.0-rc.3)(tsover@5.9.10) semver: 7.7.3 tinyexec: 1.0.2 tinyglobby: 0.2.15 @@ -14692,7 +14692,7 @@ snapshots: unconfig-core: 7.4.2 unrun: 0.2.27 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' @@ -14702,12 +14702,12 @@ snapshots: tslib@2.8.1: {} - tsover-runtime@0.0.3: + tsover-runtime@0.0.4: dependencies: minimatch: 9.0.5 unplugin: 2.3.5 - tsover@5.9.9: + tsover@5.9.10: dependencies: minimatch: 9.0.5 unplugin: 2.3.5 @@ -14728,11 +14728,11 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash@0.2.12(tsover@5.9.9): + twoslash@0.2.12(tsover@5.9.10): dependencies: - '@typescript/vfs': 1.6.1(tsover@5.9.9) + '@typescript/vfs': 1.6.1(tsover@5.9.10) twoslash-protocol: 0.2.12 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - supports-color @@ -14748,17 +14748,17 @@ snapshots: typed-binary@4.3.2: {} - typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.9)): + typedoc-plugin-markdown@4.3.0(typedoc@0.27.9(tsover@5.9.10)): dependencies: - typedoc: 0.27.9(tsover@5.9.9) + typedoc: 0.27.9(tsover@5.9.10) - typedoc@0.27.9(tsover@5.9.9): + typedoc@0.27.9(tsover@5.9.10): dependencies: '@gerrit0/mini-shiki': 1.27.2 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 yaml: 2.8.1 typesafe-path@0.2.2: {} @@ -14780,7 +14780,7 @@ snapshots: ultrahtml@1.6.0: {} - unbuild@3.5.0(tsover@5.9.9): + unbuild@3.5.0(tsover@5.9.10): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.34.8) '@rollup/plugin-commonjs': 28.0.3(rollup@4.34.8) @@ -14796,18 +14796,18 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.2.0(tsover@5.9.9) + mkdist: 2.2.0(tsover@5.9.10) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.1.0 pretty-bytes: 6.1.1 rollup: 4.34.8 - rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.9) + rollup-plugin-dts: 6.1.1(rollup@4.34.8)(tsover@5.9.10) scule: 1.3.0 tinyglobby: 0.2.15 untyped: 2.0.0 optionalDependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 transitivePeerDependencies: - sass - vue @@ -15127,11 +15127,11 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15155,7 +15155,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 25.1.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -15215,10 +15215,10 @@ snapshots: - tsx - yaml - vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.9))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(tsover@5.9.10))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -15671,9 +15671,9 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-ts@1.2.0(tsover@5.9.9)(zod@3.25.76): + zod-to-ts@1.2.0(tsover@5.9.10)(zod@3.25.76): dependencies: - typescript: tsover@5.9.9 + typescript: tsover@5.9.10 zod: 3.25.76 zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4282f76a23..71e43dda5c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,7 +11,7 @@ catalogs: unbuild: ^3.5.0 jiti: ^2.6.0 types: - typescript: npm:tsover@^5.9.9 + typescript: npm:tsover@^5.9.10 "@webgpu/types": ^0.1.66 "@types/three": "^0.181.0" test: From 6d30a04d520c6e7f4c4f9dad74bc9e50ca44a2e0 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 13:14:32 +0100 Subject: [PATCH 15/23] Import `std` when needed --- .../scripts/transform-overloads.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/apps/typegpu-docs/scripts/transform-overloads.ts b/apps/typegpu-docs/scripts/transform-overloads.ts index 81ccaa1e1e..4ba4a7b9ba 100644 --- a/apps/typegpu-docs/scripts/transform-overloads.ts +++ b/apps/typegpu-docs/scripts/transform-overloads.ts @@ -127,6 +127,38 @@ function createProgram(allFiles: string[]): ts.Program { return ts.createProgram(allFiles, compilerOptions, host); } +function isStdDeclared(sourceFile: ts.SourceFile): boolean { + for (const stmt of sourceFile.statements) { + if (!ts.isImportDeclaration(stmt)) { + continue; + } + const moduleSpecifier = stmt.moduleSpecifier; + if (!ts.isStringLiteral(moduleSpecifier)) { + continue; + } + const namedBindings = stmt.importClause?.namedBindings; + // Case 1: import { std } from 'typegpu' + if ( + moduleSpecifier.text === 'typegpu' && + namedBindings && + ts.isNamedImports(namedBindings) && + namedBindings.elements.some((el) => el.name.text === 'std') + ) { + return true; + } + // Case 2: import * as std from 'typegpu/std' + if ( + moduleSpecifier.text === 'typegpu/std' && + namedBindings && + ts.isNamespaceImport(namedBindings) && + namedBindings.name.text === 'std' + ) { + return true; + } + } + return false; +} + function transformFile( sourceFilePath: string, program: ts.Program, @@ -141,6 +173,7 @@ function transformFile( const sourceText = sourceFile.text; const magic = new MagicString(sourceText); let hasChanges = false; + let needsStd = false; function visit(node: ts.Node): void { // Visit all children of the node first, then process the node itself @@ -171,6 +204,7 @@ function transformFile( let replacement = ''; if (pattern === 'std.op(left, right)') { + needsStd = true; replacement = `std.${methodName}(${leftText}, ${rightText})`; } else if (pattern === 'left.op(right)') { replacement = `${leftText}.${methodName}(${rightText})`; @@ -190,6 +224,10 @@ function transformFile( visit(sourceFile); + if (needsStd && !isStdDeclared(sourceFile)) { + magic.prepend("import { std } from 'typegpu';\n"); + } + return { code: magic.toString(), hasChanges }; } From 85f80f70583f840d9bb982987be865b454d4a18b Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 13:21:01 +0100 Subject: [PATCH 16/23] =?UTF-8?q?=F0=9F=A6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-workspace.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 71e43dda5c..44c6c5797b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,6 @@ packages: - - "packages/*" - - "apps/*" + - 'packages/*' + - 'apps/*' catalog: arktype: ^2.1.22 @@ -12,13 +12,13 @@ catalogs: jiti: ^2.6.0 types: typescript: npm:tsover@^5.9.10 - "@webgpu/types": ^0.1.66 - "@types/three": "^0.181.0" + '@webgpu/types': ^0.1.66 + '@types/three': '^0.181.0' test: vitest: ^3.2.4 frontend: - "vite-imagetools": ^9.0.0 - "fuse.js": ^7.1.0 + 'vite-imagetools': ^9.0.0 + 'fuse.js': ^7.1.0 example: - "wgpu-matrix": ^3.4.0 + 'wgpu-matrix': ^3.4.0 three: ^0.181.0 From 55277672994489075c6e4cfe315558cf44a0dac3 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Fri, 20 Feb 2026 16:29:12 +0100 Subject: [PATCH 17/23] refactor: More tsover migrations --- .../docs/ecosystem/typegpu-three/index.mdx | 22 +++- .../image-processing/ascii-filter/index.ts | 14 +-- .../background-segmentation/shaders.ts | 15 +-- .../src/examples/rendering/3d-fish/compute.ts | 2 +- .../src/examples/rendering/caustics/index.ts | 56 ++++------ .../src/examples/rendering/clouds/index.ts | 71 ++++++------ .../src/examples/rendering/clouds/utils.ts | 57 +++++----- .../src/examples/simple/ripple-cube/pbr.ts | 51 +++------ .../simple/ripple-cube/post-processing.ts | 101 ++++++++---------- .../examples/simple/ripple-cube/sdf-scene.ts | 8 +- .../src/examples/simple/stencil/index.ts | 3 +- .../src/examples/simple/vaporrave/floor.ts | 14 +-- .../src/examples/simple/vaporrave/index.ts | 21 ++-- .../src/examples/simple/vaporrave/sphere.ts | 7 +- .../src/examples/simulation/boids/index.ts | 63 ++++------- .../examples/simulation/gravity/compute.ts | 30 +++--- .../src/examples/simulation/gravity/render.ts | 30 +++--- .../simulation/slime-mold-3d/index.ts | 98 ++++++++--------- .../examples/simulation/slime-mold/index.ts | 34 +++--- .../simulation/stable-fluid/render.ts | 7 +- .../simulation/stable-fluid/simulation.ts | 83 +++++++------- .../src/examples/tests/uniformity/index.ts | 7 +- .../src/examples/threejs/attractors/index.ts | 32 +++--- .../examples/threejs/compute-cloth/index.ts | 2 +- .../threejs/compute-cloth/triNoise.ts | 10 +- .../examples/threejs/compute-cloth/verlet.ts | 19 ++-- .../threejs/compute-geometry/index.ts | 30 ++---- .../compute-particles-snow/entities.ts | 5 +- .../threejs/compute-particles-snow/index.ts | 14 +-- .../threejs/compute-particles/index.ts | 17 ++- .../src/examples/threejs/simple/index.ts | 12 +-- packages/typegpu-noise/src/generator.ts | 8 +- .../typegpu-noise/src/perlin-2d/algorithm.ts | 49 ++++----- .../typegpu-noise/src/perlin-3d/algorithm.ts | 33 +++--- packages/typegpu-noise/src/random.ts | 11 +- packages/typegpu-noise/src/utils.ts | 13 +-- packages/typegpu-sdf/src/2d.ts | 68 ++++++------ packages/typegpu-sdf/src/3d.ts | 26 +++-- .../tests/examples/individual/3d-fish.test.ts | 2 +- .../examples/individual/ascii-filter.test.ts | 2 +- .../tests/examples/individual/boids.test.ts | 42 +++----- .../examples/individual/caustics.test.ts | 8 +- .../tests/examples/individual/clouds.test.ts | 22 ++-- .../tests/examples/individual/gravity.test.ts | 7 +- .../examples/individual/jelly-slider.test.ts | 4 +- .../examples/individual/perlin-noise.test.ts | 2 +- .../examples/individual/ripple-cube.test.ts | 4 +- .../examples/individual/slime-mold-3d.test.ts | 10 +- .../examples/individual/slime-mold.test.ts | 14 +-- .../individual/smoky-triangle.test.ts | 2 +- .../examples/individual/stable-fluid.test.ts | 4 +- .../examples/individual/vaporrave.test.ts | 4 +- 52 files changed, 573 insertions(+), 697 deletions(-) diff --git a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-three/index.mdx b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-three/index.mdx index 94efced101..26f3ad740e 100644 --- a/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-three/index.mdx +++ b/apps/typegpu-docs/src/content/docs/ecosystem/typegpu-three/index.mdx @@ -148,7 +148,7 @@ const material = new THREE.MeshBasicNodeMaterial(); material.colorNode = t3.toTSL(() => { 'use gpu'; - const coords = t3.uv().$.mul(2); + const coords = t3.uv().$ * 2; const pattern = perlin3d.sample(d.vec3f(coords, t3.time.$ * 0.2)); return d.vec4f(std.tanh(pattern * 5), 0.2, 0.4, 1); }); @@ -244,12 +244,28 @@ Loop({ start: ptrStart, end: ptrEnd, type: 'uint', condition: '<' }, ({ i }) => ``` TypeGPU: -```ts +```ts twoslash +'use tsover'; +import * as t3 from '@typegpu/three'; +import * as THREE from 'three/webgpu'; +import { d, std } from 'typegpu'; +type TSLStorageAccessor = t3.TSLAccessor< + T, + THREE.StorageBufferNode +>; +declare const springListBuffer: TSLStorageAccessor>; +declare const springForceBuffer: TSLStorageAccessor>; +declare const springVertexIdBuffer: TSLStorageAccessor> +declare const ptrStart: number; +declare const ptrEnd: number; +declare const idx: number; +declare let force: d.v3f; +// ---cut--- for (let i = ptrStart; i < ptrEnd; i++) { const springId = springListBuffer.$[i]; const springForce = springForceBuffer.$[springId]; const springVertexIds = springVertexIdBuffer.$[springId]; const factor = std.select(-1, 1, springVertexIds.x === idx); - force = force.add(springForce.mul(d.f32(factor))); + force += springForce * factor; } ``` diff --git a/apps/typegpu-docs/src/examples/image-processing/ascii-filter/index.ts b/apps/typegpu-docs/src/examples/image-processing/ascii-filter/index.ts index 26bd494ad0..f753579d8b 100644 --- a/apps/typegpu-docs/src/examples/image-processing/ascii-filter/index.ts +++ b/apps/typegpu-docs/src/examples/image-processing/ascii-filter/index.ts @@ -30,8 +30,9 @@ const displayModes = { * https://www.shadertoy.com/view/lssGDj */ const characterFn = tgpu.fn([d.u32, d.vec2f], d.f32)((n, p) => { + 'use gpu'; // Transform texture coordinates to character bitmap coordinates (5x5 grid) - const pos = std.floor(p.mul(d.vec2f(-4, 4)).add(2.5)); + const pos = std.floor(p * d.vec2f(-4, 4) + 2.5); // Check if position is outside the 5x5 character bitmap bounds if (pos.x < 0 || pos.x > 4 || pos.y < 0 || pos.y > 4) { @@ -58,17 +59,16 @@ const pipeline = root.createRenderPipeline({ */ fragment: ({ uv }) => { 'use gpu'; - const uv2 = std.mul(uvTransformBuffer.$, uv.sub(0.5)).add(0.5); + const uv2 = uvTransformBuffer.$ * (uv - 0.5) + 0.5; const textureSize = d.vec2f( std.textureDimensions(layout.$.externalTexture), ); - const pix = uv2.mul(textureSize); + const pix = uv2 * textureSize; const cellSize = d.f32(glyphSize.$); const halfCell = cellSize * 0.5; - const blockCoord = std.floor(pix.div(cellSize)) - .mul(cellSize).div(textureSize); + const blockCoord = std.floor(pix / cellSize) * cellSize / textureSize; const color = std.textureSampleBaseClampToEdge( layout.$.externalTexture, @@ -77,7 +77,7 @@ const pipeline = root.createRenderPipeline({ ); const rawGray = 0.3 * color.x + 0.59 * color.y + 0.11 * color.z; - const gray = std.pow(rawGray, gammaCorrection.$); + const gray = rawGray ** gammaCorrection.$; let n = d.u32(4096); if (charsetExtended.$ === 0) { @@ -143,7 +143,7 @@ const pipeline = root.createRenderPipeline({ let resultColor = d.vec3f(1); // Color mode if (displayMode.$ === displayModes.color) { - resultColor = color.mul(charValue).rgb; + resultColor = color.rgb * charValue; } // Grayscale mode if (displayMode.$ === displayModes.grayscale) { diff --git a/apps/typegpu-docs/src/examples/image-processing/background-segmentation/shaders.ts b/apps/typegpu-docs/src/examples/image-processing/background-segmentation/shaders.ts index 3569da6019..b6737c0926 100644 --- a/apps/typegpu-docs/src/examples/image-processing/background-segmentation/shaders.ts +++ b/apps/typegpu-docs/src/examples/image-processing/background-segmentation/shaders.ts @@ -49,16 +49,17 @@ export const computeFn = tgpu.computeFn({ in: { wid: d.builtin.workgroupId, lid: d.builtin.localInvocationId }, workgroupSize: [32, 1, 1], })(({ wid, lid }) => { + 'use gpu'; const filterOffset = d.i32((filterDim - 1) / 2); const dims = d.vec2i(std.textureDimensions(blurLayout.$.inTexture)); - const baseIndex = d.vec2i( - wid.xy.mul(d.vec2u(blockDim, 4)).add(lid.xy.mul(d.vec2u(4, 1))), - ).sub(d.vec2i(filterOffset, 0)); + const baseIndex = + d.vec2i(wid.xy * d.vec2u(blockDim, 4) + lid.xy * d.vec2u(4, 1)) - + d.vec2i(filterOffset, 0); // Load a tile of pixels into shared memory for (let r = 0; r < 4; r++) { for (let c = 0; c < 4; c++) { - let loadIndex = baseIndex.add(d.vec2i(c, r)); + let loadIndex = baseIndex + d.vec2i(c, r); if (flipAccess.$) { loadIndex = loadIndex.yx; } @@ -66,7 +67,7 @@ export const computeFn = tgpu.computeFn({ tileData.$[r][lid.x * 4 + d.u32(c)] = std.textureSampleLevel( blurLayout.$.inTexture, blurLayout.$.sampler, - d.vec2f(d.vec2f(loadIndex).add(d.vec2f(0.5)).div(d.vec2f(dims))), + (d.vec2f(loadIndex) + 0.5) / d.vec2f(dims), 0, ).rgb; } @@ -77,7 +78,7 @@ export const computeFn = tgpu.computeFn({ // Apply the horizontal blur filter and write to the output texture for (let r = 0; r < 4; r++) { for (let c = 0; c < 4; c++) { - let writeIndex = baseIndex.add(d.vec2i(c, r)); + let writeIndex = baseIndex + d.vec2i(c, r); if (flipAccess.$) { writeIndex = writeIndex.yx; } @@ -91,7 +92,7 @@ export const computeFn = tgpu.computeFn({ let acc = d.vec3f(); for (let f = 0; f < filterDim; f++) { const i = center + f - filterOffset; - acc = acc.add(tileData.$[r][i].mul(1 / filterDim)); + acc += tileData.$[r][i] / filterDim; } std.textureStore(blurLayout.$.outTexture, writeIndex, d.vec4f(acc, 1)); } diff --git a/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts b/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts index 2c917155a0..152667c077 100644 --- a/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts +++ b/apps/typegpu-docs/src/examples/rendering/3d-fish/compute.ts @@ -22,7 +22,7 @@ export const simulate = (fishIndex: number) => { const other = layout.$.currentFishData[i]; const dist = std.distance(fishData.position, other.position); if (dist < layout.$.fishBehavior.separationDist) { - separation = separation + fishData.position - other.position; + separation += fishData.position - other.position; } if (dist < layout.$.fishBehavior.alignmentDist) { alignment = alignment + other.direction; diff --git a/apps/typegpu-docs/src/examples/rendering/caustics/index.ts b/apps/typegpu-docs/src/examples/rendering/caustics/index.ts index 5d8ea746f7..3296bbba18 100644 --- a/apps/typegpu-docs/src/examples/rendering/caustics/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/caustics/index.ts @@ -22,17 +22,17 @@ const mainVertex = tgpu.vertexFn({ const tilePattern = (uv: d.v2f): number => { 'use gpu'; const tiledUv = std.fract(uv); - const proximity = std.abs(std.sub(std.mul(tiledUv, 2), 1)); + const proximity = std.abs((tiledUv * 2) - 1); const maxProximity = std.max(proximity.x, proximity.y); - return std.saturate(std.pow(1 - maxProximity, 0.6) * 5); + return std.saturate(((1 - maxProximity) ** 0.6) * 5); }; const caustics = (uv: d.v2f, time: number, profile: d.v3f): d.v3f => { 'use gpu'; - const distortion = perlin3d.sample(d.vec3f(std.mul(uv, 0.5), time * 0.2)); + const distortion = perlin3d.sample(d.vec3f(uv * 0.5, time * 0.2)); // Distorting UV coordinates - const uv2 = std.add(uv, distortion); - const noise = std.abs(perlin3d.sample(d.vec3f(std.mul(uv2, 5), time))); + const uv2 = uv + distortion; + const noise = std.abs(perlin3d.sample(d.vec3f(uv2 * 5, time))); return std.pow(d.vec3f(1 - noise), profile); }; @@ -65,6 +65,7 @@ const mainFragment = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })(({ uv }) => { + 'use gpu'; /** * A transformation matrix that skews the perspective a bit * when applied to UV coordinates @@ -73,8 +74,8 @@ const mainFragment = tgpu.fragmentFn({ d.vec2f(std.cos(angle), std.sin(angle)), d.vec2f(-std.sin(angle) * 10 + uv.x * 3, std.cos(angle) * 5), ); - const skewedUv = std.mul(skewMat, uv); - const tile = tilePattern(std.mul(skewedUv, tileDensity.$)); + const skewedUv = skewMat * uv; + const tile = tilePattern(skewedUv * tileDensity.$); const albedo = std.mix(d.vec3f(0.1), d.vec3f(1), tile); // Transforming coordinates to simulate perspective squash @@ -83,49 +84,38 @@ const mainFragment = tgpu.fragmentFn({ std.pow((uv.y * 1.5 + 0.1) * 1.5, 3) * 1, ); // Generating two layers of caustics (large scale, and small scale) - const c1 = std.mul( - caustics(cuv, time.$ * 0.2, /* profile */ d.vec3f(4, 4, 1)), + const c1 = caustics(cuv, time.$ * 0.2, /* profile */ d.vec3f(4, 4, 1)) * // Tinting - d.vec3f(0.4, 0.65, 1), - ); - const c2 = std.mul( - caustics(std.mul(cuv, 2), time.$ * 0.4, /* profile */ d.vec3f(16, 1, 4)), + d.vec3f(0.4, 0.65, 1); + const c2 = caustics(cuv * 2, time.$ * 0.4, /* profile */ d.vec3f(16, 1, 4)) * // Tinting - d.vec3f(0.18, 0.3, 0.5), - ); + d.vec3f(0.18, 0.3, 0.5); // -- BLEND -- - const blendCoord = d.vec3f(std.mul(uv, d.vec2f(5, 10)), time.$ * 0.2 + 5); + const blendCoord = d.vec3f(uv * d.vec2f(5, 10), time.$ * 0.2 + 5); // A smooth blending factor, so that caustics only appear at certain spots const blend = std.saturate(perlin3d.sample(blendCoord) + 0.3); // -- FOG -- - const noFogColor = std.mul( - albedo, - std.mix(ambientColor, std.add(c1, c2), blend), - ); + const noFogColor = albedo * std.mix(ambientColor, c1 + c2, blend); // Fog blending factor, based on the height of the pixels - const fog = std.min(std.pow(uv.y, 0.5) * 1.2, 1); + const fog = std.min((uv.y ** 0.5) * 1.2, 1); // -- GOD RAYS -- - const godRayUv = std.mul(std.mul(rotateXY(-0.3), uv), d.vec2f(15, 3)); - const godRayFactor = std.pow(uv.y, 1); - const godRay1 = std.mul( - std.add(perlin3d.sample(d.vec3f(godRayUv, time.$ * 0.5)), 1), + const godRayUv = rotateXY(-0.3) * uv * d.vec2f(15, 3); + const godRayFactor = uv.y; + const godRay1 = (perlin3d.sample(d.vec3f(godRayUv, time.$ * 0.5)) + 1) * // Tinting - std.mul(d.vec3f(0.18, 0.3, 0.5), godRayFactor), - ); - const godRay2 = std.mul( - std.add(perlin3d.sample(d.vec3f(std.mul(godRayUv, 2), time.$ * 0.3)), 1), + d.vec3f(0.18, 0.3, 0.5) * godRayFactor; + const godRay2 = (perlin3d.sample(d.vec3f(godRayUv * 2, time.$ * 0.3)) + 1) * // Tinting - std.mul(d.vec3f(0.18, 0.3, 0.5), godRayFactor * 0.4), - ); - const godRays = std.add(godRay1, godRay2); + d.vec3f(0.18, 0.3, 0.5) * godRayFactor * 0.4; + const godRays = godRay1 + godRay2; - return d.vec4f(std.add(std.mix(noFogColor, fogColor, fog), godRays), 1); + return d.vec4f(std.mix(noFogColor, fogColor, fog) + godRays, 1); }); const canvas = document.querySelector('canvas') as HTMLCanvasElement; diff --git a/apps/typegpu-docs/src/examples/rendering/clouds/index.ts b/apps/typegpu-docs/src/examples/rendering/clouds/index.ts index 10ad41e2cd..94cad5f03a 100644 --- a/apps/typegpu-docs/src/examples/rendering/clouds/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/clouds/index.ts @@ -55,47 +55,40 @@ const bindGroup = root.createBindGroup(cloudsLayout, { sampler, }); -const mainFragment = tgpu.fragmentFn({ - in: { uv: d.vec2f }, - out: d.vec4f, -})(({ uv }) => { - randf.seed2(uv.mul(cloudsLayout.$.params.time)); - const screenRes = resolutionUniform.$; - const aspect = screenRes.x / screenRes.y; - - let screenPos = std.mul(std.sub(uv, 0.5), 2.0); - screenPos = d.vec2f( - screenPos.x * std.max(aspect, 1.0), - screenPos.y * std.max(1.0 / aspect, 1.0), - ); - - const sunDir = std.normalize(SUN_DIRECTION); - const time = cloudsLayout.$.params.time; - const rayOrigin = d.vec3f( - std.sin(time * 0.6) * 0.5, - std.cos(time * 0.8) * 0.5 - 1, - time * WIND_SPEED, - ); - const rayDir = std.normalize(d.vec3f(screenPos.x, screenPos.y, FOV_FACTOR)); - - const sunDot = std.clamp(std.dot(rayDir, sunDir), 0.0, 1.0); - const sunGlow = std.pow( - sunDot, - 1.0 / (SUN_BRIGHTNESS * SUN_BRIGHTNESS * SUN_BRIGHTNESS), - ); - - let skyCol = std.sub(SKY_HORIZON, std.mul(SKY_ZENITH_TINT, rayDir.y * 0.35)); - skyCol = std.add(skyCol, std.mul(SUN_GLOW, sunGlow)); - - const cloudCol = raymarch(rayOrigin, rayDir, sunDir); - const finalCol = std.add(std.mul(skyCol, 1.1 - cloudCol.a), cloudCol.rgb); - - return d.vec4f(finalCol, 1.0); -}); - const pipeline = root.createRenderPipeline({ vertex: common.fullScreenTriangle, - fragment: mainFragment, + fragment: ({ uv }) => { + 'use gpu'; + randf.seed2(uv * cloudsLayout.$.params.time); + const screenRes = resolutionUniform.$; + const aspect = screenRes.x / screenRes.y; + + let screenPos = (uv - 0.5) * 2; + screenPos = d.vec2f( + screenPos.x * std.max(aspect, 1), + screenPos.y * std.max(1 / aspect, 1), + ); + + const sunDir = std.normalize(SUN_DIRECTION); + const time = cloudsLayout.$.params.time; + const rayOrigin = d.vec3f( + std.sin(time * 0.6) * 0.5, + std.cos(time * 0.8) * 0.5 - 1, + time * WIND_SPEED, + ); + const rayDir = std.normalize(d.vec3f(screenPos.x, screenPos.y, FOV_FACTOR)); + + const sunDot = std.saturate(std.dot(rayDir, sunDir)); + const sunGlow = sunDot ** (1 / SUN_BRIGHTNESS ** 3); + + let skyCol = SKY_HORIZON - SKY_ZENITH_TINT * rayDir.y * 0.35; + skyCol += SUN_GLOW * sunGlow; + + const cloudCol = raymarch(rayOrigin, rayDir, sunDir); + const finalCol = skyCol * (1.1 - cloudCol.a) + cloudCol.rgb; + + return d.vec4f(finalCol, 1.0); + }, targets: { format: presentationFormat }, }); diff --git a/apps/typegpu-docs/src/examples/rendering/clouds/utils.ts b/apps/typegpu-docs/src/examples/rendering/clouds/utils.ts index 71a1bec9b5..1108708372 100644 --- a/apps/typegpu-docs/src/examples/rendering/clouds/utils.ts +++ b/apps/typegpu-docs/src/examples/rendering/clouds/utils.ts @@ -23,13 +23,15 @@ const sampleDensity = tgpu.fn([d.vec3f], d.f32)((pos) => { return std.saturate(fbm(pos) + coverage) - 0.5; }); -const sampleDensityCheap = tgpu.fn([d.vec3f], d.f32)((pos) => { - const noise = noise3d(std.mul(pos, CLOUD_FREQUENCY)) * CLOUD_AMPLITUDE; - return std.clamp(noise + CLOUD_COVERAGE - 0.5, 0.0, 1.0); -}); +const sampleDensityCheap = (pos: d.v3f): number => { + 'use gpu'; + const noise = noise3d(pos * CLOUD_FREQUENCY) * CLOUD_AMPLITUDE; + return std.saturate(noise + CLOUD_COVERAGE - 0.5); +}; export const raymarch = tgpu.fn([d.vec3f, d.vec3f, d.vec3f], d.vec4f)( (rayOrigin, rayDir, sunDir) => { + 'use gpu'; let accum = d.vec4f(); const params = cloudsLayout.$.params; @@ -40,27 +42,23 @@ export const raymarch = tgpu.fn([d.vec3f, d.vec3f, d.vec3f], d.vec4f)( let dist = randf.sample() * stepSize; for (let i = 0; i < maxSteps; i++) { - const samplePos = std.add(rayOrigin, std.mul(rayDir, dist * maxDepth)); + const samplePos = rayOrigin + rayDir * dist * maxDepth; const cloudDensity = sampleDensity(samplePos); if (cloudDensity > 0.0) { - const shadowPos = std.add(samplePos, sunDir); + const shadowPos = samplePos + sunDir; const shadowDensity = sampleDensityCheap(shadowPos); - const shadow = std.clamp(cloudDensity - shadowDensity, 0.0, 1.0); + const shadow = std.saturate(cloudDensity - shadowDensity); const lightVal = std.mix(0.3, 1.0, shadow); - const light = std.add( - std.mul(SKY_AMBIENT, 1.1), - std.mul(SUN_COLOR, lightVal * SUN_BRIGHTNESS), - ); + const light = SKY_AMBIENT * 1.1 + + SUN_COLOR * lightVal * SUN_BRIGHTNESS; const color = std.mix(CLOUD_BRIGHT, CLOUD_DARK, cloudDensity); - const lit = std.mul(color, light); + const lit = color * light; - const contrib = std.mul( - d.vec4f(lit, 1), - cloudDensity * (LIGHT_ABSORPTION - accum.a), - ); - accum = std.add(accum, contrib); + const contrib = d.vec4f(lit, 1) * cloudDensity * + (LIGHT_ABSORPTION - accum.a); + accum += contrib; if (accum.a >= LIGHT_ABSORPTION - 0.001) { break; @@ -73,12 +71,13 @@ export const raymarch = tgpu.fn([d.vec3f, d.vec3f, d.vec3f], d.vec4f)( ); const fbm = tgpu.fn([d.vec3f], d.f32)((pos) => { + 'use gpu'; let sum = d.f32(); let amp = d.f32(CLOUD_AMPLITUDE); let freq = d.f32(CLOUD_FREQUENCY); for (let i = 0; i < FBM_OCTAVES; i++) { - sum += noise3d(std.mul(pos, freq)) * amp; + sum += noise3d(pos * freq) * amp; amp *= FBM_PERSISTENCE; freq *= FBM_LACUNARITY; } @@ -86,39 +85,31 @@ const fbm = tgpu.fn([d.vec3f], d.f32)((pos) => { }); const noise3d = tgpu.fn([d.vec3f], d.f32)((pos) => { + 'use gpu'; const idx = std.floor(pos); const frac = std.fract(pos); - const smooth = std.mul(std.mul(frac, frac), std.sub(3.0, std.mul(2.0, frac))); + const smooth = frac * frac * (3 - 2 * frac); const texCoord0 = std.fract( - std.div( - std.add(std.add(idx.xy, frac.xy), std.mul(NOISE_Z_OFFSET, idx.z)), - NOISE_TEXTURE_SIZE, - ), + (idx.xy + frac.xy + NOISE_Z_OFFSET * idx.z) / NOISE_TEXTURE_SIZE, ); const texCoord1 = std.fract( - std.div( - std.add( - std.add(idx.xy, frac.xy), - std.mul(NOISE_Z_OFFSET, std.add(idx.z, 1.0)), - ), - NOISE_TEXTURE_SIZE, - ), + (idx.xy + frac.xy + NOISE_Z_OFFSET * (idx.z + 1)) / NOISE_TEXTURE_SIZE, ); const val0 = std.textureSampleLevel( cloudsLayout.$.noiseTexture, cloudsLayout.$.sampler, texCoord0, - 0.0, + 0, ).x; const val1 = std.textureSampleLevel( cloudsLayout.$.noiseTexture, cloudsLayout.$.sampler, texCoord1, - 0.0, + 0, ).x; - return std.mix(val0, val1, smooth.z) * 2.0 - 1.0; + return std.mix(val0, val1, smooth.z) * 2 - 1; }); diff --git a/apps/typegpu-docs/src/examples/simple/ripple-cube/pbr.ts b/apps/typegpu-docs/src/examples/simple/ripple-cube/pbr.ts index 31867f24b4..75071882e8 100644 --- a/apps/typegpu-docs/src/examples/simple/ripple-cube/pbr.ts +++ b/apps/typegpu-docs/src/examples/simple/ripple-cube/pbr.ts @@ -10,9 +10,7 @@ export const envMapLayout = tgpu.bindGroupLayout({ }); export const materialAccess = tgpu.accessor(Material); -export const lightsAccess = tgpu.accessor( - d.arrayOf(Light, LIGHT_COUNT), -); +export const lightsAccess = tgpu.accessor(d.arrayOf(Light, LIGHT_COUNT)); export const distributionGGX = (ndoth: number, roughness: number): number => { 'use gpu'; @@ -41,12 +39,7 @@ export const geometrySmith = ( export const fresnelSchlick = (cosTheta: number, f0: d.v3f): d.v3f => { 'use gpu'; - return f0.add( - d - .vec3f(1) - .sub(f0) - .mul((1 - cosTheta) ** 5), - ); + return f0 + (1 - f0) * ((1 - cosTheta) ** 5); }; export const evaluateLight = ( @@ -58,11 +51,11 @@ export const evaluateLight = ( f0: d.v3f, ): d.v3f => { 'use gpu'; - const toLight = light.position.sub(p); + const toLight = light.position - p; const dist = std.length(toLight); const l = std.normalize(toLight); - const h = std.normalize(v.add(l)); - const radiance = light.color.div(dist ** 2); + const h = std.normalize(v + l); + const radiance = light.color / (dist ** 2); const ndotl = std.max(std.dot(n, l), 0); const ndoth = std.max(std.dot(n, h), 0); @@ -72,18 +65,10 @@ export const evaluateLight = ( const g = geometrySmith(ndotv, ndotl, material.roughness); const fresnel = fresnelSchlick(ndoth, f0); - const specular = fresnel.mul((ndf * g) / (4 * ndotv * ndotl + 0.001)); - const kd = d - .vec3f(1) - .sub(fresnel) - .mul(1 - material.metallic); - - return kd - .mul(material.albedo) - .div(PI) - .add(specular) - .mul(radiance) - .mul(ndotl); + const specular = fresnel * (ndf * g) / (4 * ndotv * ndotl + 0.001); + const kd = (1 - fresnel) * (1 - material.metallic); + + return (kd * material.albedo / PI + specular) * radiance * ndotl; }; export const shade = (p: d.v3f, n: d.v3f, v: d.v3f): d.v3f => { @@ -93,20 +78,18 @@ export const shade = (p: d.v3f, n: d.v3f, v: d.v3f): d.v3f => { let lo = d.vec3f(0); for (let i = 0; i < LIGHT_COUNT; i++) { - lo = lo.add(evaluateLight(p, n, v, lightsAccess.$[i], material, f0)); + lo += evaluateLight(p, n, v, lightsAccess.$[i], material, f0); } const reflectDir = std.reflect(v, n); - const pScaled = p.mul(50); - const roughOffset = d - .vec3f( - perlin3d.sample(pScaled), - perlin3d.sample(pScaled.add(100)), - perlin3d.sample(pScaled.add(200)), - ) - .mul(material.roughness * 0.3); - const blurredReflectDir = std.normalize(reflectDir.add(roughOffset)); + const pScaled = p * 50; + const roughOffset = d.vec3f( + perlin3d.sample(pScaled), + perlin3d.sample(pScaled + 100), + perlin3d.sample(pScaled + 200), + ) * material.roughness * 0.3; + const blurredReflectDir = std.normalize(reflectDir + roughOffset); const envColor = std.textureSampleLevel( envMapLayout.$.envMap, diff --git a/apps/typegpu-docs/src/examples/simple/ripple-cube/post-processing.ts b/apps/typegpu-docs/src/examples/simple/ripple-cube/post-processing.ts index 6b5432372f..103c6bbf7e 100644 --- a/apps/typegpu-docs/src/examples/simple/ripple-cube/post-processing.ts +++ b/apps/typegpu-docs/src/examples/simple/ripple-cube/post-processing.ts @@ -83,7 +83,7 @@ export function createPostProcessingPipelines( for (let ox = -1; ox <= 1; ox++) { for (let oy = -1; oy <= 1; oy++) { - const sampleCoord = coord.add(d.vec2i(ox, oy)); + const sampleCoord = coord + d.vec2i(ox, oy); const clampedCoord = std.clamp( sampleCoord, d.vec2i(0, 0), @@ -109,45 +109,41 @@ export function createPostProcessingPipelines( ); }); - const copyToHistory = root.createGuardedComputePipeline( - (x, y) => { + const copyToHistory = root.createGuardedComputePipeline((x, y) => { + 'use gpu'; + const color = std.textureLoad( + processLayout.$.inputTexture, + d.vec2i(d.i32(x), d.i32(y)), + 0, + ); + std.textureStore(processLayout.$.outputTexture, d.vec2u(x, y), color); + }); + + const extractBright = root + .with(bloomParamsAccess, bloomUniform) + .createGuardedComputePipeline((x, y) => { 'use gpu'; - const color = std.textureLoad( + const dimensions = std.textureDimensions( + processLayout.$.outputTexture, + ); + const uv = (d.vec2f(x, y) + 0.5) / (d.vec2f(dimensions)); + const color = std.textureSampleLevel( processLayout.$.inputTexture, - d.vec2i(d.i32(x), d.i32(y)), + processLayout.$.sampler, + uv, 0, ); - std.textureStore(processLayout.$.outputTexture, d.vec2u(x, y), color); - }, - ); - - const extractBright = root - .with(bloomParamsAccess, bloomUniform) - .createGuardedComputePipeline( - (x, y) => { - 'use gpu'; - const dimensions = std.textureDimensions( - processLayout.$.outputTexture, - ); - const uv = d.vec2f(x, y).add(0.5).div(d.vec2f(dimensions)); - const color = std.textureSampleLevel( - processLayout.$.inputTexture, - processLayout.$.sampler, - uv, - 0, - ); - const brightness = std.dot(color.rgb, d.vec3f(0.2126, 0.7152, 0.0722)); - const threshold = bloomParamsAccess.$.threshold; - const bright = std.max(brightness - threshold, 0) / - std.max(brightness, 1e-4); - const bloomColor = color.rgb.mul(bright); - std.textureStore( - processLayout.$.outputTexture, - d.vec2u(x, y), - d.vec4f(bloomColor, 1), - ); - }, - ); + const brightness = std.dot(color.rgb, d.vec3f(0.2126, 0.7152, 0.0722)); + const threshold = bloomParamsAccess.$.threshold; + const bright = std.max(brightness - threshold, 0) / + std.max(brightness, 1e-4); + const bloomColor = color.rgb * bright; + std.textureStore( + processLayout.$.outputTexture, + d.vec2u(x, y), + d.vec4f(bloomColor, 1), + ); + }); const blurHorizontal = createBlurPass(root, 'horizontal'); @@ -157,6 +153,7 @@ export function createPostProcessingPipelines( in: { uv: d.vec2f }, out: d.vec4f, })(({ uv }) => { + 'use gpu'; const color = std.textureSample( compositeLayout.$.colorTexture, compositeLayout.$.sampler, @@ -168,13 +165,11 @@ export function createPostProcessingPipelines( uv, ); - let final = color.rgb.add( - bloomColor.rgb.mul(bloomParamsAccess.$.intensity), - ); + let final = color.rgb + bloomColor.rgb * bloomParamsAccess.$.intensity; - const centeredUV = uv.sub(0.5).mul(2); + const centeredUV = (uv - 0.5) * 2; const vignette = 1 - std.dot(centeredUV, centeredUV) * 0.15; - final = final.mul(vignette); + final *= vignette; return d.vec4f(final, 1); }); @@ -256,8 +251,8 @@ function createBlurPass( return root.createGuardedComputePipeline((x, y) => { 'use gpu'; const dimensions = std.textureDimensions(processLayout.$.inputTexture); - const texelSize = d.vec2f(1).div(d.vec2f(dimensions)); - const uv = d.vec2f(x, y).add(0.5).div(d.vec2f(dimensions)); + const texelSize = 1 / d.vec2f(dimensions); + const uv = (d.vec2f(x, y) + 0.5) / d.vec2f(dimensions); const offsetDir = direction === 'horizontal' ? d.vec2f(1, 0) @@ -267,25 +262,21 @@ function createBlurPass( let totalWeight = d.f32(0); for (let i = -BLUR_RADIUS; i <= BLUR_RADIUS; i++) { - const offset = offsetDir.mul(d.f32(i)).mul(texelSize); + const offset = offsetDir * i * texelSize; const weight = std.exp(-d.f32(i * i) / (2 * BLUR_RADIUS)); - result = result.add( - std - .textureSampleLevel( - processLayout.$.inputTexture, - processLayout.$.sampler, - uv.add(offset), - 0, - ) - .rgb.mul(weight), - ); + result += std.textureSampleLevel( + processLayout.$.inputTexture, + processLayout.$.sampler, + uv + offset, + 0, + ).rgb * weight; totalWeight += weight; } std.textureStore( processLayout.$.outputTexture, d.vec2u(x, y), - d.vec4f(result.div(totalWeight), 1), + d.vec4f(result / totalWeight, 1), ); }); } diff --git a/apps/typegpu-docs/src/examples/simple/ripple-cube/sdf-scene.ts b/apps/typegpu-docs/src/examples/simple/ripple-cube/sdf-scene.ts index f102321346..a272cc86a7 100644 --- a/apps/typegpu-docs/src/examples/simple/ripple-cube/sdf-scene.ts +++ b/apps/typegpu-docs/src/examples/simple/ripple-cube/sdf-scene.ts @@ -11,7 +11,7 @@ export const sdfLayout = tgpu.bindGroupLayout({ export const sceneSDF = (p: d.v3f): number => { 'use gpu'; - const uv = std.abs(p).mul(2); + const uv = std.abs(p) * 2; const sdfValue = std.textureSampleLevel( sdfLayout.$.sdfTexture, sdfLayout.$.sdfSampler, @@ -29,9 +29,9 @@ export const getNormal = (p: d.v3f): d.v3f => { const dist = sceneSDF(p); return std.normalize( d.vec3f( - sceneSDF(p.add(d.vec3f(e, 0, 0))) - dist, - sceneSDF(p.add(d.vec3f(0, e, 0))) - dist, - sceneSDF(p.add(d.vec3f(0, 0, e))) - dist, + sceneSDF(p + d.vec3f(e, 0, 0)) - dist, + sceneSDF(p + d.vec3f(0, e, 0)) - dist, + sceneSDF(p + d.vec3f(0, 0, e)) - dist, ), ); }; diff --git a/apps/typegpu-docs/src/examples/simple/stencil/index.ts b/apps/typegpu-docs/src/examples/simple/stencil/index.ts index 69b30b522b..60d1df1083 100644 --- a/apps/typegpu-docs/src/examples/simple/stencil/index.ts +++ b/apps/typegpu-docs/src/examples/simple/stencil/index.ts @@ -34,10 +34,11 @@ const vertexFn = tgpu.vertexFn({ uv: d.vec2f, }, })(({ vid }) => { + 'use gpu'; const pos = triangleData.vertices.$[vid]; const uv = triangleData.uvs.$[vid]; - const rotatedPos = rotationUniform.$.mul(pos); + const rotatedPos = rotationUniform.$ * pos; return { position: d.vec4f(rotatedPos, 0, 1), diff --git a/apps/typegpu-docs/src/examples/simple/vaporrave/floor.ts b/apps/typegpu-docs/src/examples/simple/vaporrave/floor.ts index 88b11845e2..3c013b8ee7 100644 --- a/apps/typegpu-docs/src/examples/simple/vaporrave/floor.ts +++ b/apps/typegpu-docs/src/examples/simple/vaporrave/floor.ts @@ -3,6 +3,7 @@ import tgpu, { d, std } from 'typegpu'; import * as c from './constants.ts'; export const grid = tgpu.fn([d.vec2f, d.f32], d.vec3f)((uv, time) => { + 'use gpu'; // time is really an angle, but we are fine as long as it keeps increasing const uvNormalized = std.fract( d.vec2f(uv.x, uv.y + time).div(c.GRID_SEP), @@ -10,10 +11,10 @@ export const grid = tgpu.fn([d.vec2f, d.f32], d.vec3f)((uv, time) => { // x^4 + y^4 = 0.5^4 const diff4 = std.pow( - d.vec2f(0.5, 0.5).sub(uvNormalized), + d.vec2f(0.5, 0.5) - uvNormalized, d.vec2f(4, 4), ); - const sdf = std.pow(diff4.x + diff4.y, 0.25) - 0.5; // -radius + const sdf = ((diff4.x + diff4.y) ** 0.25) - 0.5; // -radius return std.mix( c.gridInnerColor, @@ -34,15 +35,16 @@ const rotateXY = tgpu.fn([d.f32], d.mat2x2f)((angle) => ); export const circles = tgpu.fn([d.vec2f, d.f32], d.vec3f)((uv, angle) => { - const uvRotated = rotateXY(angle).mul(d.vec2f(uv.x, uv.y - c.sphereCenter.z)); + 'use gpu'; + const uvRotated = rotateXY(angle) * d.vec2f(uv.x, uv.y - c.sphereCenter.z); const uvNormalized = std.fract( - d.vec2f(uvRotated.x, uvRotated.y).div(c.GRID_SEP), + d.vec2f(uvRotated.x, uvRotated.y) / c.GRID_SEP, ); // working with circle centered at (0.5, 0.5) - const diff2 = std.pow(d.vec2f(0.5, 0.5).sub(uvNormalized), d.vec2f(2)); - const distO = std.pow(diff2.x + diff2.y, 0.5); + const diff2 = std.pow(d.vec2f(0.5, 0.5) - uvNormalized, d.vec2f(2)); + const distO = (diff2.x + diff2.y) ** 0.5; return std.mix( c.gridInnerColor, diff --git a/apps/typegpu-docs/src/examples/simple/vaporrave/index.ts b/apps/typegpu-docs/src/examples/simple/vaporrave/index.ts index 08968bf197..cde920b7a2 100644 --- a/apps/typegpu-docs/src/examples/simple/vaporrave/index.ts +++ b/apps/typegpu-docs/src/examples/simple/vaporrave/index.ts @@ -47,10 +47,8 @@ const getSceneRay = tgpu.fn([d.vec3f], Ray)((p) => { return rayUnion(floor, sphere); }); -const rayMarch = tgpu.fn( - [d.vec3f, d.vec3f], - LightRay, -)((ro, rd) => { +const rayMarch = (ro: d.v3f, rd: d.v3f) => { + 'use gpu'; let distOrigin = d.f32(); const result = Ray({ dist: d.f32(c.MAX_DIST), @@ -60,7 +58,7 @@ const rayMarch = tgpu.fn( let glow = d.vec3f(); for (let i = 0; i < c.MAX_STEPS; i++) { - const p = rd.mul(distOrigin).add(ro); + const p = rd * distOrigin + ro; const scene = getSceneRay(p); const sphereDist = getSphere( p, @@ -69,9 +67,7 @@ const rayMarch = tgpu.fn( sphereAngleUniform.$, ); - glow = d.vec3f(sphereColorUniform.$) - .mul(std.exp(-sphereDist.dist)) - .add(glow); + glow += d.vec3f(sphereColorUniform.$) * std.exp(-sphereDist.dist); distOrigin += scene.dist; @@ -87,8 +83,8 @@ const rayMarch = tgpu.fn( } } - return { ray: result, glow }; -}); + return LightRay({ ray: result, glow }); +}; const vertexMain = tgpu.vertexFn({ in: { idx: d.builtin.vertexIndex }, @@ -107,7 +103,8 @@ const fragmentMain = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })((input) => { - const uv = input.uv.mul(2).sub(1); + 'use gpu'; + const uv = input.uv * 2 - 1; uv.x *= resolutionUniform.$.x / resolutionUniform.$.y; // ray origin and direction @@ -118,7 +115,7 @@ const fragmentMain = tgpu.fragmentFn({ const march = rayMarch(ro, rd); // sky gradient - const y = rd.mul(march.ray.dist).add(ro).y - 2; // camera at level 2 + const y = rd.y * march.ray.dist + ro.y - 2; // camera at level 2 const sky = std.mix(c.skyColor1, c.skyColor2, y / c.MAX_DIST); // fog coefficient diff --git a/apps/typegpu-docs/src/examples/simple/vaporrave/sphere.ts b/apps/typegpu-docs/src/examples/simple/vaporrave/sphere.ts index 2689c336f7..c827405ba3 100644 --- a/apps/typegpu-docs/src/examples/simple/vaporrave/sphere.ts +++ b/apps/typegpu-docs/src/examples/simple/vaporrave/sphere.ts @@ -33,10 +33,11 @@ export const getSphere = tgpu.fn( [d.vec3f, d.vec3f, d.vec3f, d.f32], Ray, )((p, sphereColor, sphereCenter, angle) => { - const localP = p.sub(sphereCenter); // (0,0) is the center to rotate easily + 'use gpu'; + const localP = p - sphereCenter; // (0,0) is the center to rotate easily const rotMatZ = rotateAroundZ(-angle * 0.3); const rotMatX = rotateAroundX(-angle * 0.7); - const rotatedP = localP.mul(rotMatZ).mul(rotMatX); + const rotatedP = localP * rotMatZ * rotMatX; // breathing effect const radius = d.f32(c.SPHERE_RADIUS) + std.sin(angle); @@ -44,7 +45,7 @@ export const getSphere = tgpu.fn( const rawDist = sdSphere(rotatedP, radius); let noise = d.f32(0); if (rawDist < d.f32(1)) { - noise += perlin3d.sample(rotatedP.add(angle)); + noise += perlin3d.sample(rotatedP + angle); } return { diff --git a/apps/typegpu-docs/src/examples/simulation/boids/index.ts b/apps/typegpu-docs/src/examples/simulation/boids/index.ts index bf30b50c43..5650bfa643 100644 --- a/apps/typegpu-docs/src/examples/simulation/boids/index.ts +++ b/apps/typegpu-docs/src/examples/simulation/boids/index.ts @@ -94,12 +94,13 @@ const mainVert = tgpu.vertexFn({ in: { v: d.vec2f, center: d.vec2f, velocity: d.vec2f }, out: VertexOutput, })((input) => { + 'use gpu'; const angle = getRotationFromVelocity(input.velocity); const rotated = rotate(input.v, angle); - const pos = d.vec4f(rotated.add(input.center), 0, 1); + const pos = d.vec4f(rotated + input.center, 0, 1); const color = d.vec4f( - std.sin(colorPalette.$.add(angle)).mul(0.45).add(0.45), + std.sin(colorPalette.$ + angle) * 0.45 + 0.45, 1, ); @@ -171,7 +172,7 @@ const layout = tgpu.bindGroupLayout({ const simulate = (index: number) => { 'use gpu'; - const instanceInfo = TriangleData(layout.$.currentTrianglePos[index]); + const self = TriangleData(layout.$.currentTrianglePos[index]); let separation = d.vec2f(); let alignment = d.vec2f(); let cohesion = d.vec2f(); @@ -179,62 +180,42 @@ const simulate = (index: number) => { let cohesionCount = 0; for (const other of layout.$.currentTrianglePos) { - const dist = std.distance(instanceInfo.position, other.position); + const dist = std.distance(self.position, other.position); if (dist < params.$.separationDistance) { - separation = std.add( - separation, - std.sub(instanceInfo.position, other.position), - ); + separation += self.position - other.position; } if (dist < params.$.alignmentDistance) { - alignment = std.add(alignment, other.velocity); + alignment += other.velocity; alignmentCount++; } if (dist < params.$.cohesionDistance) { - cohesion = std.add(cohesion, other.position); + cohesion += other.position; cohesionCount++; } } if (alignmentCount > 0) { - alignment = std.mul(1.0 / d.f32(alignmentCount), alignment); + alignment /= d.f32(alignmentCount); } if (cohesionCount > 0) { - cohesion = std.mul(1.0 / d.f32(cohesionCount), cohesion); - cohesion = std.sub(cohesion, instanceInfo.position); + cohesion /= d.f32(cohesionCount); + cohesion -= self.position; } - let velocity = std.mul(params.$.separationStrength, separation); - velocity = std.add( - velocity, - std.mul(params.$.alignmentStrength, alignment), - ); - velocity = std.add( - velocity, - std.mul(params.$.cohesionStrength, cohesion), - ); + const velocity = params.$.separationStrength * separation + + params.$.alignmentStrength * alignment + + params.$.cohesionStrength * cohesion; - instanceInfo.velocity = std.add(instanceInfo.velocity, velocity); - instanceInfo.velocity = std.mul( - std.clamp(std.length(instanceInfo.velocity), 0, 0.01), - std.normalize(instanceInfo.velocity), - ); + self.velocity += velocity; + self.velocity = std.clamp(std.length(self.velocity), 0, 0.01) * + std.normalize(self.velocity); - if (instanceInfo.position.x > 1.0 + triangleSize) { - instanceInfo.position.x = -1.0 - triangleSize; - } - if (instanceInfo.position.y > 1.0 + triangleSize) { - instanceInfo.position.y = -1.0 - triangleSize; - } - if (instanceInfo.position.x < -1.0 - triangleSize) { - instanceInfo.position.x = 1.0 + triangleSize; - } - if (instanceInfo.position.y < -1.0 - triangleSize) { - instanceInfo.position.y = 1.0 + triangleSize; - } + self.position += self.velocity; - instanceInfo.position = std.add(instanceInfo.position, instanceInfo.velocity); + // Wrap the domain + const domain = (1 + triangleSize) * 2; + self.position = (std.fract(self.position / domain + 0.5) - 0.5) * domain; - layout.$.nextTrianglePos[index] = TriangleData(instanceInfo); + layout.$.nextTrianglePos[index] = TriangleData(self); }; const simulatePipeline = root.createGuardedComputePipeline(simulate); diff --git a/apps/typegpu-docs/src/examples/simulation/gravity/compute.ts b/apps/typegpu-docs/src/examples/simulation/gravity/compute.ts index 705651f389..fc625d44fc 100644 --- a/apps/typegpu-docs/src/examples/simulation/gravity/compute.ts +++ b/apps/typegpu-docs/src/examples/simulation/gravity/compute.ts @@ -25,6 +25,7 @@ export const computeCollisionsShader = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [1], })((input) => { + 'use gpu'; const currentId = input.gid.x; const current = CelestialBody(computeLayout.$.inState[currentId]); @@ -55,21 +56,19 @@ export const computeCollisionsShader = tgpu.computeFn({ // bounce occurs // push the smaller object outside if (isSmaller(currentId, otherId)) { - const dir = std.normalize(current.position.sub(other.position)); - current.position = other.position.add( - dir.mul(radiusOf(current) + radiusOf(other)), - ); + const dir = std.normalize(current.position - other.position); + current.position = other.position + + (dir * (radiusOf(current) + radiusOf(other))); } // bounce with tiny damping - const posDiff = current.position.sub(other.position); - const velDiff = current.velocity.sub(other.velocity); + const posDiff = current.position - other.position; + const velDiff = current.velocity - other.velocity; const posDiffFactor = (((2 * other.mass) / (current.mass + other.mass)) * std.dot(velDiff, posDiff)) / std.dot(posDiff, posDiff); - current.velocity = current.velocity - .sub(posDiff.mul(posDiffFactor)).mul(0.99); + current.velocity = (current.velocity - posDiff * posDiffFactor) * 0.99; } else { // merge occurs const isCurrentAbsorbed = current.collisionBehavior === bounce || @@ -82,10 +81,8 @@ export const computeCollisionsShader = tgpu.computeFn({ // absorbs the other const m1 = current.mass; const m2 = other.mass; - current.velocity = std.add( - current.velocity.mul(m1 / (m1 + m2)), - other.velocity.mul(m2 / (m1 + m2)), - ); + current.velocity = current.velocity * (m1 / (m1 + m2)) + + other.velocity * (m2 / (m1 + m2)); current.mass = m1 + m2; } } @@ -99,6 +96,7 @@ export const computeGravityShader = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [1], })((input) => { + 'use gpu'; const dt = timeAccess.$.passed * timeAccess.$.multiplier; const currentId = input.gid.x; const current = CelestialBody(computeLayout.$.inState[currentId]); @@ -121,13 +119,11 @@ export const computeGravityShader = tgpu.computeFn({ ); const gravityForce = (current.mass * other.mass) / dist / dist; - const direction = std.normalize(other.position.sub(current.position)); - current.velocity = current.velocity.add( - direction.mul((gravityForce / current.mass) * dt), - ); + const direction = std.normalize(other.position - current.position); + current.velocity += direction * (gravityForce / current.mass) * dt; } - current.position = current.position.add(current.velocity.mul(dt)); + current.position += current.velocity * dt; } computeLayout.$.outState[currentId] = CelestialBody(current); diff --git a/apps/typegpu-docs/src/examples/simulation/gravity/render.ts b/apps/typegpu-docs/src/examples/simulation/gravity/render.ts index 716419d2c4..d3c677435e 100644 --- a/apps/typegpu-docs/src/examples/simulation/gravity/render.ts +++ b/apps/typegpu-docs/src/examples/simulation/gravity/render.ts @@ -20,13 +20,11 @@ export const skyBoxVertex = tgpu.vertexFn({ texCoord: d.vec3f, }, })((input) => { - const viewPos = std.mul(cameraAccess.$.view, d.vec4f(input.position, 0)).xyz; + 'use gpu'; + const viewPos = (cameraAccess.$.view * d.vec4f(input.position, 0)).xyz; return { - pos: std.mul( - cameraAccess.$.projection, - d.vec4f(viewPos, 1), - ), + pos: cameraAccess.$.projection * d.vec4f(viewPos, 1), texCoord: input.position.xyz, }; }); @@ -51,16 +49,15 @@ export const mainVertex = tgpu.vertexFn({ }, out: VertexOutput, })((input) => { + 'use gpu'; const currentBody = renderLayout.$.celestialBodies[input.instanceIndex]; - const worldPosition = currentBody.position.add( - input.position.xyz.mul(radiusOf(currentBody)), - ); + const worldPosition = currentBody.position + + input.position.xyz * radiusOf(currentBody); const camera = cameraAccess.$; - const positionOnCanvas = camera.projection - .mul(camera.view) - .mul(d.vec4f(worldPosition, 1)); + const positionOnCanvas = camera.projection * camera.view * + d.vec4f(worldPosition, 1); return { position: positionOnCanvas, @@ -77,6 +74,7 @@ export const mainFragment = tgpu.fragmentFn({ in: VertexOutput, out: d.vec4f, })((input) => { + 'use gpu'; if (input.destroyed === 1) { std.discard(); } @@ -89,16 +87,14 @@ export const mainFragment = tgpu.fragmentFn({ input.sphereTextureIndex, ).rgb; - const ambient = textureColor.mul(lightColor).mul(input.ambientLightFactor); + const ambient = textureColor * lightColor * input.ambientLightFactor; const normal = input.normals; const lightDirection = std.normalize( - lightSourceAccess.$.sub(input.worldPosition), + lightSourceAccess.$ - input.worldPosition, ); const cosTheta = std.dot(normal, lightDirection); - const diffuse = textureColor.mul(lightColor).mul(std.max(0, cosTheta)); - - const litColor = ambient.add(diffuse); + const diffuse = textureColor * lightColor * std.max(0, cosTheta); - return d.vec4f(litColor, 1); + return d.vec4f(ambient + diffuse, 1); }); diff --git a/apps/typegpu-docs/src/examples/simulation/slime-mold-3d/index.ts b/apps/typegpu-docs/src/examples/simulation/slime-mold-3d/index.ts index 1c08a09028..7eb7dbf63a 100644 --- a/apps/typegpu-docs/src/examples/simulation/slime-mold-3d/index.ts +++ b/apps/typegpu-docs/src/examples/simulation/slime-mold-3d/index.ts @@ -101,9 +101,9 @@ const mutableAgentsDataBuffers = agentsDataBuffers.map((b) => b.as('mutable')); root.createGuardedComputePipeline((x) => { 'use gpu'; randf.seed(x / NUM_AGENTS); - const pos = randf.inUnitSphere().mul(resolution.x / 4).add(resolution.div(2)); - const center = resolution.div(2); - const dir = std.normalize(center.sub(pos)); + const pos = randf.inUnitSphere() * (resolution.x / 4) + (resolution / 2); + const center = resolution / 2; + const dir = std.normalize(center - pos); mutableAgentsDataBuffers[0].$[x] = Agent({ position: pos, direction: dir }); mutableAgentsDataBuffers[1].$[x] = Agent({ position: pos, direction: dir }); }).dispatchThreads(NUM_AGENTS); @@ -191,19 +191,19 @@ const sense3D = (pos: d.v3f, direction: d.v3f) => { for (let i = 0; i < numSamples; i++) { const theta = (i / numSamples) * 2 * Math.PI; - const coneOffset = perp1.mul(std.cos(theta)).add(perp2.mul(std.sin(theta))); + const coneOffset = perp1 * std.cos(theta) + perp2 * std.sin(theta); const sensorDir = std.normalize( - direction.add(coneOffset.mul(std.sin(params.$.sensorAngle))), + direction + coneOffset * std.sin(params.$.sensorAngle), ); - const sensorPos = pos.add(sensorDir.mul(params.$.sensorDistance)); + const sensorPos = pos + sensorDir * params.$.sensorDistance; const sensorPosInt = d.vec3u( - std.clamp(sensorPos, d.vec3f(), dimsf.sub(d.vec3f(1))), + std.clamp(sensorPos, d.vec3f(), dimsf - 1), ); const weight = std.textureLoad(computeLayout.$.oldState, sensorPosInt).x; - weightedDir = weightedDir.add(sensorDir.mul(weight)); + weightedDir = weightedDir + sensorDir * weight; totalWeight = totalWeight + weight; } @@ -214,6 +214,7 @@ const updateAgents = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [AGENT_WORKGROUP_SIZE], })(({ gid }) => { + 'use gpu'; if (gid.x >= NUM_AGENTS) { return; } @@ -232,15 +233,14 @@ const updateAgents = tgpu.computeFn({ std.normalize(senseResult.weightedDir), senseResult.totalWeight > 0.01, ); - direction = std.normalize(direction.add( - targetDirection.mul(params.$.turnSpeed * params.$.deltaTime), - )); - - const newPos = agent.position.add( - direction.mul(params.$.moveSpeed * params.$.deltaTime), + direction = std.normalize( + direction + (targetDirection * params.$.turnSpeed * params.$.deltaTime), ); - const center = dimsf.div(2); + const newPos = agent.position + + (direction * params.$.moveSpeed * params.$.deltaTime); + + const center = dimsf / 2; if (newPos.x < 0 || newPos.x >= dimsf.x) { newPos.x = std.clamp(newPos.x, 0, dimsf.x - 1); @@ -249,12 +249,10 @@ const updateAgents = tgpu.computeFn({ normal = d.vec3f(-1, 0, 0); } const randomDir = randf.inHemisphere(normal); - const toCenter = std.normalize(center.sub(newPos)); + const toCenter = std.normalize(center - newPos); direction = std.normalize( - randomDir.mul(RANDOM_DIRECTION_WEIGHT).add( - toCenter.mul(CENTER_BIAS_WEIGHT), - ), + randomDir * RANDOM_DIRECTION_WEIGHT + toCenter * CENTER_BIAS_WEIGHT, ); } if (newPos.y < 0 || newPos.y >= dimsf.y) { @@ -264,11 +262,9 @@ const updateAgents = tgpu.computeFn({ normal = d.vec3f(0, -1, 0); } const randomDir = randf.inHemisphere(normal); - const toCenter = std.normalize(center.sub(newPos)); + const toCenter = std.normalize(center - newPos); direction = std.normalize( - randomDir.mul(RANDOM_DIRECTION_WEIGHT).add( - toCenter.mul(CENTER_BIAS_WEIGHT), - ), + randomDir * RANDOM_DIRECTION_WEIGHT + toCenter * CENTER_BIAS_WEIGHT, ); } if (newPos.z < 0 || newPos.z >= dimsf.z) { @@ -278,11 +274,9 @@ const updateAgents = tgpu.computeFn({ normal = d.vec3f(0, 0, -1); } const randomDir = randf.inHemisphere(normal); - const toCenter = std.normalize(center.sub(newPos)); + const toCenter = std.normalize(center - newPos); direction = std.normalize( - randomDir.mul(RANDOM_DIRECTION_WEIGHT).add( - toCenter.mul(CENTER_BIAS_WEIGHT), - ), + randomDir * RANDOM_DIRECTION_WEIGHT + toCenter * CENTER_BIAS_WEIGHT, ); } @@ -318,27 +312,24 @@ const blur = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: BLUR_WORKGROUP_SIZE, })(({ gid }) => { + 'use gpu'; const dims = d.vec3u(std.textureDimensions(blurLayout.$.oldState)); if (gid.x >= dims.x || gid.y >= dims.y || gid.z >= dims.z) return; - const uv = d.vec3f(gid).add(0.5).div(d.vec3f(dims)); + const uv = (d.vec3f(gid) + 0.5) / d.vec3f(dims); let sum = d.f32(); - sum += getSummand(uv, d.vec3f(-1, 0, 0).div(d.vec3f(dims))); - sum += getSummand(uv, d.vec3f(1, 0, 0).div(d.vec3f(dims))); - sum += getSummand(uv, d.vec3f(0, -1, 0).div(d.vec3f(dims))); - sum += getSummand(uv, d.vec3f(0, 1, 0).div(d.vec3f(dims))); - sum += getSummand(uv, d.vec3f(0, 0, -1).div(d.vec3f(dims))); - sum += getSummand(uv, d.vec3f(0, 0, 1).div(d.vec3f(dims))); + sum += getSummand(uv, d.vec3f(-1, 0, 0) / d.vec3f(dims)); + sum += getSummand(uv, d.vec3f(1, 0, 0) / d.vec3f(dims)); + sum += getSummand(uv, d.vec3f(0, -1, 0) / d.vec3f(dims)); + sum += getSummand(uv, d.vec3f(0, 1, 0) / d.vec3f(dims)); + sum += getSummand(uv, d.vec3f(0, 0, -1) / d.vec3f(dims)); + sum += getSummand(uv, d.vec3f(0, 0, 1) / d.vec3f(dims)); - const blurred = sum / 6.0; + const blurred = sum / 6; const newValue = std.saturate(blurred - params.$.evaporationRate); - std.textureStore( - blurLayout.$.newState, - gid.xyz, - d.vec4f(newValue, 0, 0, 1), - ); + std.textureStore(blurLayout.$.newState, gid.xyz, d.vec4f(newValue, 0, 0, 1)); }); // Ray-box intersection @@ -349,9 +340,9 @@ const rayBoxIntersection = ( boxMax: d.v3f, ) => { 'use gpu'; - const invDir = d.vec3f(1).div(rayDir); - const t0 = boxMin.sub(rayOrigin).mul(invDir); - const t1 = boxMax.sub(rayOrigin).mul(invDir); + const invDir = 1 / rayDir; + const t0 = (boxMin - rayOrigin) * invDir; + const t1 = (boxMax - rayOrigin) * invDir; const tmin = std.min(t0, t1); const tmax = std.max(t0, t1); const tNear = std.max(tmin.x, tmin.y, tmin.z); @@ -364,17 +355,18 @@ const fragmentShader = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })(({ uv }) => { + 'use gpu'; randf.seed2(uv); const ndc = d.vec2f(uv.x * 2 - 1, 1 - uv.y * 2); const ndcNear = d.vec4f(ndc, -1, 1); const ndcFar = d.vec4f(ndc, 1, 1); - const worldNear = cameraData.$.invViewProj.mul(ndcNear); - const worldFar = cameraData.$.invViewProj.mul(ndcFar); + const worldNear = cameraData.$.invViewProj * ndcNear; + const worldFar = cameraData.$.invViewProj * ndcFar; - const rayOrigin = worldNear.xyz.div(worldNear.w); - const rayEnd = worldFar.xyz.div(worldFar.w); - const rayDir = std.normalize(rayEnd.sub(rayOrigin)); + const rayOrigin = worldNear.xyz / worldNear.w; + const rayEnd = worldFar.xyz / worldFar.w; + const rayDir = std.normalize(rayEnd - rayOrigin); const boxMin = d.vec3f(); const boxMax = resolution; @@ -416,21 +408,21 @@ const fragmentShader = tgpu.fragmentFn({ let i = d.i32(0); while (i < numSteps && transmittance > TMin) { const t = tStart + (d.f32(i) + 0.5) * stepSize; - const pos = rayOrigin.add(rayDir.mul(t)); - const texCoord = pos.div(resolution); + const pos = rayOrigin + rayDir * t; + const texCoord = pos / resolution; const sampleValue = std .textureSampleLevel(renderLayout.$.state, sampler.$, texCoord, 0) .x; const d0 = std.smoothstep(thresholdLo, thresholdHi, sampleValue); - const density = std.pow(d0, gamma); + const density = d0 ** gamma; const alphaSrc = 1 - std.exp(-sigmaT * density * stepSize); - const contrib = albedo.mul(alphaSrc); + const contrib = albedo * alphaSrc; - accum = accum.add(contrib.mul(transmittance)); + accum += contrib * transmittance; transmittance = transmittance * (1 - alphaSrc); i += 1; diff --git a/apps/typegpu-docs/src/examples/simulation/slime-mold/index.ts b/apps/typegpu-docs/src/examples/simulation/slime-mold/index.ts index fda0e7c29e..e2de5cc646 100644 --- a/apps/typegpu-docs/src/examples/simulation/slime-mold/index.ts +++ b/apps/typegpu-docs/src/examples/simulation/slime-mold/index.ts @@ -35,9 +35,7 @@ const agentsData = root.createMutable(d.arrayOf(Agent, NUM_AGENTS)); root.createGuardedComputePipeline((x) => { 'use gpu'; randf.seed(x / NUM_AGENTS + 0.1); - const pos = randf.inUnitCircle().mul(resolution.x / 2 - 10).add( - resolution.div(2), - ); + const pos = randf.inUnitCircle() * (resolution.x / 2 - 10) + (resolution / 2); const angle = std.atan2( resolution.y / 2 - pos.y, resolution.x / 2 - pos.x, @@ -73,13 +71,11 @@ const sense = (pos: d.v2f, angle: number, sensorAngleOffset: number) => { 'use gpu'; const sensorAngle = angle + sensorAngleOffset; const sensorDir = d.vec2f(std.cos(sensorAngle), std.sin(sensorAngle)); - const sensorPos = pos.add(sensorDir.mul(params.$.sensorDistance)); + const sensorPos = pos + sensorDir * params.$.sensorDistance; const dims = std.textureDimensions(computeLayout.$.oldState); const dimsf = d.vec2f(dims); - const sensorPosInt = d.vec2u( - std.clamp(sensorPos, d.vec2f(0), dimsf.sub(d.vec2f(1))), - ); + const sensorPosInt = d.vec2u(std.clamp(sensorPos, d.vec2f(0), dimsf - 1)); const color = std.textureLoad(computeLayout.$.oldState, sensorPosInt).rgb; return color.x + color.y + color.z; @@ -89,6 +85,7 @@ const updateAgents = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [64], })(({ gid }) => { + 'use gpu'; if (gid.x >= NUM_AGENTS) return; randf.seed(gid.x / NUM_AGENTS + 0.1); @@ -122,15 +119,13 @@ const updateAgents = tgpu.computeFn({ } const dir = d.vec2f(std.cos(angle), std.sin(angle)); - let newPos = agent.position.add( - dir.mul(params.$.moveSpeed * deltaTime.$), - ); + let newPos = agent.position + dir * params.$.moveSpeed * deltaTime.$; const dimsf = d.vec2f(dims); if ( newPos.x < 0 || newPos.x > dimsf.x || newPos.y < 0 || newPos.y > dimsf.y ) { - newPos = std.clamp(newPos, d.vec2f(0), dimsf.sub(d.vec2f(1))); + newPos = std.clamp(newPos, d.vec2f(0), dimsf - 1); if (newPos.x <= 0 || newPos.x >= dimsf.x - 1) { angle = Math.PI - angle; @@ -149,7 +144,7 @@ const updateAgents = tgpu.computeFn({ const oldState = std.textureLoad(computeLayout.$.oldState, d.vec2u(newPos)).rgb; - const newState = oldState.add(d.vec3f(1)); + const newState = oldState + 1; std.textureStore( computeLayout.$.newState, d.vec2u(newPos), @@ -161,6 +156,7 @@ const blur = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, workgroupSize: [16, 16], })(({ gid }) => { + 'use gpu'; const dims = std.textureDimensions(computeLayout.$.oldState); if (gid.x >= dims.x || gid.y >= dims.y) return; @@ -170,7 +166,7 @@ const blur = tgpu.computeFn({ // 3x3 blur kernel for (let offsetY = -1; offsetY <= 1; offsetY++) { for (let offsetX = -1; offsetX <= 1; offsetX++) { - const samplePos = d.vec2i(gid.xy).add(d.vec2i(offsetX, offsetY)); + const samplePos = d.vec2i(gid.xy) + d.vec2i(offsetX, offsetY); const dimsi = d.vec2i(dims); if ( @@ -179,18 +175,14 @@ const blur = tgpu.computeFn({ ) { const color = std.textureLoad(computeLayout.$.oldState, d.vec2u(samplePos)).rgb; - sum = sum.add(color); - count = count + 1; + sum += color; + count += 1; } } } - const blurred = sum.div(count); - const newColor = std.clamp( - blurred.sub(params.$.evaporationRate), - d.vec3f(0), - d.vec3f(1), - ); + const blurred = sum / count; + const newColor = std.saturate(blurred - params.$.evaporationRate); std.textureStore( computeLayout.$.newState, gid.xy, diff --git a/apps/typegpu-docs/src/examples/simulation/stable-fluid/render.ts b/apps/typegpu-docs/src/examples/simulation/stable-fluid/render.ts index c1de903bbd..fb65412213 100644 --- a/apps/typegpu-docs/src/examples/simulation/stable-fluid/render.ts +++ b/apps/typegpu-docs/src/examples/simulation/stable-fluid/render.ts @@ -52,6 +52,7 @@ export const fragmentImageFn = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })((input) => { + 'use gpu'; const pixelStep = d.f32(1) / SIM_N; const leftSample = std.textureSample( @@ -80,10 +81,8 @@ export const fragmentImageFn = tgpu.fragmentFn({ const distortStrength = 0.8; const distortVector = d.vec2f(gradientX, gradientY); - const distortedUV = std.add( - input.uv, - std.mul(distortVector, d.vec2f(distortStrength, -distortStrength)), - ); + const distortedUV = input.uv + + distortVector * d.vec2f(distortStrength, -distortStrength); const outputColor = std.textureSample( renderLayout.$.background, diff --git a/apps/typegpu-docs/src/examples/simulation/stable-fluid/simulation.ts b/apps/typegpu-docs/src/examples/simulation/stable-fluid/simulation.ts index 21bb70bdbf..5623445b8c 100644 --- a/apps/typegpu-docs/src/examples/simulation/stable-fluid/simulation.ts +++ b/apps/typegpu-docs/src/examples/simulation/stable-fluid/simulation.ts @@ -1,24 +1,23 @@ import tgpu, { d, std } from 'typegpu'; import * as p from './params.ts'; -const getNeighbors = tgpu.fn([d.vec2i, d.vec2i], d.arrayOf(d.vec2i, 4))( - (coords, bounds) => { - const adjacentOffsets = [ - d.vec2i(-1, 0), - d.vec2i(0, -1), - d.vec2i(1, 0), - d.vec2i(0, 1), - ]; - for (let i = 0; i < 4; i++) { - adjacentOffsets[i] = std.clamp( - std.add(coords, adjacentOffsets[i]), - d.vec2i(), - std.sub(bounds, d.vec2i(1)), - ); - } - return adjacentOffsets; - }, -); +const getNeighbors = (coords: d.v2i, bounds: d.v2i): d.v2i[] => { + 'use gpu'; + const adjacentOffsets = [ + d.vec2i(-1, 0), + d.vec2i(0, -1), + d.vec2i(1, 0), + d.vec2i(0, 1), + ]; + for (let i = 0; i < 4; i++) { + adjacentOffsets[i] = std.clamp( + coords + adjacentOffsets[i], + d.vec2i(), + bounds - d.vec2i(1), + ); + } + return adjacentOffsets; +}; export const brushLayout = tgpu.bindGroupLayout({ brushParams: { uniform: p.BrushParams }, @@ -30,6 +29,7 @@ export const brushFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const pixelPos = input.gid.xy; const brushSettings = brushLayout.$.brushParams; @@ -43,10 +43,7 @@ export const brushFn = tgpu.computeFn({ if (distSquared < radiusSquared) { const brushWeight = std.exp(-distSquared / radiusSquared); - forceVec = std.mul( - brushSettings.forceScale * brushWeight, - brushSettings.delta, - ); + forceVec = brushSettings.forceScale * brushWeight * brushSettings.delta; inkAmount = brushSettings.inkAmount * brushWeight; } @@ -73,11 +70,12 @@ export const addForcesFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const pixelPos = input.gid.xy; const currentVel = std.textureLoad(addForcesLayout.$.src, pixelPos, 0).xy; const forceVec = std.textureLoad(addForcesLayout.$.force, pixelPos, 0).xy; const timeStep = addForcesLayout.$.simParams.dt; - const newVel = std.add(currentVel, std.mul(timeStep, forceVec)); + const newVel = currentVel + timeStep * forceVec; std.textureStore(addForcesLayout.$.dst, pixelPos, d.vec4f(newVel, 0, 1)); }); @@ -92,6 +90,7 @@ export const advectFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const texSize = std.textureDimensions(advectLayout.$.src); const pixelPos = input.gid.xy; @@ -105,16 +104,13 @@ export const advectFn = tgpu.computeFn({ const velocity = std.textureLoad(advectLayout.$.src, pixelPos, 0); const timeStep = advectLayout.$.simParams.dt; - const prevPos = std.sub(d.vec2f(pixelPos), std.mul(timeStep, velocity.xy)); + const prevPos = d.vec2f(pixelPos) - timeStep * velocity.xy; const clampedPos = std.clamp( prevPos, d.vec2f(-0.5), - d.vec2f(texSize.xy).sub(0.5), - ); - const normalizedPos = std.div( - clampedPos.add(0.5), - d.vec2f(texSize.xy), + d.vec2f(texSize.xy) - 0.5, ); + const normalizedPos = (clampedPos + 0.5) / d.vec2f(texSize.xy); const prevVelocity = std.textureSampleLevel( advectLayout.$.src, @@ -136,6 +132,7 @@ export const diffusionFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const pixelPos = d.vec2i(input.gid.xy); const texSize = d.vec2i( std.textureDimensions(diffusionLayout.$.in), @@ -153,14 +150,9 @@ export const diffusionFn = tgpu.computeFn({ const viscosity = diffusionLayout.$.simParams.viscosity; const diffuseRate = viscosity * timeStep; - const blendFactor = 1.0 / (4.0 + diffuseRate); - const diffusedVal = std.mul( - d.vec4f(blendFactor), - std.add( - std.add(std.add(leftVal, rightVal), std.add(upVal, downVal)), - std.mul(d.f32(diffuseRate), centerVal), - ), - ); + const blendFactor = 1 / (4 + diffuseRate); + const diffusedVal = d.vec4f(blendFactor) * + (leftVal + rightVal + upVal + downVal + centerVal * diffuseRate); std.textureStore(diffusionLayout.$.out, pixelPos, diffusedVal); }); @@ -175,9 +167,7 @@ export const divergenceFn = tgpu.computeFn({ in: { gid: d.builtin.globalInvocationId }, })((input) => { const pixelPos = d.vec2i(input.gid.xy); - const texSize = d.vec2i( - std.textureDimensions(divergenceLayout.$.vel), - ); + const texSize = d.vec2i(std.textureDimensions(divergenceLayout.$.vel)); const neighbors = getNeighbors(pixelPos, texSize); @@ -236,6 +226,7 @@ export const projectFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const pixelPos = d.vec2i(input.gid.xy); const texSize = d.vec2i(std.textureDimensions(projectLayout.$.vel)); const velocity = std.textureLoad(projectLayout.$.vel, pixelPos, 0); @@ -251,7 +242,7 @@ export const projectFn = tgpu.computeFn({ 0.5 * (rightPressure.x - leftPressure.x), 0.5 * (downPressure.x - upPressure.x), ); - const projectedVel = std.sub(velocity.xy, pressureGrad); + const projectedVel = velocity.xy - pressureGrad; std.textureStore(projectLayout.$.out, pixelPos, d.vec4f(projectedVel, 0, 1)); }); @@ -267,21 +258,19 @@ export const advectInkFn = tgpu.computeFn({ workgroupSize: [p.WORKGROUP_SIZE_X, p.WORKGROUP_SIZE_Y], in: { gid: d.builtin.globalInvocationId }, })((input) => { + 'use gpu'; const texSize = std.textureDimensions(advectInkLayout.$.src); const pixelPos = input.gid.xy; const velocity = std.textureLoad(advectInkLayout.$.vel, pixelPos, 0).xy; const timeStep = advectInkLayout.$.simParams.dt; - const prevPos = std.sub(d.vec2f(pixelPos), std.mul(timeStep, velocity)); + const prevPos = d.vec2f(pixelPos) - timeStep * velocity; const clampedPos = std.clamp( prevPos, d.vec2f(-0.5), - std.sub(d.vec2f(texSize.xy), d.vec2f(0.5)), - ); - const normalizedPos = std.div( - std.add(clampedPos, d.vec2f(0.5)), - d.vec2f(texSize.xy), + d.vec2f(texSize.xy) - d.vec2f(0.5), ); + const normalizedPos = (clampedPos + 0.5) / d.vec2f(texSize.xy); const inkVal = std.textureSampleLevel( advectInkLayout.$.src, diff --git a/apps/typegpu-docs/src/examples/tests/uniformity/index.ts b/apps/typegpu-docs/src/examples/tests/uniformity/index.ts index 583d9b1d68..797e6465c4 100644 --- a/apps/typegpu-docs/src/examples/tests/uniformity/index.ts +++ b/apps/typegpu-docs/src/examples/tests/uniformity/index.ts @@ -21,12 +21,13 @@ const fragmentShader = tgpu.fragmentFn({ in: { uv: d.vec2f }, out: d.vec4f, })((input) => { - const uv = input.uv.add(1).div(2).mul(d.vec2f(canvasRatioUniform.$, 1)); - const gridedUV = std.floor(uv.mul(gridSizeUniform.$)); + 'use gpu'; + const uv = (input.uv + 1) / 2 * d.vec2f(canvasRatioUniform.$, 1); + const gridedUV = std.floor(uv * gridSizeUniform.$); randf.seed2(gridedUV); - return d.vec4f(d.vec3f(randf.sample()), 1.0); + return d.vec4f(d.vec3f(randf.sample()), 1); }); const pipelineCache = new Map>(); diff --git a/apps/typegpu-docs/src/examples/threejs/attractors/index.ts b/apps/typegpu-docs/src/examples/threejs/attractors/index.ts index bc061673af..24287e51bf 100644 --- a/apps/typegpu-docs/src/examples/threejs/attractors/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/attractors/index.ts @@ -172,14 +172,12 @@ const initCompute = t3.toTSL(() => { const instanceIndex = t3.instanceIndex.$; randf.seed(instanceIndex / count + seed); - const basePosition = randf.inUnitCube() - .sub(0.5) - .mul(d.vec3f(5, 0.2, 5)); + const basePosition = (randf.inUnitCube() - 0.5) * d.vec3f(5, 0.2, 5); positionBuffer.$[instanceIndex] = d.vec3f(basePosition); const phi = randf.sample() * 2 * Math.PI; const theta = randf.sample() * 2; - const baseVelocity = sphericalToVec3(phi, theta).mul(0.05); + const baseVelocity = sphericalToVec3(phi, theta) * 0.05; velocityBuffer.$[instanceIndex] = d.vec3f(baseVelocity); }); @@ -214,7 +212,7 @@ const update = t3.toTSL(() => { const attractorPosition = attractorsPositions.$[i].xyz; const attractorRotationAxis = attractorsRotationAxes.$[i].xyz; - const toAttractor = attractorPosition.sub(position); + const toAttractor = attractorPosition - position; const distance = std.length(toAttractor); const direction = std.normalize(toAttractor); @@ -223,33 +221,31 @@ const update = t3.toTSL(() => { getParticleMass() * gravityConstant / (distance ** 2); - const gravityForce = direction.mul(gravityStrength); - force = force.add(gravityForce); + const gravityForce = direction * gravityStrength; + force += gravityForce; // spinning - const spinningForce = attractorRotationAxis - .mul(gravityStrength) - .mul(spinningStrength.$); + const spinningForce = attractorRotationAxis * gravityStrength * + spinningStrength.$; const spinningVelocity = std.cross(spinningForce, toAttractor); - force = force.add(spinningVelocity); + force += spinningVelocity; } // velocity - velocity = velocity.add(force.mul(delta)); + velocity += force * delta; const speed = std.length(velocity); if (speed > maxSpeed.$) { - velocity = std.normalize(velocity).mul(maxSpeed.$); + velocity = std.normalize(velocity) * maxSpeed.$; } - velocity = velocity.mul(1 - velocityDamping.$); + velocity *= 1 - velocityDamping.$; // position - position = position.add(velocity.mul(delta)); + position += velocity * delta; // box loop const halfHalfExtent = boundHalfExtent.$ / 2; - position = std - .mod(position.add(halfHalfExtent), boundHalfExtent.$) - .sub(halfHalfExtent); + position = std.mod(position + halfHalfExtent, boundHalfExtent.$) - + halfHalfExtent; positionBuffer.$[t3.instanceIndex.$] = d.vec3f(position); velocityBuffer.$[t3.instanceIndex.$] = d.vec3f(velocity); diff --git a/apps/typegpu-docs/src/examples/threejs/compute-cloth/index.ts b/apps/typegpu-docs/src/examples/threejs/compute-cloth/index.ts index 2f9a1954cb..d939e52bb9 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-cloth/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-cloth/index.ts @@ -237,7 +237,7 @@ function setupClothMesh(): THREE.Mesh { clothMaterial.colorNode = t3.toTSL(() => { 'use gpu'; const uv = t3.uv().$; - const pattern = checkerBoard(uv.mul(5)); + const pattern = checkerBoard(uv * 5); return std.mix(patternUniforms.color1.$, patternUniforms.color2.$, pattern); }); diff --git a/apps/typegpu-docs/src/examples/threejs/compute-cloth/triNoise.ts b/apps/typegpu-docs/src/examples/threejs/compute-cloth/triNoise.ts index f217af49d6..fc95cc3fc5 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-cloth/triNoise.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-cloth/triNoise.ts @@ -27,14 +27,14 @@ export const triNoise3D = tgpu.fn([d.vec3f, d.f32, d.f32], d.f32)( let bp = d.vec3f(p); for (let i = d.f32(); i <= 3.0; i += 1) { - const dg = tri3(bp.mul(d.vec3f(2.0))); - p = p.add(dg.add(d.vec3f(time * 0.1 * speed))); - bp = bp.mul(d.vec3f(1.8)); + const dg = tri3(bp * 2); + p += dg + time * 0.1 * speed; + bp *= 1.8; z *= 1.5; - p = p.mul(1.2); + p *= 1.2; const t = tri(p.z + tri(p.x + tri(p.y))); rz = rz + t / z; - bp = bp.add(d.vec3f(0.14)); + bp += 0.14; } return rz; diff --git a/apps/typegpu-docs/src/examples/threejs/compute-cloth/verlet.ts b/apps/typegpu-docs/src/examples/threejs/compute-cloth/verlet.ts index dc63c20db4..798a7dd539 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-cloth/verlet.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-cloth/verlet.ts @@ -221,11 +221,10 @@ export class VerletSimulation { const vertex0Position = this.vertexPositionBuffer.$[vertexId.x]; const vertex1Position = this.vertexPositionBuffer.$[vertexId.y]; - const delta = vertex1Position.sub(vertex0Position); + const delta = vertex1Position - vertex0Position; const dist = std.max(std.length(delta), 0.000001); - const force = delta.mul( - ((dist - restLength) * this.stiffnessUniform.$ * 0.5) / dist, - ); + const force = delta * + ((dist - restLength) * this.stiffnessUniform.$ * 0.5) / dist; this.springForceBuffer.$[idx] = d.vec3f(force); }).compute(springCount); @@ -257,7 +256,7 @@ export class VerletSimulation { const position = this.vertexPositionBuffer.$[idx]; let force = d.vec3f(this.vertexForceBuffer.$[idx]); - force = force.mul(this.dampeningUniform.$); + force *= this.dampeningUniform.$; const ptrStart = springPointer; const ptrEnd = ptrStart + springCount; @@ -266,7 +265,7 @@ export class VerletSimulation { const springForce = this.springForceBuffer.$[springId]; const springVertexIds = this.springVertexIdBuffer.$[springId]; const factor = std.select(-1, 1, springVertexIds.x === idx); - force = force.add(springForce.mul(d.f32(factor))); + force += springForce * factor; } // gravity @@ -279,12 +278,10 @@ export class VerletSimulation { force.z -= windForce; // collision with sphere - const deltaSphere = position.add(force).sub(spherePositionUniform.$); + const deltaSphere = position + force - spherePositionUniform.$; const dist = std.length(deltaSphere); - const sphereForce = deltaSphere.mul( - (std.max(0, sphereRadius - dist) / dist) * sphereUniform.$, - ); - force = force.add(sphereForce); + force += deltaSphere * (std.max(0, sphereRadius - dist) / dist) * + sphereUniform.$; this.vertexForceBuffer.$[idx] = d.vec3f(force); this.vertexPositionBuffer.$[idx] = this.vertexPositionBuffer.$[idx].add( diff --git a/apps/typegpu-docs/src/examples/threejs/compute-geometry/index.ts b/apps/typegpu-docs/src/examples/threejs/compute-geometry/index.ts index b0d2005f23..76f1887d67 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-geometry/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-geometry/index.ts @@ -89,32 +89,18 @@ const jelly = TSL.Fn(({ renderer, geometry, object }) => { let position = positionAccessor.$[instanceIdx]; if (pointerPosition.$.w === 1) { - const worldPosition = modelMatrixAccessor.$.mul( - d.vec4f(position, 1), - ).xyz; + const worldPosition = (modelMatrixAccessor.$ * d.vec4f(position, 1)).xyz; const dist = std.distance(worldPosition, pointerPosition.$.xyz); - const direction = std.normalize( - pointerPosition.$.xyz.sub(worldPosition), - ); - const power = std.max(brushSize.$ - dist, 0) * - brushStrength.$; - - positionAccessor.$[instanceIdx] = position.add( - direction.mul(power), - ); + const direction = std.normalize(pointerPosition.$.xyz - worldPosition); + const power = std.max(brushSize.$ - dist, 0) * brushStrength.$; + + positionAccessor.$[instanceIdx] = position + direction * power; position = positionAccessor.$[instanceIdx]; } - const dist = std.distance( - basePosition, - position, - ); - const force = basePosition - .sub(position) - .mul(elasticity.$ * dist); - const speed = speedAccessor.$[instanceIdx] - .add(force) - .mul(damping.$); + const dist = std.distance(basePosition, position); + const force = (basePosition - position) * elasticity.$ * dist; + const speed = (speedAccessor.$[instanceIdx] + force) * damping.$; speedAccessor.$[instanceIdx] = d.vec3f(speed); positionAccessor.$[instanceIdx] = position.add(speed); diff --git a/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/entities.ts b/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/entities.ts index e8bf859caa..01613975db 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/entities.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/entities.ts @@ -47,9 +47,8 @@ export const floor = (() => { floor.position.y = 0; floor.material.opacityNode = t3.toTSL(() => { 'use gpu'; - return std.saturate( - std.length(t3.fromTSL(TSL.positionLocal.xz, d.vec2f).$.mul(0.05)), - ) - 1; + const localPos = t3.fromTSL(TSL.positionLocal, d.vec3f).$; + return std.saturate(std.length(localPos.xz * 0.05)) - 1; }); floor.layers.disableAll(); floor.layers.enable(1); diff --git a/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/index.ts b/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/index.ts index 742f313201..0ed810d8fa 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-particles-snow/index.ts @@ -61,10 +61,7 @@ collisionPosMaterial.outputNode = TSL.vec4( 1, ); -const positionBuffer = t3.instancedArray( - maxParticleCount, - d.vec3f, -); +const positionBuffer = t3.instancedArray(maxParticleCount, d.vec3f); const scaleBuffer = t3.instancedArray(maxParticleCount, d.vec3f); const staticPositionBuffer = t3.instancedArray(maxParticleCount, d.vec3f); const dataBuffer = t3.instancedArray(maxParticleCount, d.vec4f); @@ -75,8 +72,7 @@ const computeInit = t3.toTSL(() => { randf.seed(instanceIdx / maxParticleCount); const rand = d.vec3f(randf.sample(), randf.sample(), randf.sample()); - const randPos = rand.mul(d.vec3f(100, 500, 100)) - .add(d.vec3f(-50, 3, -50)); + const randPos = rand * d.vec3f(100, 500, 100) + d.vec3f(-50, 3, -50); positionBuffer.$[instanceIdx] = d.vec3f(randPos); scaleBuffer.$[instanceIdx] = d.vec3f(randf.sample() * 0.8 + 0.2); @@ -133,9 +129,9 @@ function particles(isStatic: boolean = false) { material.positionNode = t3.toTSL(() => { 'use gpu'; - return t3.fromTSL(TSL.positionLocal, d.vec3f).$ - .mul(scaleBuffer.$[t3.instanceIndex.$]) - .add(posBuffer.$[t3.instanceIndex.$]); + const iidx = t3.instanceIndex.$; + const localPos = t3.fromTSL(TSL.positionLocal, d.vec3f).$; + return localPos * scaleBuffer.$[iidx] + posBuffer.$[iidx]; }); const rainParticles = new THREE.Mesh(sphereGeometry, material); diff --git a/apps/typegpu-docs/src/examples/threejs/compute-particles/index.ts b/apps/typegpu-docs/src/examples/threejs/compute-particles/index.ts index 9515df44d0..c1cdda6a7d 100644 --- a/apps/typegpu-docs/src/examples/threejs/compute-particles/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/compute-particles/index.ts @@ -69,13 +69,13 @@ const computeAccessor = t3.toTSL(() => { let velocity = velocities.$[instanceIdx]; velocity.y += gravity.$; - position = position.add(velocity); - velocity = velocity.mul(friction.$); + position += velocity; + velocity *= friction.$; if (position.y < 0) { position.y = 0; velocity.y = -velocity.y * bounce.$; - velocity = velocity.mul(d.vec3f(0.9, 1, 0.9)); + velocity *= d.vec3f(0.9, 1, 0.9); } positions.$[instanceIdx] = d.vec3f(position); @@ -85,11 +85,8 @@ const computeAccessor = t3.toTSL(() => { const material = new THREE.SpriteNodeMaterial(); material.colorNode = t3.toTSL(() => { 'use gpu'; - return d.vec4f( - t3.uv().$.mul(colors.$[t3.instanceIndex.$].xy), - 0, - 1, - ); + const iidx = t3.instanceIndex.$; + return d.vec4f(t3.uv().$ * colors.$[iidx].xy, 0, 1); }); material.positionNode = positions.node.toAttribute(); material.scaleNode = size.node; @@ -124,14 +121,14 @@ const computeHit = t3.toTSL(() => { let velocity = velocities.$[instanceIdx]; const dist = std.distance(position, clickPosition.$); - const dir = std.normalize(position.sub(clickPosition.$)); + const dir = std.normalize(position - clickPosition.$); const distArea = std.max(0, 3 - dist); const power = distArea * 0.01; randf.seed(d.f32(instanceIdx / amount)); const relativePower = power * (1.5 * randf.sample() + 0.5); - velocity = velocity.add(dir.mul(relativePower)); + velocity += dir * relativePower; velocities.$[instanceIdx] = d.vec3f(velocity); }).compute(particleCount).setName('Hit Particles TypeGPU'); diff --git a/apps/typegpu-docs/src/examples/threejs/simple/index.ts b/apps/typegpu-docs/src/examples/threejs/simple/index.ts index 56fdc02884..19c6938ac3 100644 --- a/apps/typegpu-docs/src/examples/threejs/simple/index.ts +++ b/apps/typegpu-docs/src/examples/threejs/simple/index.ts @@ -23,7 +23,7 @@ const material = new THREE.MeshBasicNodeMaterial(); material.colorNode = t3.toTSL(() => { 'use gpu'; - const coords = t3.uv().$.mul(2); + const coords = t3.uv().$ * 2; const pattern = perlin3d.sample(d.vec3f(coords, t3.time.$ * 0.2)); return d.vec4f(std.tanh(pattern * 5), 0.2, 0.4, 1); }); @@ -34,12 +34,10 @@ material.positionNode = t3.toTSL(() => { 'use gpu'; const localPos = positionAttrib.$; const t = t3.time.$; - const patternX = perlin3d.sample(localPos.add(d.vec3f(t, 0, 0))); - const patternY = perlin3d.sample(localPos.add(d.vec3f(t, 0, 1))); - const patternZ = perlin3d.sample(localPos.add(d.vec3f(t, 0, 2))); - return localPos.add( - d.vec3f(patternX, patternY, patternZ).mul(0.5), - ); + const patternX = perlin3d.sample(localPos + d.vec3f(t, 0, 0)); + const patternY = perlin3d.sample(localPos + d.vec3f(t, 0, 1)); + const patternZ = perlin3d.sample(localPos + d.vec3f(t, 0, 2)); + return localPos + d.vec3f(patternX, patternY, patternZ) * 0.5; }); const mesh = new THREE.Mesh( diff --git a/packages/typegpu-noise/src/generator.ts b/packages/typegpu-noise/src/generator.ts index 92502a8a42..9fce00d9c4 100644 --- a/packages/typegpu-noise/src/generator.ts +++ b/packages/typegpu-noise/src/generator.ts @@ -1,5 +1,5 @@ import tgpu, { d, type TgpuFnShell, type TgpuSlot } from 'typegpu'; -import { add, cos, dot, fract } from 'typegpu/std'; +import { cos, dot, fract } from 'typegpu/std'; export interface StatefulGenerator { seed?: (seed: number) => void; @@ -28,11 +28,13 @@ export const BPETER: StatefulGenerator = (() => { }), seed3: tgpu.fn([d.vec3f])((value) => { - seed.$ = add(value.xy, d.vec2f(value.z)); + 'use gpu'; + seed.$ = value.xy + d.vec2f(value.z); }), seed4: tgpu.fn([d.vec4f])((value) => { - seed.$ = add(value.xy, value.zw); + 'use gpu'; + seed.$ = value.xy + value.zw; }), sample: randomGeneratorShell(() => { diff --git a/packages/typegpu-noise/src/perlin-2d/algorithm.ts b/packages/typegpu-noise/src/perlin-2d/algorithm.ts index 0a6b42515d..c84cf39e8f 100644 --- a/packages/typegpu-noise/src/perlin-2d/algorithm.ts +++ b/packages/typegpu-noise/src/perlin-2d/algorithm.ts @@ -1,10 +1,11 @@ import tgpu, { d } from 'typegpu'; -import { add, dot, floor, fract, mul, sub } from 'typegpu/std'; +import { dot, floor, fract } from 'typegpu/std'; import { randOnUnitCircle, randSeed2 } from '../random.ts'; import { quinticDerivative2, quinticInterpolation2 } from '../utils.ts'; export const computeJunctionGradient = tgpu.fn([d.vec2i], d.vec2f)((pos) => { - randSeed2(mul(0.001, d.vec2f(pos))); + 'use gpu'; + randSeed2(0.001 * d.vec2f(pos)); return randOnUnitCircle(); }); @@ -14,6 +15,7 @@ export const getJunctionGradientSlot = tgpu.slot(computeJunctionGradient); * Returns value of Perlin Noise at point `pos` */ export const sample = tgpu.fn([d.vec2f], d.f32)((pos) => { + 'use gpu'; // Reference: https://iquilezles.org/articles/gradientnoise/ const i = d.vec2i(floor(pos)); @@ -22,14 +24,14 @@ export const sample = tgpu.fn([d.vec2f], d.f32)((pos) => { const u = quinticInterpolation2(f); const ga = getJunctionGradientSlot.$(i); - const gb = getJunctionGradientSlot.$(add(i, d.vec2i(1, 0))); - const gc = getJunctionGradientSlot.$(add(i, d.vec2i(0, 1))); - const gd = getJunctionGradientSlot.$(add(i, d.vec2i(1, 1))); + const gb = getJunctionGradientSlot.$(i + d.vec2i(1, 0)); + const gc = getJunctionGradientSlot.$(i + d.vec2i(0, 1)); + const gd = getJunctionGradientSlot.$(i + d.vec2i(1, 1)); - const va = dot(ga, sub(f, d.vec2f(0, 0))); - const vb = dot(gb, sub(f, d.vec2f(1, 0))); - const vc = dot(gc, sub(f, d.vec2f(0, 1))); - const vd = dot(gd, sub(f, d.vec2f(1, 1))); + const va = dot(ga, f - d.vec2f(0, 0)); + const vb = dot(gb, f - d.vec2f(1, 0)); + const vc = dot(gc, f - d.vec2f(0, 1)); + const vd = dot(gd, f - d.vec2f(1, 1)); const noise = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd); @@ -42,6 +44,7 @@ export const sample = tgpu.fn([d.vec2f], d.f32)((pos) => { * the gradient of the function at that point as yz coordinates. */ export const sampleWithGradient = tgpu.fn([d.vec2f], d.vec3f)((pos) => { + 'use gpu'; // Reference: https://iquilezles.org/articles/gradientnoise/ const i = d.vec2i(floor(pos)); @@ -51,29 +54,21 @@ export const sampleWithGradient = tgpu.fn([d.vec2f], d.vec3f)((pos) => { const du = quinticDerivative2(f); const ga = getJunctionGradientSlot.$(i); - const gb = getJunctionGradientSlot.$(add(i, d.vec2i(1, 0))); - const gc = getJunctionGradientSlot.$(add(i, d.vec2i(0, 1))); - const gd = getJunctionGradientSlot.$(add(i, d.vec2i(1, 1))); + const gb = getJunctionGradientSlot.$(i + d.vec2i(1, 0)); + const gc = getJunctionGradientSlot.$(i + d.vec2i(0, 1)); + const gd = getJunctionGradientSlot.$(i + d.vec2i(1, 1)); - const va = dot(ga, sub(f, d.vec2f(0, 0))); - const vb = dot(gb, sub(f, d.vec2f(1, 0))); - const vc = dot(gc, sub(f, d.vec2f(0, 1))); - const vd = dot(gd, sub(f, d.vec2f(1, 1))); + const va = dot(ga, f - d.vec2f(0, 0)); + const vb = dot(gb, f - d.vec2f(1, 0)); + const vc = dot(gc, f - d.vec2f(0, 1)); + const vd = dot(gd, f - d.vec2f(1, 1)); const noise = va + u.x * (vb - va) + u.y * (vc - va) + u.x * u.y * (va - vb - vc + vd); - // ga + u.x*(gb-ga) + u.y*(gc-ga) + u.x*u.y*(ga-gb-gc+gd) + du * (u.yx*(va-vb-vc+vd) + vec2(vb,vc) - va)) - const grad = add( - ga, - add( - add( - add(mul(u.x, sub(gb, ga)), mul(u.y, sub(gc, ga))), - mul(u.x, mul(u.y, add(sub(sub(ga, gb), gc), gd))), - ), - mul(du, sub(add(mul(u.yx, va - vb - vc + vd), d.vec2f(vb, vc)), va)), - ), - ); + const grad = ga + u.x * (gb - ga) + u.y * (gc - ga) + + u.x * u.y * (ga - gb - gc + gd) + + du * (u.yx * (va - vb - vc + vd) + d.vec2f(vb, vc) - va); return d.vec3f(noise, grad); }); diff --git a/packages/typegpu-noise/src/perlin-3d/algorithm.ts b/packages/typegpu-noise/src/perlin-3d/algorithm.ts index bdf895b92c..6c93ebdf97 100644 --- a/packages/typegpu-noise/src/perlin-3d/algorithm.ts +++ b/packages/typegpu-noise/src/perlin-3d/algorithm.ts @@ -1,35 +1,38 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; -import { add, dot, floor, mix, mul, sub } from 'typegpu/std'; +import { dot, floor, mix } from 'typegpu/std'; import { randOnUnitSphere, randSeed3 } from '../random.ts'; import { quinticInterpolation3 } from '../utils.ts'; export const computeJunctionGradient = tgpu.fn([d.vec3i], d.vec3f)((pos) => { - randSeed3(mul(0.001, d.vec3f(pos))); + 'use gpu'; + randSeed3(0.001 * d.vec3f(pos)); return randOnUnitSphere(); }); export const getJunctionGradientSlot = tgpu.slot(computeJunctionGradient); -const dotProdGrid = tgpu.fn([d.vec3f, d.vec3f], d.f32)((pos, junction) => { - const relative = sub(pos, junction); - const gridVector = getJunctionGradientSlot.value(d.vec3i(junction)); +const dotProdGrid = (pos: d.v3f, junction: d.v3f): number => { + 'use gpu'; + const relative = pos - junction; + const gridVector = getJunctionGradientSlot.$(d.vec3i(junction)); return dot(relative, gridVector); -}); +}; export const sample = tgpu.fn([d.vec3f], d.f32)((pos) => { + 'use gpu'; const minJunction = floor(pos); const xyz = dotProdGrid(pos, minJunction); - const xyZ = dotProdGrid(pos, add(minJunction, d.vec3f(0, 0, 1))); - const xYz = dotProdGrid(pos, add(minJunction, d.vec3f(0, 1, 0))); - const xYZ = dotProdGrid(pos, add(minJunction, d.vec3f(0, 1, 1))); - const Xyz = dotProdGrid(pos, add(minJunction, d.vec3f(1, 0, 0))); - const XyZ = dotProdGrid(pos, add(minJunction, d.vec3f(1, 0, 1))); - const XYz = dotProdGrid(pos, add(minJunction, d.vec3f(1, 1, 0))); - const XYZ = dotProdGrid(pos, add(minJunction, d.vec3f(1, 1, 1))); - - const partial = sub(pos, minJunction); + const xyZ = dotProdGrid(pos, minJunction + d.vec3f(0, 0, 1)); + const xYz = dotProdGrid(pos, minJunction + d.vec3f(0, 1, 0)); + const xYZ = dotProdGrid(pos, minJunction + d.vec3f(0, 1, 1)); + const Xyz = dotProdGrid(pos, minJunction + d.vec3f(1, 0, 0)); + const XyZ = dotProdGrid(pos, minJunction + d.vec3f(1, 0, 1)); + const XYz = dotProdGrid(pos, minJunction + d.vec3f(1, 1, 0)); + const XYZ = dotProdGrid(pos, minJunction + d.vec3f(1, 1, 1)); + + const partial = pos - minJunction; const smoothPartial = quinticInterpolation3(partial); // Resolving the z-axis into a xy-slice diff --git a/packages/typegpu-noise/src/random.ts b/packages/typegpu-noise/src/random.ts index 708e681b5a..6dfec0fd16 100644 --- a/packages/typegpu-noise/src/random.ts +++ b/packages/typegpu-noise/src/random.ts @@ -3,9 +3,7 @@ import { cos, dot, log, - mul, normalize, - pow, select, sign, sin, @@ -93,12 +91,13 @@ export const randOnUnitCircle: TgpuFn<() => d.Vec2f> = tgpu export const randInUnitSphere: TgpuFn<() => d.Vec3f> = tgpu .fn([], d.vec3f)(() => { + 'use gpu'; const u = randomGeneratorSlot.$.sample(); const v = d.vec3f(randNormal(0, 1), randNormal(0, 1), randNormal(0, 1)); const vNorm = normalize(v); - return vNorm.mul(pow(u, 0.33)); + return vNorm * (u ** 0.33); }); export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu @@ -114,18 +113,20 @@ export const randOnUnitSphere: TgpuFn<() => d.Vec3f> = tgpu export const randInUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu .fn([d.vec3f], d.vec3f)((normal) => { + 'use gpu'; const value = randInUnitSphere(); const alignment = dot(normal, value); - return mul(sign(alignment), value); + return sign(alignment) * value; }); export const randOnUnitHemisphere: TgpuFn<(normal: d.Vec3f) => d.Vec3f> = tgpu .fn([d.vec3f], d.vec3f)((normal) => { + 'use gpu'; const value = randOnUnitSphere(); const alignment = dot(normal, value); - return mul(sign(alignment), value); + return sign(alignment) * value; }); export const randUniformExclusive: TgpuFn<() => d.F32> = tgpu diff --git a/packages/typegpu-noise/src/utils.ts b/packages/typegpu-noise/src/utils.ts index f267ee9fb3..6f338ac127 100644 --- a/packages/typegpu-noise/src/utils.ts +++ b/packages/typegpu-noise/src/utils.ts @@ -1,5 +1,4 @@ import tgpu, { d } from 'typegpu'; -import { add, mul, sub } from 'typegpu/std'; export type Prettify = & { @@ -11,13 +10,10 @@ export type PrefixKeys = { [K in keyof T as K extends string ? `${Prefix}${K}` : K]: T[K]; }; -// t * t * t * (t * (6t - (15, 15)) + (10, 10)); -const quinticInterpolationImpl = (t: T): T => { +function quinticInterpolationImpl(t: T): T { 'use gpu'; - return mul(mul(t, mul(t, t)), add(mul(t, sub(mul(t, 6), 15)), 10)); - // TODO: Write it using fluent APIs when it becomes available: - // return t.mul(t).mul(t).mul((t.mul(6).sub(15)).add(10)); -}; + return t * t * t * (t * (t * 6 - 15) + 10) as T; +} /** * Works as a replacement for smoothstep, but with a continuous @@ -33,10 +29,9 @@ export const quinticInterpolation2 = tgpu export const quinticInterpolation3 = tgpu .fn([d.vec3f], d.vec3f)(quinticInterpolationImpl); -// 30 * t * t * (t * (t - (2, 2)) + (1, 1)) const quinticDerivativeImpl = (t: T): T => { 'use gpu'; - return mul(mul(mul(30, t), t), add(mul(t, sub(t, 2)), 1)); + return (30 * t * t * (t * (t - 2)) + 1) as T; }; /** diff --git a/packages/typegpu-sdf/src/2d.ts b/packages/typegpu-sdf/src/2d.ts index bf7bd4a14e..e71feb41ce 100644 --- a/packages/typegpu-sdf/src/2d.ts +++ b/packages/typegpu-sdf/src/2d.ts @@ -3,20 +3,18 @@ import { f32, type v2f, vec2f, vec3f } from 'typegpu/data'; import { abs, acos, - add, clamp, cos, + distance, dot, length, max, min, - mul, pow, saturate, sign, sin, sqrt, - sub, } from 'typegpu/std'; /** @@ -34,7 +32,8 @@ export const sdDisk = tgpu.fn([vec2f, f32], f32)((point, radius) => { * @param size Half-dimensions of the box */ export const sdBox2d = tgpu.fn([vec2f, vec2f], f32)((point, size) => { - const d = sub(abs(point), size); + 'use gpu'; + const d = abs(point) - size; return length(max(d, vec2f(0))) + min(max(d.x, d.y), 0); }); @@ -46,7 +45,8 @@ export const sdBox2d = tgpu.fn([vec2f, vec2f], f32)((point, size) => { */ export const sdRoundedBox2d = tgpu .fn([vec2f, vec2f, f32], f32)((point, size, cornerRadius) => { - const d = add(sub(abs(point), size), vec2f(cornerRadius)); + 'use gpu'; + const d = abs(point) - size + vec2f(cornerRadius); return length(max(d, vec2f(0))) + min(max(d.x, d.y), 0) - cornerRadius; }); @@ -57,10 +57,11 @@ export const sdRoundedBox2d = tgpu * @param B Second endpoint of the line */ export const sdLine = tgpu.fn([vec2f, vec2f, vec2f], f32)((point, A, B) => { - const pa = sub(point, A); - const ba = sub(B, A); + 'use gpu'; + const pa = point - A; + const ba = B - A; const h = max(0, min(1, dot(pa, ba) / dot(ba, ba))); - return length(sub(pa, ba.mul(h))); + return distance(pa, ba * h); }); const dot2 = (v: v2f) => { @@ -77,10 +78,11 @@ const dot2 = (v: v2f) => { */ export const sdBezier = tgpu.fn([vec2f, vec2f, vec2f, vec2f], f32)( (point, A, B, C) => { - const a = B.sub(A); - const b = A.sub(B.mul(2)).add(C); - const c = a.mul(f32(2)); - const d = A.sub(point); + 'use gpu'; + const a = B - A; + const b = A - B * 2 + C; + const c = a * 2; + const d = A - point; const dotB = max(dot(b, b), 0.0001); const kk = 1 / dotB; @@ -96,24 +98,20 @@ export const sdBezier = tgpu.fn([vec2f, vec2f, vec2f, vec2f], f32)( if (h >= 0.0) { h = sqrt(h); - const x = vec2f(h, -h).sub(q).mul(0.5); - const uv = sign(x).mul(pow(abs(x), vec2f(1 / 3))); - const t = clamp(uv.x + uv.y - kx, 0, 1); - res = dot2(d.add(c.add(b.mul(t)).mul(t))); + const x = (vec2f(h, -h) - q) * 0.5; + const uv = sign(x) * pow(abs(x), vec2f(1 / 3)); + const t = saturate(uv.x + uv.y - kx); + res = dot2(d + (c + b * t) * t); } else { const z = sqrt(-p); const v = acos(q / (p * z * 2)) / 3; const m = cos(v); - const n = mul(sin(v), 1.732050808); // sqrt(3) - const t = saturate( - vec3f(m + m, -n - m, n - m) - .mul(z) - .sub(kx), - ); + const n = sin(v) * 1.732050808; // sqrt(3) + const t = saturate(vec3f(m + m, -n - m, n - m) * z - kx); res = min( - dot2(d.add(c.add(b.mul(t.x)).mul(t.x))), - dot2(d.add(c.add(b.mul(t.y)).mul(t.y))), + dot2(d + (c + b * t.x) * t.x), + dot2(d + (c + b * t.y) * t.y), ); } @@ -137,25 +135,26 @@ export const sdBezierApprox = tgpu.fn( [vec2f, vec2f, vec2f, vec2f], f32, )((point, A, B, C) => { - const i = A.sub(C); - const j = C.sub(B); - const k = B.sub(A); - const w = j.sub(k); + 'use gpu'; + const i = A - C; + const j = C - B; + const k = B - A; + const w = j - k; - const v0 = A.sub(point); - const v1 = B.sub(point); - const v2 = C.sub(point); + const v0 = A - point; + const v1 = B - point; + const v2 = C - point; const x = cross(v0, v2); const y = cross(v1, v0); const z = cross(v2, v1); - const s = j.mul(y).add(k.mul(z)).mul(2).sub(i.mul(x)); + const s = (j * y + k * z) * 2 - (i * x); const r = (y * z - x * x * 0.25) / dot2(s); const t = saturate((0.5 * x + y + r * dot(s, w)) / (x + y + z)); - const d = v0.add(k.add(k).add(w.mul(t)).mul(t)); + const d = v0 + (k + k + (w * t)) * t; return length(d); }); @@ -167,9 +166,10 @@ export const sdBezierApprox = tgpu.fn( * @param radius - The radius of the pie */ export const sdPie = tgpu.fn([vec2f, vec2f, f32], f32)((point, sc, radius) => { + 'use gpu'; const p_w = vec2f(point); p_w.x = abs(point.x); const l = length(p_w) - radius; - const m = length(p_w.sub(sc.mul(clamp(dot(p_w, sc), 0, radius)))); + const m = distance(p_w, sc * (clamp(dot(p_w, sc), 0, radius))); return max(l, m * sign(sc.y * p_w.x - sc.x * p_w.y)); }); diff --git a/packages/typegpu-sdf/src/3d.ts b/packages/typegpu-sdf/src/3d.ts index 4b07d9ddeb..b7ed2b1d5e 100644 --- a/packages/typegpu-sdf/src/3d.ts +++ b/packages/typegpu-sdf/src/3d.ts @@ -1,6 +1,16 @@ import tgpu from 'typegpu'; import { f32, vec3f } from 'typegpu/data'; -import { abs, add, dot, length, max, min, saturate, sub } from 'typegpu/std'; +import { + abs, + add, + distance, + dot, + length, + max, + min, + saturate, + sub, +} from 'typegpu/std'; /** * Signed distance function for a sphere @@ -66,10 +76,11 @@ export const sdBoxFrame3d = tgpu * @param B Second endpoint of the line */ export const sdLine3d = tgpu.fn([vec3f, vec3f, vec3f], f32)((point, A, B) => { - const pa = sub(point, A); - const ba = sub(B, A); + 'use gpu'; + const pa = point - A; + const ba = B - A; const h = max(0, min(1, dot(pa, ba) / dot(ba, ba))); - return length(sub(pa, ba.mul(h))); + return distance(pa, ba * h); }); /** @@ -93,8 +104,9 @@ export const sdPlane = tgpu.fn([vec3f, vec3f, f32], f32)( */ export const sdCapsule = tgpu .fn([vec3f, vec3f, vec3f, f32], f32)((point, A, B, radius) => { - const pa = sub(point, A); - const ba = sub(B, A); + 'use gpu'; + const pa = point - A; + const ba = B - A; const h = saturate(dot(pa, ba) / dot(ba, ba)); - return length(sub(pa, ba.mul(h))) - radius; + return distance(pa, ba * h) - radius; }); diff --git a/packages/typegpu/tests/examples/individual/3d-fish.test.ts b/packages/typegpu/tests/examples/individual/3d-fish.test.ts index f5d60e2251..36e7c6060c 100644 --- a/packages/typegpu/tests/examples/individual/3d-fish.test.ts +++ b/packages/typegpu/tests/examples/individual/3d-fish.test.ts @@ -143,7 +143,7 @@ describe('3d fish example', () => { let other = (¤tFishData[i]); let dist = distance((*fishData).position, (*other).position); if ((dist < fishBehavior.separationDist)) { - separation = ((separation + (*fishData).position) - (*other).position); + separation += ((*fishData).position - (*other).position); } if ((dist < fishBehavior.alignmentDist)) { alignment = (alignment + (*other).direction); diff --git a/packages/typegpu/tests/examples/individual/ascii-filter.test.ts b/packages/typegpu/tests/examples/individual/ascii-filter.test.ts index 204b3082aa..445d771b97 100644 --- a/packages/typegpu/tests/examples/individual/ascii-filter.test.ts +++ b/packages/typegpu/tests/examples/individual/ascii-filter.test.ts @@ -226,7 +226,7 @@ describe('ascii filter example', () => { let charValue = characterFn(n, p); var resultColor = vec3f(1); if ((displayMode == 0u)) { - resultColor = (color * charValue).rgb; + resultColor = (color.rgb * charValue); } if ((displayMode == 1u)) { resultColor = vec3f((gray * charValue)); diff --git a/packages/typegpu/tests/examples/individual/boids.test.ts b/packages/typegpu/tests/examples/individual/boids.test.ts index 86b054217d..8c6725fb65 100644 --- a/packages/typegpu/tests/examples/individual/boids.test.ts +++ b/packages/typegpu/tests/examples/individual/boids.test.ts @@ -40,7 +40,7 @@ describe('boids example', () => { @group(1) @binding(1) var nextTrianglePos: array; fn simulate(index: u32, _arg_1: u32, _arg_2: u32) { - var instanceInfo = currentTrianglePos[index]; + var self_1 = currentTrianglePos[index]; var separation = vec2f(); var alignment = vec2f(); var cohesion = vec2f(); @@ -49,46 +49,34 @@ describe('boids example', () => { for (var i = 0u; i < arrayLength((¤tTrianglePos)); i++) { let other = (¤tTrianglePos[i]); { - let dist = distance(instanceInfo.position, (*other).position); + let dist = distance(self_1.position, (*other).position); if ((dist < paramsBuffer.separationDistance)) { - separation = (separation + (instanceInfo.position - (*other).position)); + separation += (self_1.position - (*other).position); } if ((dist < paramsBuffer.alignmentDistance)) { - alignment = (alignment + (*other).velocity); + alignment += (*other).velocity; alignmentCount++; } if ((dist < paramsBuffer.cohesionDistance)) { - cohesion = (cohesion + (*other).position); + cohesion += (*other).position; cohesionCount++; } } } if ((alignmentCount > 0i)) { - alignment = ((1f / f32(alignmentCount)) * alignment); + alignment /= f32(alignmentCount); } if ((cohesionCount > 0i)) { - cohesion = ((1f / f32(cohesionCount)) * cohesion); - cohesion = (cohesion - instanceInfo.position); + cohesion /= f32(cohesionCount); + cohesion -= self_1.position; } - var velocity = (paramsBuffer.separationStrength * separation); - velocity = (velocity + (paramsBuffer.alignmentStrength * alignment)); - velocity = (velocity + (paramsBuffer.cohesionStrength * cohesion)); - instanceInfo.velocity = (instanceInfo.velocity + velocity); - instanceInfo.velocity = (clamp(length(instanceInfo.velocity), 0f, 0.01f) * normalize(instanceInfo.velocity)); - if ((instanceInfo.position.x > 1.03f)) { - instanceInfo.position.x = -1.03f; - } - if ((instanceInfo.position.y > 1.03f)) { - instanceInfo.position.y = -1.03f; - } - if ((instanceInfo.position.x < -1.03f)) { - instanceInfo.position.x = 1.03f; - } - if ((instanceInfo.position.y < -1.03f)) { - instanceInfo.position.y = 1.03f; - } - instanceInfo.position = (instanceInfo.position + instanceInfo.velocity); - nextTrianglePos[index] = instanceInfo; + var velocity = (((paramsBuffer.separationStrength * separation) + (paramsBuffer.alignmentStrength * alignment)) + (paramsBuffer.cohesionStrength * cohesion)); + self_1.velocity += velocity; + self_1.velocity = (clamp(length(self_1.velocity), 0f, 0.01f) * normalize(self_1.velocity)); + self_1.position += self_1.velocity; + const domain = 2.06; + self_1.position = ((fract(((self_1.position / domain) + 0.5f)) - 0.5f) * domain); + nextTrianglePos[index] = self_1; } struct mainCompute_Input { diff --git a/packages/typegpu/tests/examples/individual/caustics.test.ts b/packages/typegpu/tests/examples/individual/caustics.test.ts index cac8c27b83..e9a3f328b6 100644 --- a/packages/typegpu/tests/examples/individual/caustics.test.ts +++ b/packages/typegpu/tests/examples/individual/caustics.test.ts @@ -82,7 +82,7 @@ describe('caustics example', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { @@ -134,9 +134,9 @@ describe('caustics example', () => { var noFogColor = (albedo * mix(vec3f(0.20000000298023224, 0.5, 1), (c1 + c2), blend)); let fog = min((pow(_arg_0.uv.y, 0.5f) * 1.2f), 1f); var godRayUv = ((rotateXY(-0.3f) * _arg_0.uv) * vec2f(15, 3)); - let godRayFactor = pow(_arg_0.uv.y, 1f); - var godRay1 = ((sample(vec3f(godRayUv, (time * 0.5f))) + 1f) * (vec3f(0.18000000715255737, 0.30000001192092896, 0.5) * godRayFactor)); - var godRay2 = ((sample(vec3f((godRayUv * 2f), (time * 0.3f))) + 1f) * (vec3f(0.18000000715255737, 0.30000001192092896, 0.5) * (godRayFactor * 0.4f))); + let godRayFactor = _arg_0.uv.y; + var godRay1 = (((sample(vec3f(godRayUv, (time * 0.5f))) + 1f) * vec3f(0.18000000715255737, 0.30000001192092896, 0.5)) * godRayFactor); + var godRay2 = ((((sample(vec3f((godRayUv * 2f), (time * 0.3f))) + 1f) * vec3f(0.18000000715255737, 0.30000001192092896, 0.5)) * godRayFactor) * 0.4f); var godRays = (godRay1 + godRay2); return vec4f((mix(noFogColor, vec3f(0.05000000074505806, 0.20000000298023224, 0.699999988079071), fog) + godRays), 1f); }" diff --git a/packages/typegpu/tests/examples/individual/clouds.test.ts b/packages/typegpu/tests/examples/individual/clouds.test.ts index df70cf0435..ad184b45b8 100644 --- a/packages/typegpu/tests/examples/individual/clouds.test.ts +++ b/packages/typegpu/tests/examples/individual/clouds.test.ts @@ -101,7 +101,7 @@ describe('clouds example', () => { fn sampleDensityCheap(pos: vec3f) -> f32 { let noise = (noise3d((pos * 1.4f)) * 1f); - return clamp(((noise + 0.7f) - 0.5f), 0f, 1f); + return saturate(((noise + 0.7f) - 0.5f)); } fn raymarch(rayOrigin: vec3f, rayDir: vec3f, sunDir: vec3f) -> vec4f { @@ -112,18 +112,18 @@ describe('clouds example', () => { let stepSize = (1f / f32(maxSteps)); var dist = (randFloat01() * stepSize); for (var i = 0; (i < maxSteps); i++) { - var samplePos = (rayOrigin + (rayDir * (dist * maxDepth))); + var samplePos = (rayOrigin + ((rayDir * dist) * maxDepth)); let cloudDensity = sampleDensity(samplePos); if ((cloudDensity > 0f)) { var shadowPos = (samplePos + sunDir); let shadowDensity = sampleDensityCheap(shadowPos); - let shadow = clamp((cloudDensity - shadowDensity), 0f, 1f); + let shadow = saturate((cloudDensity - shadowDensity)); let lightVal = mix(0.3f, 1f, shadow); - var light = (vec3f(0.6600000262260437, 0.4949999749660492, 0.824999988079071) + (vec3f(1, 0.699999988079071, 0.30000001192092896) * (lightVal * 0.9f))); + var light = (vec3f(0.6600000262260437, 0.4949999749660492, 0.824999988079071) + ((vec3f(1, 0.699999988079071, 0.30000001192092896) * lightVal) * 0.9f)); var color = mix(vec3f(1), vec3f(0.20000000298023224), cloudDensity); var lit = (color * light); - var contrib = (vec4f(lit, 1f) * (cloudDensity * (0.88f - accum.a))); - accum = (accum + contrib); + var contrib = ((vec4f(lit, 1f) * cloudDensity) * (0.88f - accum.a)); + accum += contrib; if ((accum.a >= 0.879f)) { break; } @@ -133,11 +133,11 @@ describe('clouds example', () => { return accum; } - struct mainFragment_Input { + struct FragmentIn { @location(0) uv: vec2f, } - @fragment fn mainFragment(_arg_0: mainFragment_Input) -> @location(0) vec4f { + @fragment fn fragment(_arg_0: FragmentIn) -> @location(0) vec4f { randSeed2((_arg_0.uv * params.time)); let screenRes = (&resolutionUniform); let aspect = ((*screenRes).x / (*screenRes).y); @@ -147,10 +147,10 @@ describe('clouds example', () => { let time = params.time; var rayOrigin = vec3f((sin((time * 0.6f)) * 0.5f), ((cos((time * 0.8f)) * 0.5f) - 1f), (time * 1f)); var rayDir = normalize(vec3f(screenPos.x, screenPos.y, 1f)); - let sunDot = clamp(dot(rayDir, sunDir), 0f, 1f); + let sunDot = saturate(dot(rayDir, sunDir)); let sunGlow = pow(sunDot, 1.371742112482853f); - var skyCol = (vec3f(0.75, 0.6600000262260437, 0.8999999761581421) - (vec3f(1, 0.699999988079071, 0.4300000071525574) * (rayDir.y * 0.35f))); - skyCol = (skyCol + (vec3f(1, 0.3700000047683716, 0.17000000178813934) * sunGlow)); + var skyCol = (vec3f(0.75, 0.6600000262260437, 0.8999999761581421) - ((vec3f(1, 0.699999988079071, 0.4300000071525574) * rayDir.y) * 0.35f)); + skyCol += (vec3f(1, 0.3700000047683716, 0.17000000178813934) * sunGlow); var cloudCol = raymarch(rayOrigin, rayDir, sunDir); var finalCol = ((skyCol * (1.1f - cloudCol.a)) + cloudCol.rgb); return vec4f(finalCol, 1f); diff --git a/packages/typegpu/tests/examples/individual/gravity.test.ts b/packages/typegpu/tests/examples/individual/gravity.test.ts index 0d57799581..bfe238a0db 100644 --- a/packages/typegpu/tests/examples/individual/gravity.test.ts +++ b/packages/typegpu/tests/examples/individual/gravity.test.ts @@ -169,9 +169,9 @@ describe('gravity example', () => { let dist = max((radiusOf(current) + radiusOf((*other))), distance(current.position, (*other).position)); let gravityForce = (((current.mass * (*other).mass) / dist) / dist); var direction = normalize(((*other).position - current.position)); - current.velocity = (current.velocity + (direction * ((gravityForce / current.mass) * dt))); + current.velocity += ((direction * (gravityForce / current.mass)) * dt); } - current.position = (current.position + (current.velocity * dt)); + current.position += (current.velocity * dt); } outState[currentId] = current; } @@ -294,8 +294,7 @@ describe('gravity example', () => { var lightDirection = normalize((lightSource - input.worldPosition)); let cosTheta = dot(normal, lightDirection); var diffuse = ((textureColor * lightColor) * max(0f, cosTheta)); - var litColor = (ambient + diffuse); - return vec4f(litColor, 1f); + return vec4f((ambient + diffuse), 1f); }" `); }); diff --git a/packages/typegpu/tests/examples/individual/jelly-slider.test.ts b/packages/typegpu/tests/examples/individual/jelly-slider.test.ts index 544d5b5ae7..725544252f 100644 --- a/packages/typegpu/tests/examples/individual/jelly-slider.test.ts +++ b/packages/typegpu/tests/examples/individual/jelly-slider.test.ts @@ -383,7 +383,7 @@ describe('jelly-slider example', () => { var p_w = point; p_w.x = abs(point.x); let l = (length(p_w) - radius); - let m = length((p_w - (sc * clamp(dot(p_w, sc), 0f, radius)))); + let m = distance(p_w, (sc * clamp(dot(p_w, sc), 0f, radius))); return max(l, (m * sign(((sc.y * p_w.x) - (sc.x * p_w.y))))); } @@ -693,7 +693,7 @@ describe('jelly-slider example', () => { h = sqrt(h); var x = ((vec2f(h, -(h)) - q) * 0.5f); var uv = (sign(x) * pow(abs(x), vec2f(0.3333333432674408))); - let t = clamp(((uv.x + uv.y) - kx), 0f, 1f); + let t = saturate(((uv.x + uv.y) - kx)); res = dot2((d + ((c + (b * t)) * t))); } else { diff --git a/packages/typegpu/tests/examples/individual/perlin-noise.test.ts b/packages/typegpu/tests/examples/individual/perlin-noise.test.ts index cc90153c0c..7ca44875bf 100644 --- a/packages/typegpu/tests/examples/individual/perlin-noise.test.ts +++ b/packages/typegpu/tests/examples/individual/perlin-noise.test.ts @@ -111,7 +111,7 @@ describe('perlin noise example', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { diff --git a/packages/typegpu/tests/examples/individual/ripple-cube.test.ts b/packages/typegpu/tests/examples/individual/ripple-cube.test.ts index dbe13f72fd..b6bfd252c5 100644 --- a/packages/typegpu/tests/examples/individual/ripple-cube.test.ts +++ b/packages/typegpu/tests/examples/individual/ripple-cube.test.ts @@ -150,7 +150,7 @@ describe('ripple-cube example', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { @@ -450,7 +450,7 @@ describe('ripple-cube example', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { diff --git a/packages/typegpu/tests/examples/individual/slime-mold-3d.test.ts b/packages/typegpu/tests/examples/individual/slime-mold-3d.test.ts index 0f1b46e97e..9ccdd15d4e 100644 --- a/packages/typegpu/tests/examples/individual/slime-mold-3d.test.ts +++ b/packages/typegpu/tests/examples/individual/slime-mold-3d.test.ts @@ -190,7 +190,7 @@ describe('slime mold 3d example', () => { var coneOffset = ((perp1 * cos(theta)) + (perp2 * sin(theta))); var sensorDir = normalize((direction + (coneOffset * sin(params.sensorAngle)))); var sensorPos = (pos + (sensorDir * params.sensorDistance)); - var sensorPosInt = vec3u(clamp(sensorPos, vec3f(), (dimsf - vec3f(1)))); + var sensorPosInt = vec3u(clamp(sensorPos, vec3f(), (dimsf - 1f))); let weight = textureLoad(oldState, sensorPosInt).x; weightedDir = (weightedDir + (sensorDir * weight)); totalWeight = (totalWeight + weight); @@ -263,8 +263,8 @@ describe('slime mold 3d example', () => { var direction = normalize((*agent).direction); var senseResult = sense3D((*agent).position, direction); var targetDirection = select(randOnUnitHemisphere(direction), normalize(senseResult.weightedDir), (senseResult.totalWeight > 0.01f)); - direction = normalize((direction + (targetDirection * (params.turnSpeed * params.deltaTime)))); - var newPos = ((*agent).position + (direction * (params.moveSpeed * params.deltaTime))); + direction = normalize((direction + ((targetDirection * params.turnSpeed) * params.deltaTime))); + var newPos = ((*agent).position + ((direction * params.moveSpeed) * params.deltaTime)); var center = (dimsf / 2f); if (((newPos.x < 0f) || (newPos.x >= dimsf.x))) { newPos.x = clamp(newPos.x, 0f, (dimsf.x - 1f)); @@ -343,7 +343,7 @@ describe('slime mold 3d example', () => { } fn rayBoxIntersection(rayOrigin: vec3f, rayDir: vec3f, boxMin: vec3f, boxMax: vec3f) -> RayBoxResult { - var invDir = (vec3f(1) / rayDir); + var invDir = (1f / rayDir); var t0 = ((boxMin - rayOrigin) * invDir); var t1 = ((boxMax - rayOrigin) * invDir); var tmin = min(t0, t1); @@ -418,7 +418,7 @@ describe('slime mold 3d example', () => { let density = pow(d0, gamma); let alphaSrc = (1f - exp(((-(sigmaT) * density) * stepSize))); var contrib = (albedo * alphaSrc); - accum = (accum + (contrib * transmittance)); + accum += (contrib * transmittance); transmittance = (transmittance * (1f - alphaSrc)); i += 1i; } diff --git a/packages/typegpu/tests/examples/individual/slime-mold.test.ts b/packages/typegpu/tests/examples/individual/slime-mold.test.ts index 9cdf638876..4a20a0cd7b 100644 --- a/packages/typegpu/tests/examples/individual/slime-mold.test.ts +++ b/packages/typegpu/tests/examples/individual/slime-mold.test.ts @@ -99,13 +99,13 @@ describe('slime mold example', () => { var dimsi = vec2i(dims); if (((((samplePos.x >= 0i) && (samplePos.x < dimsi.x)) && (samplePos.y >= 0i)) && (samplePos.y < dimsi.y))) { var color = textureLoad(oldState, vec2u(samplePos)).rgb; - sum = (sum + color); - count = (count + 1f); + sum += color; + count += 1f; } } } var blurred = (sum / count); - var newColor = clamp((blurred - params.evaporationRate), vec3f(), vec3f(1)); + var newColor = saturate((blurred - params.evaporationRate)); textureStore(newState, _arg_0.gid.xy, vec4f(newColor, 1f)); } @@ -156,7 +156,7 @@ describe('slime mold example', () => { var sensorPos = (pos + (sensorDir * params.sensorDistance)); var dims = textureDimensions(oldState); var dimsf = vec2f(dims); - var sensorPosInt = vec2u(clamp(sensorPos, vec2f(), (dimsf - vec2f(1)))); + var sensorPosInt = vec2u(clamp(sensorPos, vec2f(), (dimsf - 1f))); var color = textureLoad(oldState, sensorPosInt).rgb; return ((color.x + color.y) + color.z); } @@ -200,10 +200,10 @@ describe('slime mold example', () => { } } var dir = vec2f(cos(angle), sin(angle)); - var newPos = ((*agent).position + (dir * (params.moveSpeed * deltaTime))); + var newPos = ((*agent).position + ((dir * params.moveSpeed) * deltaTime)); var dimsf = vec2f(dims); if (((((newPos.x < 0f) || (newPos.x > dimsf.x)) || (newPos.y < 0f)) || (newPos.y > dimsf.y))) { - newPos = clamp(newPos, vec2f(), (dimsf - vec2f(1))); + newPos = clamp(newPos, vec2f(), (dimsf - 1f)); if (((newPos.x <= 0f) || (newPos.x >= (dimsf.x - 1f)))) { angle = (3.141592653589793f - angle); } @@ -214,7 +214,7 @@ describe('slime mold example', () => { } agentsData[_arg_0.gid.x] = Agent(newPos, angle); var oldState_1 = textureLoad(oldState, vec2u(newPos)).rgb; - var newState = (oldState_1 + vec3f(1)); + var newState = (oldState_1 + 1f); textureStore(newState_1, vec2u(newPos), vec4f(newState, 1f)); } diff --git a/packages/typegpu/tests/examples/individual/smoky-triangle.test.ts b/packages/typegpu/tests/examples/individual/smoky-triangle.test.ts index c5251d3c79..e1e77f7aca 100644 --- a/packages/typegpu/tests/examples/individual/smoky-triangle.test.ts +++ b/packages/typegpu/tests/examples/individual/smoky-triangle.test.ts @@ -116,7 +116,7 @@ describe('smoky triangle', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { diff --git a/packages/typegpu/tests/examples/individual/stable-fluid.test.ts b/packages/typegpu/tests/examples/individual/stable-fluid.test.ts index 040a569566..275555054d 100644 --- a/packages/typegpu/tests/examples/individual/stable-fluid.test.ts +++ b/packages/typegpu/tests/examples/individual/stable-fluid.test.ts @@ -94,7 +94,7 @@ describe('stable-fluid example', () => { let viscosity = simParams.viscosity; let diffuseRate = (viscosity * timeStep); let blendFactor = (1f / (4f + diffuseRate)); - var diffusedVal = (vec4f(blendFactor) * (((leftVal + rightVal) + (upVal + downVal)) + (diffuseRate * centerVal))); + var diffusedVal = (vec4f(blendFactor) * ((((leftVal + rightVal) + upVal) + downVal) + (centerVal * diffuseRate))); textureStore(out, pixelPos, diffusedVal); } @@ -215,7 +215,7 @@ describe('stable-fluid example', () => { let timeStep = simParams.dt; var prevPos = (vec2f(pixelPos) - (timeStep * velocity)); var clampedPos = clamp(prevPos, vec2f(-0.5), (vec2f(texSize.xy) - vec2f(0.5))); - var normalizedPos = ((clampedPos + vec2f(0.5)) / vec2f(texSize.xy)); + var normalizedPos = ((clampedPos + 0.5f) / vec2f(texSize.xy)); var inkVal = textureSampleLevel(src, linSampler, normalizedPos, 0); textureStore(dst, pixelPos, inkVal); } diff --git a/packages/typegpu/tests/examples/individual/vaporrave.test.ts b/packages/typegpu/tests/examples/individual/vaporrave.test.ts index c39d076d81..467d77903b 100644 --- a/packages/typegpu/tests/examples/individual/vaporrave.test.ts +++ b/packages/typegpu/tests/examples/individual/vaporrave.test.ts @@ -138,7 +138,7 @@ describe('vaporrave example', () => { } fn quinticInterpolationImpl(t: vec3f) -> vec3f { - return ((t * (t * t)) * ((t * ((t * 6f) - 15f)) + 10f)); + return (((t * t) * t) * ((t * ((t * 6f) - 15f)) + 10f)); } fn sample(pos: vec3f) -> f32 { @@ -203,7 +203,7 @@ describe('vaporrave example', () => { var p = ((rd * distOrigin) + ro); var scene = getSceneRay(p); var sphereDist = getSphere(p, sphereColorUniform, vec3f(0, 6, 12), sphereAngleUniform); - glow = ((sphereColorUniform * exp(-(sphereDist.dist))) + glow); + glow += (sphereColorUniform * exp(-(sphereDist.dist))); distOrigin += scene.dist; if ((distOrigin > 19f)) { result.dist = 19f; From 3dbe69bd7d2fc4c0933b678184720a403596f2fe Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 12:00:13 +0100 Subject: [PATCH 18/23] vecBase and matBase --- .../typegpu-noise/src/perlin-2d/algorithm.ts | 8 ++-- .../typegpu-noise/src/perlin-3d/algorithm.ts | 4 +- packages/typegpu-noise/src/utils.ts | 41 ++++++------------- packages/typegpu/src/data/index.ts | 2 + packages/typegpu/src/data/wgslTypes.ts | 21 +++++++--- 5 files changed, 36 insertions(+), 40 deletions(-) diff --git a/packages/typegpu-noise/src/perlin-2d/algorithm.ts b/packages/typegpu-noise/src/perlin-2d/algorithm.ts index c84cf39e8f..c5e6ddabc4 100644 --- a/packages/typegpu-noise/src/perlin-2d/algorithm.ts +++ b/packages/typegpu-noise/src/perlin-2d/algorithm.ts @@ -1,7 +1,7 @@ import tgpu, { d } from 'typegpu'; import { dot, floor, fract } from 'typegpu/std'; import { randOnUnitCircle, randSeed2 } from '../random.ts'; -import { quinticDerivative2, quinticInterpolation2 } from '../utils.ts'; +import { quinticDerivative, quinticInterpolation } from '../utils.ts'; export const computeJunctionGradient = tgpu.fn([d.vec2i], d.vec2f)((pos) => { 'use gpu'; @@ -21,7 +21,7 @@ export const sample = tgpu.fn([d.vec2f], d.f32)((pos) => { const i = d.vec2i(floor(pos)); const f = fract(pos); - const u = quinticInterpolation2(f); + const u = quinticInterpolation(f); const ga = getJunctionGradientSlot.$(i); const gb = getJunctionGradientSlot.$(i + d.vec2i(1, 0)); @@ -50,8 +50,8 @@ export const sampleWithGradient = tgpu.fn([d.vec2f], d.vec3f)((pos) => { const i = d.vec2i(floor(pos)); const f = fract(pos); - const u = quinticInterpolation2(f); - const du = quinticDerivative2(f); + const u = quinticInterpolation(f); + const du = quinticDerivative(f); const ga = getJunctionGradientSlot.$(i); const gb = getJunctionGradientSlot.$(i + d.vec2i(1, 0)); diff --git a/packages/typegpu-noise/src/perlin-3d/algorithm.ts b/packages/typegpu-noise/src/perlin-3d/algorithm.ts index 6c93ebdf97..11365f969a 100644 --- a/packages/typegpu-noise/src/perlin-3d/algorithm.ts +++ b/packages/typegpu-noise/src/perlin-3d/algorithm.ts @@ -2,7 +2,7 @@ import tgpu from 'typegpu'; import * as d from 'typegpu/data'; import { dot, floor, mix } from 'typegpu/std'; import { randOnUnitSphere, randSeed3 } from '../random.ts'; -import { quinticInterpolation3 } from '../utils.ts'; +import { quinticInterpolation } from '../utils.ts'; export const computeJunctionGradient = tgpu.fn([d.vec3i], d.vec3f)((pos) => { 'use gpu'; @@ -33,7 +33,7 @@ export const sample = tgpu.fn([d.vec3f], d.f32)((pos) => { const XYZ = dotProdGrid(pos, minJunction + d.vec3f(1, 1, 1)); const partial = pos - minJunction; - const smoothPartial = quinticInterpolation3(partial); + const smoothPartial = quinticInterpolation(partial); // Resolving the z-axis into a xy-slice const xy = mix(xyz, xyZ, smoothPartial.z); diff --git a/packages/typegpu-noise/src/utils.ts b/packages/typegpu-noise/src/utils.ts index 6f338ac127..905fa09e33 100644 --- a/packages/typegpu-noise/src/utils.ts +++ b/packages/typegpu-noise/src/utils.ts @@ -1,4 +1,4 @@ -import tgpu, { d } from 'typegpu'; +import type { d } from 'typegpu'; export type Prettify = & { @@ -10,38 +10,23 @@ export type PrefixKeys = { [K in keyof T as K extends string ? `${Prefix}${K}` : K]: T[K]; }; -function quinticInterpolationImpl(t: T): T { - 'use gpu'; - return t * t * t * (t * (t * 6 - 15) + 10) as T; -} - -/** - * Works as a replacement for smoothstep, but with a continuous - * second derivative, which in e.g. smooth normals - */ -export const quinticInterpolation2 = tgpu - .fn([d.vec2f], d.vec2f)(quinticInterpolationImpl); - /** * Works as a replacement for smoothstep, but with a continuous * second derivative, which in e.g. smooth normals */ -export const quinticInterpolation3 = tgpu - .fn([d.vec3f], d.vec3f)(quinticInterpolationImpl); - -const quinticDerivativeImpl = (t: T): T => { +export function quinticInterpolation(t: d.v2f): d.v2f; +export function quinticInterpolation(t: d.v3f): d.v3f; +export function quinticInterpolation(t: d.vecBase): d.vecBase { 'use gpu'; - return (30 * t * t * (t * (t - 2)) + 1) as T; -}; - -/** - * Derivative of {@link quinticInterpolation2} - */ -export const quinticDerivative2 = tgpu - .fn([d.vec2f], d.vec2f)(quinticDerivativeImpl); + return t * t * t * (t * (t * 6 - 15) + 10); +} /** - * Derivative of {@link quinticInterpolation3} + * Derivative of {@link quinticInterpolation} */ -export const quinticDerivative3 = tgpu - .fn([d.vec3f], d.vec3f)(quinticDerivativeImpl); +export function quinticDerivative(t: d.v2f): d.v2f; +export function quinticDerivative(t: d.v3f): d.v3f; +export function quinticDerivative(t: d.vecBase): d.vecBase { + 'use gpu'; + return 30 * t * t * (t * (t - 2)) + 1; +} diff --git a/packages/typegpu/src/data/index.ts b/packages/typegpu/src/data/index.ts index 548bb1bb10..34c1745df6 100644 --- a/packages/typegpu/src/data/index.ts +++ b/packages/typegpu/src/data/index.ts @@ -75,6 +75,7 @@ export type { Mat2x2f, Mat3x3f, Mat4x4f, + matBase, Ptr, Size, StorableData, @@ -107,6 +108,7 @@ export type { Vec4h, Vec4i, Vec4u, + vecBase, WgslArray, WgslStruct, } from './wgslTypes.ts'; diff --git a/packages/typegpu/src/data/wgslTypes.ts b/packages/typegpu/src/data/wgslTypes.ts index 19770bf441..d1c65a2d2c 100644 --- a/packages/typegpu/src/data/wgslTypes.ts +++ b/packages/typegpu/src/data/wgslTypes.ts @@ -57,7 +57,7 @@ export interface NumberArrayView { * These functions are not defined on vectors, * but are instead assigned to `VecBase` after both `data` and `std` are initialized. */ -export interface vecInfixNotation { +export interface vecInfixNotation { add(other: T | number): T; sub(other: T | number): T; mul(other: mBaseForVec | T | number): T; @@ -79,7 +79,7 @@ export interface vecInfixNotation { * These functions are not defined on matrices, * but are instead assigned to `MatBase` after both `data` and `std` are initialized. */ -export interface matInfixNotation { +export interface matInfixNotation { add(other: T): T; sub(other: T): T; mul(other: T | number): T; @@ -181,6 +181,10 @@ type Tuple2 = [S, S]; type Tuple3 = [S, S, S]; type Tuple4 = [S, S, S, S]; +export interface vecBase extends vecInfixNotation { + readonly [$internal]: true; +} + /** * Interface representing its WGSL vector type counterpart: vec2f or vec2. * A vector with 2 elements of type f32 @@ -476,6 +480,10 @@ export type AnyVecInstance = export type VecKind = AnyVecInstance['kind']; +export interface matBase extends matInfixNotation { + readonly [$internal]: true; +} + /** * Interface representing its WGSL matrix type counterpart: mat2x2 * A matrix with 2 rows and 2 columns, with elements of type `TColumn` @@ -543,14 +551,15 @@ export interface m4x4f extends mat4x4, matInfixNotation { export type AnyMatInstance = m2x2f | m3x3f | m4x4f; -export type vBaseForMat = T extends m2x2f ? v2f +export type vBaseForMat = T extends m2x2f ? v2f : T extends m3x3f ? v3f - : v4f; + : T extends m4x4f ? v4f + : vecBase; -export type mBaseForVec = T extends v2f ? m2x2f +export type mBaseForVec = T extends v2f ? m2x2f : T extends v3f ? m3x3f : T extends v4f ? m4x4f - : never; + : matBase; // #endregion From 7e9651c1442afab37c52a806f15f952cac4bcbce Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Sat, 21 Feb 2026 16:34:21 +0100 Subject: [PATCH 19/23] docs: "Pizze Pie Chart" example --- .../rendering/pizza-pie-chart/index.html | 1 + .../rendering/pizza-pie-chart/index.ts | 356 ++++++++++++++++++ .../rendering/pizza-pie-chart/meta.json | 12 + .../rendering/pizza-pie-chart/thumbnail.png | Bin 0 -> 514140 bytes .../rendering/pizza-pie-chart/types.ts | 23 ++ 5 files changed, 392 insertions(+) create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.html create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/meta.json create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/thumbnail.png create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/types.ts diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.html b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.html new file mode 100644 index 0000000000..581d6789f8 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.html @@ -0,0 +1 @@ + diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts new file mode 100644 index 0000000000..e1de5e30b6 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts @@ -0,0 +1,356 @@ +import * as sdf from '@typegpu/sdf'; +import tgpu, { common, d, std } from 'typegpu'; +import { Camera, setupOrbitCamera } from '../../common/setup-orbit-camera.ts'; +import { Ray } from './types.ts'; +import { perlin2d, perlin3d } from '@typegpu/noise'; +import { mat3x3f } from 'typegpu/data'; + +const root = await tgpu.init(); +const canvas = document.querySelector('canvas') as HTMLCanvasElement; +const context = root.configureContext({ canvas, alphaMode: 'premultiplied' }); +const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); + +const time = root.createUniform(d.f32); +const resolution = root.createUniform(d.vec2f); +const cameraUniform = root.createUniform(Camera); + +const MAX_STEPS = 1000; +const MAX_DIST = 30; +const SURF_DIST = 0.001; + +const skyColor = d.vec4f(0.7, 0.8, 0.9, 1); + +// Structure to hold both distance and color +type Shape = d.InferGPU; +const Shape = d.struct({ + color: d.vec3f, + dist: d.f32, +}); + +const checkerBoard = (uv: d.v2f): number => { + 'use gpu'; + const fuv = std.floor(uv); + return std.abs(fuv.x + fuv.y) % 2; +}; + +const smoothShapeUnion = (a: Shape, b: Shape, k: number): Shape => { + 'use gpu'; + const h = std.max(k - std.abs(a.dist - b.dist), 0) / k; + const m = h * h; + + // Smooth min for distance + const dist = std.min(a.dist, b.dist) - m * k * (1 / d.f32(4)); + + // Blend colors based on relative distances and smoothing + const weight = m + std.select(0, 1 - m, a.dist > b.dist); + const color = std.mix(a.color, b.color, weight); + + return Shape({ dist, color }); +}; + +const shapeUnion = (a: Shape, b: Shape) => { + 'use gpu'; + return Shape({ + color: std.select(a.color, b.color, a.dist > b.dist), + dist: std.min(a.dist, b.dist), + }); +}; + +const sdRing = (_p: d.v2f, n: d.v2f, r: number, th: number): number => { + 'use gpu'; + let p = d.vec2f(_p); + p.x = std.abs(p.x); + p = d.mat2x2f(n.x, n.y, -n.y, n.x) * p; + return std.max( + std.abs(std.length(p) - r) - th * 0.5, + std.length(d.vec2f(p.x, std.max(0.0, std.abs(r - p.y) - th * 0.5))) * + std.sign(p.x), + ); +}; + +const PIE = { + baseHalfHeight: 0.005, + cheeseHalfHeight: 0.005, + radius: 0.5, + baseRoundness: 0.01, + cheeseRoundness: 0.0025, +}; + +const sdPizzaCheese = (p: d.v3f, angle: number): Shape => { + 'use gpu'; + const pieBase2d = sdf.sdPie( + p.xz, + d.vec2f(std.sin(angle / 2), std.cos(angle / 2)), + PIE.radius * 0.9, + ) + PIE.cheeseRoundness; + + let pieBaseSd = sdf.opExtrudeY( + p - d.vec3f(0, PIE.baseHalfHeight + 0.01, 0), + pieBase2d, + PIE.cheeseHalfHeight, + ) - PIE.cheeseRoundness; + + const cheeseAngle1 = angle / 2 + 0.4; + const cheeseStrings2d = std.min( + sdRing( + p.xz, + d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), + PIE.radius * 0.3 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, + 0.05, + ), + sdRing( + p.xz, + d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), + PIE.radius * 0.6 + perlin2d.sample(p.xz * 2 + angle) * 0.2, + 0.05, + ), + sdf.sdDisk( + p.xz, + PIE.radius * 0.2 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, + ), + ); + + pieBaseSd = sdf.opSmoothUnion( + pieBaseSd, + sdf.opExtrudeY( + p - d.vec3f(0, PIE.baseHalfHeight, 0), + cheeseStrings2d, + PIE.cheeseHalfHeight * 0.3, + ), + 0.02, + ); + + const pieBase = Shape({ + dist: pieBaseSd + perlin3d.sample(p * 5) * 0.01, + color: d.vec3f(1, 0.95, 0.7), + }); + + return pieBase; +}; + +const sdPizzaCrust = (p: d.v3f, angle: number): Shape => { + 'use gpu'; + const pieBase2d = sdf.sdPie( + p.xz - d.vec2f(0, 0.005), + d.vec2f(std.sin(angle / 2), std.cos(angle / 2)), + PIE.radius, + ) + PIE.baseRoundness; + const crust2d = sdRing( + p.xz, + d.vec2f(std.cos(angle / 2 - 0.05), std.sin(angle / 2 - 0.05)), + PIE.radius, + 0.05, + ); + const pieBase = Shape({ + dist: sdf.opExtrudeY(p, pieBase2d, PIE.baseHalfHeight) - PIE.baseRoundness, + color: d.vec3f(0), + }); + + const crustOffset = perlin3d.sample(p * 10) * 0.02; + const crust = Shape({ + dist: sdf.opExtrudeY( + p - d.vec3f(0, crustOffset, 0), + crust2d, + PIE.baseHalfHeight * 5, + ) - 0.01, + color: d.vec3f(0.6, 0.4, 0.3) * (1 - crustOffset * 10), + }); + + return smoothShapeUnion(pieBase, crust, 0.1); +}; + +/** + * Returns a transformation matrix that represents an `angle` rotation + * in the XZ plane (around the Y axis) + */ +const rotateXZ = tgpu.fn([d.f32], d.mat3x3f)((angle) => + d.mat3x3f( + /* right */ d.vec3f(std.cos(angle), 0, std.sin(angle)), + /* up */ d.vec3f(0, 1, 0), + /* forward */ d.vec3f(-std.sin(angle), 0, std.cos(angle)), + ) +); + +const getMorphingShape = (p: d.v3f, t: number): Shape => { + 'use gpu'; + // Center position + const center = d.vec3f(0, PIE.baseHalfHeight, 0); + const localP = std.sub(p, center); + + const a1 = 3 * Math.PI / 2; + const p1 = localP; + const p2 = localP * d.vec3f(-1, 1, -1) - + d.vec3f(0, 0, std.abs(std.sin(t * 2)) * 0.1); + const a2 = Math.PI / 2; + + const pizzaCrust = shapeUnion(sdPizzaCrust(p1, a1), sdPizzaCrust(p2, a2)); + const pizzaCheese = smoothShapeUnion( + sdPizzaCheese(p1, a1), + sdPizzaCheese(p2, a2), + 0.02, + ); + return shapeUnion(pizzaCrust, pizzaCheese); +}; + +const getSceneDist = (p: d.v3f): Shape => { + 'use gpu'; + const shape = getMorphingShape(p, time.$); + const floor = Shape({ + dist: sdf.sdPlane(p, d.vec3f(0, 1, 0), 0), + color: std.mix( + d.vec3f(1), + d.vec3f(0.2), + checkerBoard(std.mul(p.xz, 2)), + ), + }); + + return shapeUnion(shape, floor); +}; + +const rayMarch = (ro: d.v3f, rd: d.v3f): Shape => { + 'use gpu'; + let dO = d.f32(0); + const result = Shape({ + dist: d.f32(MAX_DIST), + color: d.vec3f(0, 0, 0), + }); + + for (let i = 0; i < MAX_STEPS; i++) { + const p = ro.add(rd.mul(dO)); + const scene = getSceneDist(p); + dO += scene.dist; + + if (dO > MAX_DIST || scene.dist < SURF_DIST) { + result.dist = dO; + result.color = d.vec3f(scene.color); + break; + } + } + + return result; +}; + +const softShadow = ( + ro: d.v3f, + rd: d.v3f, + minT: number, + maxT: number, + k: number, +): number => { + 'use gpu'; + let res = d.f32(1); + let t = minT; + + for (let i = 0; i < 100; i++) { + if (t >= maxT) break; + const h = getSceneDist(ro.add(rd.mul(t))).dist; + if (h < 0.001) return 0; + res = std.min(res, k * h / t); + t += std.max(h, 0.001); + } + + return res; +}; + +const getNormal = (p: d.v3f): d.v3f => { + 'use gpu'; + const dist = getSceneDist(p).dist; + const e = 0.01; + + const n = d.vec3f( + getSceneDist(p.add(d.vec3f(e, 0, 0))).dist - dist, + getSceneDist(p.add(d.vec3f(0, e, 0))).dist - dist, + getSceneDist(p.add(d.vec3f(0, 0, e))).dist - dist, + ); + + return std.normalize(n); +}; + +const getRayForUV = (uv: d.v2f) => { + 'use gpu'; + const camera = cameraUniform.$; + const ndc = uv.mul(2).sub(1).mul(d.vec2f(1, -1)); + const farView = camera.projectionInverse.mul(d.vec4f(ndc.xy, 1, 1)); + const farWorld = camera.viewInverse.mul( + d.vec4f(farView.xyz.div(farView.w), 1), + ); + const direction = std.normalize(farWorld.xyz.sub(camera.position.xyz)); + return Ray({ origin: camera.position.xyz, direction }); +}; + +const fragmentMain = tgpu.fragmentFn({ + in: { uv: d.vec2f }, + out: d.vec4f, +})(({ uv }) => { + 'use gpu'; + const ray = getRayForUV(uv); + + // Ray origin and direction + const march = rayMarch(ray.origin, ray.direction); + + const fog = std.min(march.dist / MAX_DIST, 1) ** 0.7; + + const p = ray.origin + ray.direction * march.dist; + const n = getNormal(p); + + // Lighting with orbiting light + const l = std.normalize(d.vec3f(0.5, 1, -0.2)); + const diff = std.max(std.dot(n, l), 0); + + // Soft shadows + const shadowRo = p; + const shadowRd = l; + const shadowDist = 4; // approximate + const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); + + // Combine lighting with shadows and color + const litColor = march.color.mul(diff); + const finalColor = std.mix( + std.mul(litColor, 0.5), // Shadow color + litColor, // Lit color + shadow, + ); + + return std.mix(d.vec4f(finalColor, 1), skyColor, fog); +}); + +const cameraResult = setupOrbitCamera( + canvas, + { initPos: d.vec4f(2, 2, 2, 1), maxZoom: 4, minZoom: 1 }, + (newProps) => cameraUniform.writePartial(newProps), +); + +const perlinCache2d = perlin2d.staticCache({ root, size: d.vec2u(16, 16) }); +const perlinCache3d = perlin3d.staticCache({ root, size: d.vec3u(16, 16, 16) }); +const renderPipeline = root + .pipe(perlinCache2d.inject()) + .pipe(perlinCache3d.inject()) + .createRenderPipeline({ + vertex: common.fullScreenTriangle, + fragment: fragmentMain, + targets: { format: presentationFormat }, + }); + +let animationFrame: number; +function run(timestamp: number) { + time.write(timestamp / 1000 % 1000); + resolution.write(d.vec2f(canvas.width, canvas.height)); + + renderPipeline + .withColorAttachment({ + view: context.getCurrentTexture().createView(), + loadOp: 'clear', + storeOp: 'store', + }) + .draw(3); + + animationFrame = requestAnimationFrame(run); +} + +animationFrame = requestAnimationFrame(run); + +export function onCleanup() { + cancelAnimationFrame(animationFrame); + cameraResult.cleanupCamera(); + root.destroy(); +} diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/meta.json b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/meta.json new file mode 100644 index 0000000000..cfd65212d1 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/meta.json @@ -0,0 +1,12 @@ +{ + "title": "Pizza Pie Chart", + "category": "rendering", + "tags": [ + "experimental", + "fragment shader", + "shadows", + "sdf", + "ray marching", + "sphere tracing" + ] +} diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/thumbnail.png b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b59360abfcc7ce246a66f4e061d2c1917dbf3b GIT binary patch literal 514140 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

H8S%R{9lNj#RpGAwaGjKWr$O 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�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�+FoLhlE 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

Z3+LVi%Cequ-kDnn0 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 z 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%0D%e6u0T{vBWAODI4=JTn|KSex;Ec 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

NIc;kgh4@x~38iI*>OIGR2vjF4G@-@_I z`|fvu-y8ZBO|?*)XVpApay^ePOQ~<%P1e(CzKL%8{Su@{Ss*IT91&VVlGr#g;9HTM zd_r8J%9ECTCpJDMQ}}yHrQjdB6BwFrzcO|x_u&tbIa;E*?A5-*_9>QHWl=F*iL4uh zGWqa&w$4nv5?gRKvx3L{d6nDF7)Lp<4T>UZSKz5(=Q+qAMc_Id(`zsW6{@NO-IEL` z#0U-q<|_8zTRhErSsAT=eo`xj5%yW8_gvTpk)gY0U{drV?b!6+z%mE zwF!>phY&Ah*jvRf9ci_E*1H?GGU+wcQ-ff}#$Bks*FnXC>(jME%xyt3Q8sXwfBL?) zQ(QsyN4|`7j71>PBd%Ie`Ie^Mid8w8YZ2<}EM$KC#&`SkbOhAf8=Kf5u?|B|3U8!p z+^RnV^J-GGqTm|YPA7tf%Wasi^Uv|m3`^atfbHSrYV94#DGFx?P+jDvS4(HRT7yZWY&aTpFDmX^r5l(1hrNRjquN0Ax544Vgmi5NW}J z<>5Q3iMU1)ROIS1v0cjtKlmChlg4{TC|e~L#LFSH_Ob{D#Isc1AC|5e<@C#Lj`FbC7SXQn$E53 zL!n^g`iG4qmfmvp=fEBj7q;cb#PU+{t02>>(jgB z%a7_5Cv*U9zzUmT~2K~E=-?Rq8@hBtaQ`V`BuvTAt>u0yr%wTB?}^WtYSLd z{~>j(9Apu#MUy?AQ^+p6zBx-&*O8XCvkBj!QP7fDX?^cJsDyl8OtPuZqnF|zK|4VI z$Ydo#~6=Nb9`kR9lGv z1Ef_MLagOAqVIyJ(5S8Va={?Q_#=W&Hj)qMqMVpYReUo&^JY}<2n%M8+p!_$a<2W;v;QFMaKX1PLBfRbj%anFK zO$1*pMzE-jivWTGUPwiPuyh79F zZ))EcYkUvxwy=**2=R;u&`gdrr^E9z(vbI>)i5OhP6o)X(`UMSf0!2nIYE;y_P)YtVZ&=bdy(fCjpQ zDCf42H@tH8GWX|$2~OpRl;GY)C$D0GXF`ELIH8%yEbIn)`f=P;Y~FK;58?`R9pq#G zfrotn7a6PTfs8@wu*sze^-JJ|{S!pZI9P$MeOqmv`Q?$_2BR%XnoXsB=M;4aoZeeA%|aSV0M4h?Mek!v}FPH((>`>D)0+JgaTHT_@mDVVK`B|5$>=v-Vn zX}>_^&imFl`Lm@zk|{ciG2L|c{d=yRmX2@TD!XjtoPV3;n4nEGVh6%BmndYT8fVLyWiBho(GhXk1806nPYJv2cmu^IX z!6Vn(=|-Nf%TtB0BR3Fd+=C%Wkmx}+8hDFxUTr^*k0a?-A6Z0VkFxJO=~MXjX>Op< zyaO)p|Iy|7T;4gk=^5{Ru`*UkP!lJMgkK}xjq>-4!?;SWB#E)}?9mxAM_vkgcAgh! zU%dvj`pAsjoS1akpA&(&gio$>SMf^p}DS5-SFD80!;tSu9i?d4%Y}@l!=io zE}48#-oAh%vB&f)e8tSNqOgu

PulQj?7IPwZqu(FC11)>AC}iAcjM!oaJ*tc~kD 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 Kjz+OMCip*9)F3wi literal 0 HcmV?d00001 diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/types.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/types.ts new file mode 100644 index 0000000000..e7161340b8 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/types.ts @@ -0,0 +1,23 @@ +import { d } from 'typegpu'; + +export const Ray = d.struct({ + origin: d.vec3f, + direction: d.vec3f, +}); + +export const Light = d.struct({ + position: d.vec3f, + color: d.vec3f, +}); + +export const Material = d.struct({ + albedo: d.vec3f, + metallic: d.f32, + roughness: d.f32, + ao: d.f32, +}); + +export const BloomParams = d.struct({ + threshold: d.f32, + intensity: d.f32, +}); From 2e97b7c01327ecfed2050aabf1ed44d582956b6e Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 14:56:54 +0100 Subject: [PATCH 20/23] Better cheese pull --- .../rendering/pizza-pie-chart/index.ts | 100 ++++++++++++------ 1 file changed, 65 insertions(+), 35 deletions(-) diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts index e1de5e30b6..4589a4787b 100644 --- a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts @@ -74,6 +74,24 @@ const PIE = { radius: 0.5, baseRoundness: 0.01, cheeseRoundness: 0.0025, + + stringDomain: 0.06, + stringHalfWidth: 0.012, + stringThickness: 0.002, +}; + +const sdPizzaCheeseStrings = (p: d.v3f): Shape => { + 'use gpu'; + let dp = rotateXZ(0.5) * p; + dp += perlin2d.sample(p.xz * 10) * 0.05; + const mp = (std.fract(dp.xz / PIE.stringDomain) - 0.5) * PIE.stringDomain; + const linesSd = std.min(std.abs(mp.x), std.abs(mp.y)) - PIE.stringHalfWidth; + const cutLines = std.max(linesSd, sdf.sdDisk(p.xz, PIE.radius * 0.8)); + + return Shape({ + dist: sdf.opExtrudeY(p, cutLines, 0) - PIE.stringThickness, + color: d.vec3f(1, 0.95, 0.7), + }); }; const sdPizzaCheese = (p: d.v3f, angle: number): Shape => { @@ -90,35 +108,35 @@ const sdPizzaCheese = (p: d.v3f, angle: number): Shape => { PIE.cheeseHalfHeight, ) - PIE.cheeseRoundness; - const cheeseAngle1 = angle / 2 + 0.4; - const cheeseStrings2d = std.min( - sdRing( - p.xz, - d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), - PIE.radius * 0.3 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, - 0.05, - ), - sdRing( - p.xz, - d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), - PIE.radius * 0.6 + perlin2d.sample(p.xz * 2 + angle) * 0.2, - 0.05, - ), - sdf.sdDisk( - p.xz, - PIE.radius * 0.2 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, - ), - ); - - pieBaseSd = sdf.opSmoothUnion( - pieBaseSd, - sdf.opExtrudeY( - p - d.vec3f(0, PIE.baseHalfHeight, 0), - cheeseStrings2d, - PIE.cheeseHalfHeight * 0.3, - ), - 0.02, - ); + // const cheeseAngle1 = angle / 2 + 0.4; + // const cheeseStrings2d = std.min( + // sdRing( + // p.xz, + // d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), + // PIE.radius * 0.3 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, + // 0.05, + // ), + // sdRing( + // p.xz, + // d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), + // PIE.radius * 0.6 + perlin2d.sample(p.xz * 2 + angle) * 0.2, + // 0.05, + // ), + // sdf.sdDisk( + // p.xz, + // PIE.radius * 0.2 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, + // ), + // ); + + // pieBaseSd = sdf.opSmoothUnion( + // pieBaseSd, + // sdf.opExtrudeY( + // p - d.vec3f(0, PIE.baseHalfHeight, 0), + // cheeseStrings2d, + // PIE.cheeseHalfHeight * 0.3, + // ), + // 0.02, + // ); const pieBase = Shape({ dist: pieBaseSd + perlin3d.sample(p * 5) * 0.01, @@ -183,13 +201,24 @@ const getMorphingShape = (p: d.v3f, t: number): Shape => { d.vec3f(0, 0, std.abs(std.sin(t * 2)) * 0.1); const a2 = Math.PI / 2; + const pull = d.vec3f(0, 0, std.abs(std.sin(t * 2)) * 0.1); + const pizzaCrust = shapeUnion(sdPizzaCrust(p1, a1), sdPizzaCrust(p2, a2)); - const pizzaCheese = smoothShapeUnion( + let pizzaCheese = smoothShapeUnion( sdPizzaCheese(p1, a1), sdPizzaCheese(p2, a2), 0.02, ); + let stringP = d.vec3f(localP); + stringP += std.max(0, -std.dot(stringP, pull)) ** 0.75 * pull * 5; + pizzaCheese = smoothShapeUnion( + pizzaCheese, + sdPizzaCheeseStrings(stringP), + 0.03, + ); return shapeUnion(pizzaCrust, pizzaCheese); + // return sdPizzaCheeseStrings(stringP); + // return sdPizzaCheeseStrings(localP - d.vec3f(0, 0.1, 0)); }; const getSceneDist = (p: d.v3f): Shape => { @@ -298,10 +327,11 @@ const fragmentMain = tgpu.fragmentFn({ const diff = std.max(std.dot(n, l), 0); // Soft shadows - const shadowRo = p; - const shadowRd = l; - const shadowDist = 4; // approximate - const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); + // const shadowRo = p; + // const shadowRd = l; + // const shadowDist = 4; // approximate + // const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); + const shadow = 1; // Combine lighting with shadows and color const litColor = march.color.mul(diff); @@ -316,7 +346,7 @@ const fragmentMain = tgpu.fragmentFn({ const cameraResult = setupOrbitCamera( canvas, - { initPos: d.vec4f(2, 2, 2, 1), maxZoom: 4, minZoom: 1 }, + { initPos: d.vec4f(0.1, 4, 0, 1), maxZoom: 4, minZoom: 1 }, (newProps) => cameraUniform.writePartial(newProps), ); From d886a5f6f4abff8c860a713738d7e812271245d0 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 17:04:04 +0100 Subject: [PATCH 21/23] PBR --- .../rendering/pizza-pie-chart/constants.ts | 18 +++ .../rendering/pizza-pie-chart/index.ts | 144 ++++++++++-------- .../examples/rendering/pizza-pie-chart/pbr.ts | 117 ++++++++++++++ 3 files changed, 213 insertions(+), 66 deletions(-) create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/constants.ts create mode 100644 apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/pbr.ts diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/constants.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/constants.ts new file mode 100644 index 0000000000..6e91a19a25 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/constants.ts @@ -0,0 +1,18 @@ +export const MAX_STEPS = 48; +export const MAX_DIST = 5; +export const SURF_DIST = 0.001; +export const PI = Math.PI; +export const BLUR_RADIUS = 8; +export const TAA_BLEND = 0.85; + +export function halton(index: number, base: number): number { + let result = 0; + let f = 1 / base; + let i = index; + while (i > 0) { + result += f * (i % base); + i = Math.floor(i / base); + f /= base; + } + return result; +} diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts index 4589a4787b..49f20d0581 100644 --- a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts @@ -1,9 +1,9 @@ import * as sdf from '@typegpu/sdf'; import tgpu, { common, d, std } from 'typegpu'; import { Camera, setupOrbitCamera } from '../../common/setup-orbit-camera.ts'; -import { Ray } from './types.ts'; +import { Material, Ray } from './types.ts'; import { perlin2d, perlin3d } from '@typegpu/noise'; -import { mat3x3f } from 'typegpu/data'; +import { shade, SUN } from './pbr.ts'; const root = await tgpu.init(); const canvas = document.querySelector('canvas') as HTMLCanvasElement; @@ -23,7 +23,7 @@ const skyColor = d.vec4f(0.7, 0.8, 0.9, 1); // Structure to hold both distance and color type Shape = d.InferGPU; const Shape = d.struct({ - color: d.vec3f, + material: Material, dist: d.f32, }); @@ -43,15 +43,27 @@ const smoothShapeUnion = (a: Shape, b: Shape, k: number): Shape => { // Blend colors based on relative distances and smoothing const weight = m + std.select(0, 1 - m, a.dist > b.dist); - const color = std.mix(a.color, b.color, weight); + const albedo = std.mix(a.material.albedo, b.material.albedo, weight); + const ao = std.mix(a.material.ao, b.material.ao, weight); + const metallic = std.mix(a.material.metallic, b.material.metallic, weight); + const roughness = std.mix(a.material.roughness, b.material.roughness, weight); - return Shape({ dist, color }); + return Shape({ + dist, + material: { albedo, ao, metallic, roughness }, + }); }; const shapeUnion = (a: Shape, b: Shape) => { 'use gpu'; + // deno-fmt-ignore return Shape({ - color: std.select(a.color, b.color, a.dist > b.dist), + material: { + albedo: std.select(a.material.albedo, b.material.albedo, a.dist > b.dist), + ao: std.select(a.material.ao, b.material.ao, a.dist > b.dist), + metallic: std.select(a.material.metallic, b.material.metallic, a.dist > b.dist), + roughness: std.select(a.material.roughness, b.material.roughness, a.dist > b.dist), + }, dist: std.min(a.dist, b.dist), }); }; @@ -80,6 +92,20 @@ const PIE = { stringThickness: 0.002, }; +const cheeseMaterial = Material({ + albedo: d.vec3f(1, 0.9, 0.5), + ao: 1, + metallic: 0.0, + roughness: 0.1, +}); + +const crustMaterialBase = Material({ + albedo: d.vec3f(0.35, 0.2, 0.1), + ao: 1, + metallic: 0.0, + roughness: 1, +}); + const sdPizzaCheeseStrings = (p: d.v3f): Shape => { 'use gpu'; let dp = rotateXZ(0.5) * p; @@ -90,7 +116,7 @@ const sdPizzaCheeseStrings = (p: d.v3f): Shape => { return Shape({ dist: sdf.opExtrudeY(p, cutLines, 0) - PIE.stringThickness, - color: d.vec3f(1, 0.95, 0.7), + material: cheeseMaterial, }); }; @@ -102,45 +128,15 @@ const sdPizzaCheese = (p: d.v3f, angle: number): Shape => { PIE.radius * 0.9, ) + PIE.cheeseRoundness; - let pieBaseSd = sdf.opExtrudeY( + const pieBaseSd = sdf.opExtrudeY( p - d.vec3f(0, PIE.baseHalfHeight + 0.01, 0), pieBase2d, PIE.cheeseHalfHeight, ) - PIE.cheeseRoundness; - // const cheeseAngle1 = angle / 2 + 0.4; - // const cheeseStrings2d = std.min( - // sdRing( - // p.xz, - // d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), - // PIE.radius * 0.3 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, - // 0.05, - // ), - // sdRing( - // p.xz, - // d.vec2f(std.cos(cheeseAngle1), std.sin(cheeseAngle1)), - // PIE.radius * 0.6 + perlin2d.sample(p.xz * 2 + angle) * 0.2, - // 0.05, - // ), - // sdf.sdDisk( - // p.xz, - // PIE.radius * 0.2 + perlin2d.sample(p.xz * 2 + angle + 0.4) * 0.2, - // ), - // ); - - // pieBaseSd = sdf.opSmoothUnion( - // pieBaseSd, - // sdf.opExtrudeY( - // p - d.vec3f(0, PIE.baseHalfHeight, 0), - // cheeseStrings2d, - // PIE.cheeseHalfHeight * 0.3, - // ), - // 0.02, - // ); - const pieBase = Shape({ dist: pieBaseSd + perlin3d.sample(p * 5) * 0.01, - color: d.vec3f(1, 0.95, 0.7), + material: cheeseMaterial, }); return pieBase; @@ -159,19 +155,22 @@ const sdPizzaCrust = (p: d.v3f, angle: number): Shape => { PIE.radius, 0.05, ); + const crustMaterial = Material(crustMaterialBase); + const crustOffset = perlin3d.sample(p * 10) * 0.02; + crustMaterial.albedo *= 1 - crustOffset * 20; + const pieBase = Shape({ dist: sdf.opExtrudeY(p, pieBase2d, PIE.baseHalfHeight) - PIE.baseRoundness, - color: d.vec3f(0), + material: crustMaterial, }); - const crustOffset = perlin3d.sample(p * 10) * 0.02; const crust = Shape({ dist: sdf.opExtrudeY( p - d.vec3f(0, crustOffset, 0), crust2d, PIE.baseHalfHeight * 5, ) - 0.01, - color: d.vec3f(0.6, 0.4, 0.3) * (1 - crustOffset * 10), + material: crustMaterial, }); return smoothShapeUnion(pieBase, crust, 0.1); @@ -192,7 +191,7 @@ const rotateXZ = tgpu.fn([d.f32], d.mat3x3f)((angle) => const getMorphingShape = (p: d.v3f, t: number): Shape => { 'use gpu'; // Center position - const center = d.vec3f(0, PIE.baseHalfHeight, 0); + const center = d.vec3f(0, PIE.baseHalfHeight + 0.1, 0); const localP = std.sub(p, center); const a1 = 3 * Math.PI / 2; @@ -217,8 +216,6 @@ const getMorphingShape = (p: d.v3f, t: number): Shape => { 0.03, ); return shapeUnion(pizzaCrust, pizzaCheese); - // return sdPizzaCheeseStrings(stringP); - // return sdPizzaCheeseStrings(localP - d.vec3f(0, 0.1, 0)); }; const getSceneDist = (p: d.v3f): Shape => { @@ -226,11 +223,16 @@ const getSceneDist = (p: d.v3f): Shape => { const shape = getMorphingShape(p, time.$); const floor = Shape({ dist: sdf.sdPlane(p, d.vec3f(0, 1, 0), 0), - color: std.mix( - d.vec3f(1), - d.vec3f(0.2), - checkerBoard(std.mul(p.xz, 2)), - ), + material: { + albedo: std.mix( + d.vec3f(1), + d.vec3f(0.8), + checkerBoard(std.mul(p.xz, 2)), + ), + ao: 1, + metallic: 0, + roughness: 0, + }, }); return shapeUnion(shape, floor); @@ -241,7 +243,7 @@ const rayMarch = (ro: d.v3f, rd: d.v3f): Shape => { let dO = d.f32(0); const result = Shape({ dist: d.f32(MAX_DIST), - color: d.vec3f(0, 0, 0), + material: Material(), }); for (let i = 0; i < MAX_STEPS; i++) { @@ -251,7 +253,7 @@ const rayMarch = (ro: d.v3f, rd: d.v3f): Shape => { if (dO > MAX_DIST || scene.dist < SURF_DIST) { result.dist = dO; - result.color = d.vec3f(scene.color); + result.material = Material(scene.material); break; } } @@ -323,30 +325,40 @@ const fragmentMain = tgpu.fragmentFn({ const n = getNormal(p); // Lighting with orbiting light - const l = std.normalize(d.vec3f(0.5, 1, -0.2)); + + const l = std.normalize(SUN.$.position); const diff = std.max(std.dot(n, l), 0); // Soft shadows - // const shadowRo = p; - // const shadowRd = l; - // const shadowDist = 4; // approximate - // const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); - const shadow = 1; + const shadowRo = p; + const shadowRd = l; + const shadowDist = 4; // approximate + const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); + // const shadow = 1; // Combine lighting with shadows and color - const litColor = march.color.mul(diff); - const finalColor = std.mix( - std.mul(litColor, 0.5), // Shadow color - litColor, // Lit color - shadow, - ); + // const litColor = march.color.mul(diff); + // const finalColor = std.mix( + // std.mul(litColor, 0.5), // Shadow color + // litColor, // Lit color + // shadow, + // ); + + const v = std.normalize(ray.direction.mul(-1)); // TODO: use unary negation when it becomes available + // const material = Material({ + // albedo: d.vec3f(0.8, 0.2, 0.1), + // ao: 1, + // metallic: 1, + // roughness: 1, + // }); + const shadedColor = shade(p, n, v, shadow, march.material); - return std.mix(d.vec4f(finalColor, 1), skyColor, fog); + return std.mix(d.vec4f(shadedColor, 1), skyColor, fog); }); const cameraResult = setupOrbitCamera( canvas, - { initPos: d.vec4f(0.1, 4, 0, 1), maxZoom: 4, minZoom: 1 }, + { initPos: d.vec4f(0.4, 3, 0, 1), maxZoom: 4, minZoom: 1 }, (newProps) => cameraUniform.writePartial(newProps), ); diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/pbr.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/pbr.ts new file mode 100644 index 0000000000..49e4083024 --- /dev/null +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/pbr.ts @@ -0,0 +1,117 @@ +import { perlin3d } from '@typegpu/noise'; +import tgpu, { d, std } from 'typegpu'; +import { PI } from './constants.ts'; + +import { Light, Material } from './types.ts'; + +export const SUN = tgpu.const(Light, { + color: d.vec3f(4), + position: d.vec3f(-3, 10, 0), +}); + +export const distributionGGX = (ndoth: number, roughness: number): number => { + 'use gpu'; + const a = roughness ** 2; + const a2 = a ** 2; + const denom = std.max(ndoth ** 2 * (a2 - 1) + 1, 1e-4); + return a2 / (PI * denom ** 2); +}; + +export const geometrySchlickGGX = (ndot: number, roughness: number): number => { + 'use gpu'; + const k = (roughness + 1) ** 2 / 8; + return ndot / (ndot * (1 - k) + k); +}; + +export const geometrySmith = ( + ndotv: number, + ndotl: number, + roughness: number, +): number => { + 'use gpu'; + return ( + geometrySchlickGGX(ndotv, roughness) * geometrySchlickGGX(ndotl, roughness) + ); +}; + +export const fresnelSchlick = (cosTheta: number, f0: d.v3f): d.v3f => { + 'use gpu'; + return f0 + (1 - f0) * ((1 - cosTheta) ** 5); +}; + +export const evaluateDirectionalLight = ( + p: d.v3f, + n: d.v3f, + v: d.v3f, + light: d.Infer, + material: d.Infer, + f0: d.v3f, +): d.v3f => { + 'use gpu'; + const l = std.normalize(light.position - p); + const h = std.normalize(v + l); + const radiance = light.color; + + const ndotl = std.max(std.dot(n, l), 0); + const ndoth = std.max(std.dot(n, h), 0); + const ndotv = std.max(std.dot(n, v), 0.001); + + const ndf = distributionGGX(ndoth, material.roughness); + const g = geometrySmith(ndotv, ndotl, material.roughness); + const fresnel = fresnelSchlick(ndoth, f0); + + const specular = fresnel * (ndf * g) / (4 * ndotv * ndotl + 0.001); + const kd = (1 - fresnel) * (1 - material.metallic); + + return (kd * material.albedo / PI + specular) * radiance * ndotl; +}; + +export const shade = ( + p: d.v3f, + n: d.v3f, + v: d.v3f, + shadow: number, + material: d.Infer, +): d.v3f => { + 'use gpu'; + const f0 = std.mix(d.vec3f(0.04), material.albedo, material.metallic); + + let lo = d.vec3f(0); + // TODO: Do not clone once passing constant references to functions is okay + lo += evaluateDirectionalLight(p, n, v, Light(SUN.$), material, f0); + + const reflectDir = std.reflect(v, n); + + const pScaled = p * 50; + const roughOffset = d.vec3f( + perlin3d.sample(pScaled), + perlin3d.sample(pScaled + 100), + perlin3d.sample(pScaled + 200), + ) * material.roughness * 0.3; + const blurredReflectDir = std.normalize(reflectDir + roughOffset); + + // TODO: Add proper env color + // const envColor = d.vec4f(0, 0, 0, 1); + const envColor = d.vec4f(1, 1, 1, 1); + + const ndotv = std.max(std.dot(n, v), 0); + + const fresnel = fresnelSchlick(ndotv, f0); + + const reflectionTint = std.mix( + d.vec3f(1), + material.albedo, + material.metallic, + ); + + const reflectionStrength = 1 - material.roughness * 0.85; + + const envContribution = envColor.rgb + .mul(fresnel) + .mul(reflectionTint) + .mul(reflectionStrength); + + const ambient = material.albedo * material.ao * 0.05; + const color = ambient + (lo + envContribution) * shadow; + return std.pow(color / (color + 1), d.vec3f(1 / 2.2)); +}; From df29e802cee0a1d7b9dc8d8ed4572ef00fdf25e6 Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 17:29:20 +0100 Subject: [PATCH 22/23] Pepperoni --- .../rendering/pizza-pie-chart/index.ts | 51 ++++++++++++------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts index 49f20d0581..9e92bfa422 100644 --- a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts @@ -106,6 +106,13 @@ const crustMaterialBase = Material({ roughness: 1, }); +const pepperoniMaterialBase = Material({ + albedo: d.vec3f(0.6, 0.1, 0.1), + ao: 0.2, + metallic: 0.0, + roughness: 1, +}); + const sdPizzaCheeseStrings = (p: d.v3f): Shape => { 'use gpu'; let dp = rotateXZ(0.5) * p; @@ -142,6 +149,22 @@ const sdPizzaCheese = (p: d.v3f, angle: number): Shape => { return pieBase; }; +const pepperoniDomain = 0.28; +const sdPepperoni = (p: d.v3f, cutoutDist: number): Shape => { + 'use gpu'; + const wp = std.floor(p.xz / pepperoniDomain); + const mp = (std.fract(p.xz / pepperoniDomain) - 0.5) * pepperoniDomain; + const off = + d.vec2f(perlin2d.sample(wp * 0.5), perlin2d.sample(wp * 0.5 + 2)) * + pepperoniDomain * 0.6; + const dist2d = std.max(cutoutDist, sdf.sdDisk(mp + off, 0.07)); + + return Shape({ + dist: sdf.opExtrudeY(p, dist2d, 0.006), + material: pepperoniMaterialBase, + }); +}; + const sdPizzaCrust = (p: d.v3f, angle: number): Shape => { 'use gpu'; const pieBase2d = sdf.sdPie( @@ -149,6 +172,11 @@ const sdPizzaCrust = (p: d.v3f, angle: number): Shape => { d.vec2f(std.sin(angle / 2), std.cos(angle / 2)), PIE.radius, ) + PIE.baseRoundness; + const toppingsCutout = sdf.sdPie( + p.xz - d.vec2f(0, 0.005), + d.vec2f(std.sin(angle / 2), std.cos(angle / 2)), + PIE.radius * 0.8, + ); const crust2d = sdRing( p.xz, d.vec2f(std.cos(angle / 2 - 0.05), std.sin(angle / 2 - 0.05)), @@ -173,7 +201,10 @@ const sdPizzaCrust = (p: d.v3f, angle: number): Shape => { material: crustMaterial, }); - return smoothShapeUnion(pieBase, crust, 0.1); + return shapeUnion( + smoothShapeUnion(pieBase, crust, 0.1), + sdPepperoni(p - d.vec3f(0, 0.03, 0), toppingsCutout), + ); }; /** @@ -327,7 +358,6 @@ const fragmentMain = tgpu.fragmentFn({ // Lighting with orbiting light const l = std.normalize(SUN.$.position); - const diff = std.max(std.dot(n, l), 0); // Soft shadows const shadowRo = p; @@ -336,24 +366,11 @@ const fragmentMain = tgpu.fragmentFn({ const shadow = softShadow(shadowRo, shadowRd, 0.02, shadowDist, d.f32(16)); // const shadow = 1; - // Combine lighting with shadows and color - // const litColor = march.color.mul(diff); - // const finalColor = std.mix( - // std.mul(litColor, 0.5), // Shadow color - // litColor, // Lit color - // shadow, - // ); - const v = std.normalize(ray.direction.mul(-1)); // TODO: use unary negation when it becomes available - // const material = Material({ - // albedo: d.vec3f(0.8, 0.2, 0.1), - // ao: 1, - // metallic: 1, - // roughness: 1, - // }); const shadedColor = shade(p, n, v, shadow, march.material); - return std.mix(d.vec4f(shadedColor, 1), skyColor, fog); + const finalColor = std.mix(d.vec4f(shadedColor, 1), skyColor, fog); + return finalColor; }); const cameraResult = setupOrbitCamera( From 49550ac09388693affab4ab050edae6de701962b Mon Sep 17 00:00:00 2001 From: Iwo Plaza Date: Mon, 23 Feb 2026 18:08:49 +0100 Subject: [PATCH 23/23] Updates to use new defaults --- .../src/examples/rendering/pizza-pie-chart/index.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts index 9e92bfa422..cc872fb4c0 100644 --- a/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts +++ b/apps/typegpu-docs/src/examples/rendering/pizza-pie-chart/index.ts @@ -8,7 +8,6 @@ import { shade, SUN } from './pbr.ts'; const root = await tgpu.init(); const canvas = document.querySelector('canvas') as HTMLCanvasElement; const context = root.configureContext({ canvas, alphaMode: 'premultiplied' }); -const presentationFormat = navigator.gpu.getPreferredCanvasFormat(); const time = root.createUniform(d.f32); const resolution = root.createUniform(d.vec2f); @@ -336,7 +335,7 @@ const getRayForUV = (uv: d.v2f) => { const farWorld = camera.viewInverse.mul( d.vec4f(farView.xyz.div(farView.w), 1), ); - const direction = std.normalize(farWorld.xyz.sub(camera.position.xyz)); + const direction = std.normalize(farWorld.xyz - camera.position.xyz); return Ray({ origin: camera.position.xyz, direction }); }; @@ -387,7 +386,6 @@ const renderPipeline = root .createRenderPipeline({ vertex: common.fullScreenTriangle, fragment: fragmentMain, - targets: { format: presentationFormat }, }); let animationFrame: number; @@ -396,11 +394,7 @@ function run(timestamp: number) { resolution.write(d.vec2f(canvas.width, canvas.height)); renderPipeline - .withColorAttachment({ - view: context.getCurrentTexture().createView(), - loadOp: 'clear', - storeOp: 'store', - }) + .withColorAttachment({ view: context }) .draw(3); animationFrame = requestAnimationFrame(run);