typegpu 0.8.0-alpha.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -6
- package/chunk-2UXPGML5.js +7 -0
- package/chunk-2UXPGML5.js.map +1 -0
- package/chunk-3246CM7C.cjs +2 -0
- package/chunk-3246CM7C.cjs.map +1 -0
- package/{chunk-BDGVKGU4.js → chunk-4W5Z7BO4.js} +6 -6
- package/chunk-4W5Z7BO4.js.map +1 -0
- package/{chunk-ESIHND6W.cjs → chunk-5Y6GTBWR.cjs} +3 -3
- package/{chunk-ESIHND6W.cjs.map → chunk-5Y6GTBWR.cjs.map} +1 -1
- package/{chunk-DH4X56C7.js → chunk-7S3IK3D4.js} +2 -2
- package/{chunk-MJ6A4DOA.js → chunk-7XFSK632.js} +2 -2
- package/{chunk-WDMOZFKN.cjs → chunk-PRMFGUQT.cjs} +2 -2
- package/{chunk-WDMOZFKN.cjs.map → chunk-PRMFGUQT.cjs.map} +1 -1
- package/{chunk-44LAYHPR.cjs → chunk-TRE7NUKE.cjs} +6 -6
- package/chunk-TRE7NUKE.cjs.map +1 -0
- package/chunk-VOVQAOVG.js +2 -0
- package/chunk-VOVQAOVG.js.map +1 -0
- package/chunk-ZYGTVBDH.cjs +7 -0
- package/chunk-ZYGTVBDH.cjs.map +1 -0
- package/common/index.cjs +1 -1
- package/common/index.d.cts +1 -1
- package/common/index.d.ts +1 -1
- package/common/index.js +1 -1
- package/data/index.cjs +1 -1
- package/data/index.d.cts +3 -3
- package/data/index.d.ts +3 -3
- package/data/index.js +1 -1
- package/index.cjs +51 -51
- package/index.cjs.map +1 -1
- package/index.d.cts +2 -2
- package/index.d.ts +2 -2
- package/index.js +40 -40
- package/index.js.map +1 -1
- package/{matrix-UOB09LaW.d.cts → matrix-DHFT4O8f.d.cts} +1 -1
- package/{matrix-CjLuYXH1.d.ts → matrix-DLipCOZF.d.ts} +1 -1
- package/package.json +2 -2
- package/std/index.cjs +1 -1
- package/std/index.cjs.map +1 -1
- package/std/index.d.cts +2 -2
- package/std/index.d.ts +2 -2
- package/std/index.js +1 -1
- package/std/index.js.map +1 -1
- package/{tgpuConstant-sKeoSjPD.d.ts → tgpuConstant-BU72w5qs.d.cts} +15 -13
- package/{tgpuConstant-sKeoSjPD.d.cts → tgpuConstant-BU72w5qs.d.ts} +15 -13
- package/chunk-44LAYHPR.cjs.map +0 -1
- package/chunk-6OJFCDQF.js +0 -7
- package/chunk-6OJFCDQF.js.map +0 -1
- package/chunk-BDGVKGU4.js.map +0 -1
- package/chunk-CODEFPMD.cjs +0 -2
- package/chunk-CODEFPMD.cjs.map +0 -1
- package/chunk-HLB6TY7I.cjs +0 -7
- package/chunk-HLB6TY7I.cjs.map +0 -1
- package/chunk-ZYSFFI3M.js +0 -2
- package/chunk-ZYSFFI3M.js.map +0 -1
- /package/{chunk-DH4X56C7.js.map → chunk-7S3IK3D4.js.map} +0 -0
- /package/{chunk-MJ6A4DOA.js.map → chunk-7XFSK632.js.map} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var
|
|
2
|
-
`,"\v","\f","\r","\x85","\u2028","\u2029"]),le=new Set([...Z," "," ","\u200E","\u200F"]),Q=new Set([")"]),ce=new Set([":",",",")"]),de=new Set([",",")"]),me=new Set(["*/"]),X=["(",")"],fe=["<",">"],ge=["/*","*/"];function ne(n,e=""){let r=[],t={applyExternals(i){r.push(i)},resolve(i,o,a){let l={};for(let u of r)S(l,u);let d=i.getUniqueName(this);if(typeof n=="string"){if(!a)throw new Error("Explicit return type is required for string implementation");let u=R(i,l,n),m="",x="";if(e!==""){let p=
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkTRE7NUKEcjs = require('./chunk-TRE7NUKE.cjs');var _tinyest = require('tinyest');function S(n,e){for(let[r,t]of Object.entries(e))n[r]=t,t&&(typeof t=="object"||typeof t=="function")&&_chunkTRE7NUKEcjs.j.call(void 0, t)===void 0&&_chunkTRE7NUKEcjs.k.call(void 0, t,r)}function Se(n,e,r){let t=[...n.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map(s=>s?s[1]:void 0);r(Object.fromEntries(e.flatMap((s,i)=>{let o=t?t[i]:void 0;return _chunkTRE7NUKEcjs.D.call(void 0, s)&&o!==void 0?[[o,s]]:[]})))}function $e(n,e,r){let t=n.match(/->\s(?<output>[\w\d_]+)\s{/),s=t?_optionalChain([t, 'access', _2 => _2[1], 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()]):void 0;_chunkTRE7NUKEcjs.D.call(void 0, e)&&s&&!/\s/g.test(s)&&r({[s]:e})}function ue(n){return new RegExp(`(?<![\\w\\$_.])${n.replaceAll(".","\\.").replaceAll("$","\\$")}(?![\\w\\$_])`,"g")}function R(n,e,r){return Object.entries(e).reduce((t,[s,i])=>{let o=ue(s);if(r&&s!=="Out"&&s!=="In"&&!o.test(r)&&console.warn(`The external '${s}' wasn't used in the resolved template.`),_chunkTRE7NUKEcjs.va.call(void 0, i)||_chunkTRE7NUKEcjs.Q.call(void 0, i)||_chunkTRE7NUKEcjs.m.call(void 0, i))return t.replaceAll(o,n.resolve(i).value);if(i!==null&&typeof i=="object"){let a=[...r.matchAll(new RegExp(`${s.replaceAll(".","\\.").replaceAll("$","\\$")}\\.(?<prop>.*?)(?![\\w\\$_])`,"g"))].map(d=>d[1]);return[...new Set(a)].reduce((d,f)=>f&&f in i?R(n,{[`${s}.${f}`]:i[f]},d):d,t)}return console.warn(`During resolution, the external '${s}' has been omitted. Only primitives, TGPU resources and plain JS objects can be used as externals.`),t},r)}function Y(n){let{strippedCode:e,argRange:r}=pe(n),t=new $(e);t.consume("(");let s=[];for(;!t.isAt(")");){let o=[];for(;t.isAt("@");)t.parseUntil(Q,X),t.consume(")"),o.push(t.lastParsed);t.parseUntil(ce);let a=t.lastParsed,l;t.isAt(":")&&(t.consume(":"),t.parseUntil(de,fe),l=t.lastParsed),s.push({identifier:a,attributes:o,type:l}),t.isAt(",")&&t.consume(",")}t.consume(")");let i;if(t.isAt("->")){t.consume("->");let o=[];for(;t.isAt("@");)t.parseUntil(Q,X),t.consume(")"),o.push(t.lastParsed);i={type:t.str.slice(t.pos),attributes:o}}return{args:s,ret:i,range:{begin:r[0],end:r[1]}}}function pe(n){let e=new $(n),r="",t;for(;!e.isFinished();){if(e.isAt(le)){e.advanceBy(1);continue}if(e.isAt("//")){e.consume("//"),e.parseUntil(Z),e.advanceBy(1);continue}if(e.isAt("/*")){e.parseUntil(me,ge),e.consume("*/");continue}if(e.isAt("{"))return{strippedCode:r,argRange:[t,e.pos]};e.isAt("(")&&t===void 0&&(t=e.pos),t!==void 0&&(r+=e.str[e.pos]),e.advanceBy(1)}throw new Error("Invalid wgsl code!")}var $=class{constructor(e){this.str=e;this.#e=0}#t;#e;get pos(){return this.#e}get lastParsed(){if(this.#t===void 0)throw new Error("Parse was not called yet!");return this.str.slice(this.#t,this.pos)}isFinished(){return this.#e>=this.str.length}isAt(e){if(typeof e=="string"){for(let r=0;r<e.length;r++)if(this.str[this.#e+r]!==e[r])return!1;return!0}for(let r of e)if(this.isAt(r))return!0;return!1}parseUntil(e,r){this.#t=this.#e;let t=0;for(;this.#e<this.str.length;){if(r&&this.isAt(r[0])&&(t+=1),r&&this.isAt(r[1])&&(t-=1),t===0&&this.isAt(e))return this.#e;this.#e+=1}throw new Error("Reached the end of the string without finding a match!")}advanceBy(e){this.#e+=e}consume(e){if(!this.isAt(e))throw new Error(`Expected '${e}' at position ${this.#e}, but found '${this.str.slice(this.#e,this.#e+e.length)}'`);this.advanceBy(e.length)}},Z=new Set([`
|
|
2
|
+
`,"\v","\f","\r","\x85","\u2028","\u2029"]),le=new Set([...Z," "," ","\u200E","\u200F"]),Q=new Set([")"]),ce=new Set([":",",",")"]),de=new Set([",",")"]),me=new Set(["*/"]),X=["(",")"],fe=["<",">"],ge=["/*","*/"];function ne(n,e=""){let r=[],t={applyExternals(i){r.push(i)},resolve(i,o,a){let l={};for(let u of r)S(l,u);let d=i.getUniqueName(this);if(typeof n=="string"){if(!a)throw new Error("Explicit return type is required for string implementation");let u=R(i,l,n),m="",x="";if(e!==""){let p=_chunkTRE7NUKEcjs.D.call(void 0, o[0])?`(in: ${i.resolve(o[0]).value})`:"()",c=_chunkTRE7NUKEcjs.B.call(void 0, a)?_chunkTRE7NUKEcjs.pc.call(void 0, a):"",b=a!==_chunkTRE7NUKEcjs.q?_chunkTRE7NUKEcjs.D.call(void 0, a)?`-> ${i.resolve(a).value}`:`-> ${c!==""?c:"@location(0)"} ${i.resolve(a).value}`:"";m=`${p} ${b} `,x=u}else{let p=Y(u);if(p.args.length!==o.length)throw new Error(`WGSL implementation has ${p.args.length} arguments, while the shell has ${o.length} arguments.`);let c=p.args.map((E,ae)=>`${E.identifier}: ${te(i,`parameter ${E.identifier}`,E.type,o[ae])}`).join(", "),b=a===_chunkTRE7NUKEcjs.q?"":`-> ${te(i,"return type",_optionalChain([p, 'access', _5 => _5.ret, 'optionalAccess', _6 => _6.type]),a)}`;m=`(${c}) ${b}`,x=u.slice(p.range.end)}return i.addDeclaration(`${e}fn ${d}${m}${x}`),_chunkTRE7NUKEcjs.aa.call(void 0, d,a)}let f=_chunkTRE7NUKEcjs.n.call(void 0, n);if(_optionalChain([f, 'optionalAccess', _7 => _7.externals])){let u=Object.fromEntries(Object.entries(f.externals).filter(([m])=>!(m in l)));S(l,u)}let O=_optionalChain([f, 'optionalAccess', _8 => _8.ast]);if(!O)throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");let B=O.externalNames.filter(u=>!(u in l));if(B.length>0)throw new (0, _chunkTRE7NUKEcjs.ga)(_chunkTRE7NUKEcjs.j.call(void 0, this),B);let A=O.params[1];A&&A.type==="i"&&e!==""&&S(l,{[A.name]:_chunkTRE7NUKEcjs.P.call(void 0, a)});let V=[],v=[];for(let[u,m]of o.entries()){let x=O.params[u];switch(_optionalChain([x, 'optionalAccess', _9 => _9.type])){case _tinyest.FuncParameterType.identifier:{let p=x.name,c=_chunkTRE7NUKEcjs.aa.call(void 0, i.makeNameValid(p),m);V.push(c),c.value!==p&&v.push([p,c]);break}case _tinyest.FuncParameterType.destructuredObject:{V.push(_chunkTRE7NUKEcjs.aa.call(void 0, `_arg_${u}`,m)),v.push(...x.props.map(({name:p,alias:c})=>[c,_chunkTRE7NUKEcjs.aa.call(void 0, `_arg_${u}.${p}`,o[u].propTypes[p])]));break}case void 0:V.push(_chunkTRE7NUKEcjs.aa.call(void 0, `_arg_${u}`,m))}}let{head:ie,body:se,returnType:oe}=i.fnToWgsl({args:V,argAliases:Object.fromEntries(v),returnType:a,body:O.body,externalMap:l});return i.addDeclaration(`${e}fn ${d}${i.resolve(ie).value}${i.resolve(se).value}`),_chunkTRE7NUKEcjs.aa.call(void 0, d,oe)}},s=_chunkTRE7NUKEcjs.j.call(void 0, n);return s!==void 0&&_chunkTRE7NUKEcjs.k.call(void 0, t,s),t}function te(n,e,r,t){let s=n.resolve(t).value.replace(/\s/g,"");if(!r)return s;let i=r.replace(/\s/g,"");if(i!==s)throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${e}, JS type "${s}", WGSL type "${i}".`);return r}function xe(n,e={}){let r=0,t=new Set;return Object.fromEntries(Object.entries(_nullishCoalesce(n, () => ({}))).map(([s,i])=>{let o=_chunkTRE7NUKEcjs.U.call(void 0, i);if(o!==void 0){if(t.has(o))throw new Error("Duplicate custom location attributes found");t.add(o)}return[s,i]}).map(([s,i])=>{if(_chunkTRE7NUKEcjs.oc.call(void 0, i))return[s,i];if(_chunkTRE7NUKEcjs.U.call(void 0, i)!==void 0)return[s,i];if(e[s])return[s,_chunkTRE7NUKEcjs.lc.call(void 0, e[s],i)];for(;t.has(r);)r++;return[s,_chunkTRE7NUKEcjs.lc.call(void 0, r++,i)]}))}function F(n,e={}){return _chunkTRE7NUKEcjs.V.call(void 0, n)?_chunkTRE7NUKEcjs.M.call(void 0, n)||_chunkTRE7NUKEcjs.U.call(void 0, n)!==void 0?n:_chunkTRE7NUKEcjs.lc.call(void 0, 0,n):_chunkTRE7NUKEcjs.rc.call(void 0, xe(n,e))}function re(n,...e){return ye(n)?he(n,...e):n}function ye(n){return Array.isArray(n)&&"raw"in n&&Array.isArray(n.raw)&&n.raw.every(e=>typeof e=="string")}function he(n,...e){return n.slice(1).reduce((r,t,s)=>`${r}${e[s]}${t}`,n[0])}function Qe(n){if(Object.keys(n.out).length===0)throw new Error("A vertexFn output cannot be empty since it must include the 'position' builtin.");let e={in:n.in,out:n.out,argTypes:n.in&&Object.keys(n.in).length!==0?[F(n.in)]:[],isEntry:!0},r=(t,...s)=>Ie(e,re(t,...s));return Object.assign(Object.assign(r,e),{does:r})}function Ie(n,e){let r=ne(e,"@vertex "),t=n.argTypes[0];return{shell:n,$uses(i){return r.applyExternals(i),this},[_chunkTRE7NUKEcjs.a]:!0,[_chunkTRE7NUKEcjs.c]:r,$name(i){return _chunkTRE7NUKEcjs.k.call(void 0, r,i),_chunkTRE7NUKEcjs.l.call(void 0, t)&&t.$name(`${i}_Input`),this},[_chunkTRE7NUKEcjs.f](i){let o=F(n.out,i.varyingLocations).$name(`${_nullishCoalesce(_chunkTRE7NUKEcjs.j.call(void 0, this), () => (""))}_Output`);return typeof e=="string"&&(t&&r.applyExternals({In:t}),r.applyExternals({Out:o})),r.resolve(i,n.argTypes,o)},toString(){return`vertexFn:${_nullishCoalesce(_chunkTRE7NUKEcjs.j.call(void 0, r), () => ("<unnamed>"))}`}}}exports.a = S; exports.b = Se; exports.c = $e; exports.d = R; exports.e = ne; exports.f = F; exports.g = re; exports.h = Qe;
|
|
3
|
+
//# sourceMappingURL=chunk-5Y6GTBWR.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-ESIHND6W.cjs","../src/core/function/fnCore.ts","../src/core/resolve/externals.ts"],"names":["applyExternals","existing","newExternals","key","value","getName","setName","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","matched","outputName","identifierRegex","name","replaceExternalsInWgsl","ctx","externalMap","wgsl","acc","externalName","external","externalRegex","isWgsl","isLooseData","hasTinyestMetadata","foundProperties"],"mappings":"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","file":"/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-ESIHND6W.cjs","sourcesContent":[null,"import { FuncParameterType } from 'tinyest';\nimport { getAttributesString } from '../../data/attributes.ts';\nimport { type AnyData, undecorate } from '../../data/dataTypes.ts';\nimport {\n type ResolvedSnippet,\n snip,\n type Snippet,\n} from '../../data/snippet.ts';\nimport {\n isWgslData,\n isWgslStruct,\n Void,\n type WgslStruct,\n} from '../../data/wgslTypes.ts';\nimport { MissingLinksError } from '../../errors.ts';\nimport { getMetaData, getName, setName } from '../../shared/meta.ts';\nimport type { ResolutionCtx } from '../../types.ts';\nimport {\n applyExternals,\n type ExternalMap,\n replaceExternalsInWgsl,\n} from '../resolve/externals.ts';\nimport { extractArgs } from './extractArgs.ts';\nimport type { Implementation } from './fnTypes.ts';\n\nexport interface FnCore {\n applyExternals(newExternals: ExternalMap): void;\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: AnyData | undefined,\n ): ResolvedSnippet;\n}\n\nexport function createFnCore(\n implementation: Implementation,\n fnAttribute = '',\n): FnCore {\n /**\n * External application has to be deferred until resolution because\n * some externals can reference the owner function which has not been\n * initialized yet (like when accessing the Output struct of a vertex\n * entry fn).\n */\n const externalsToApply: ExternalMap[] = [];\n\n const core = {\n applyExternals(newExternals: ExternalMap): void {\n externalsToApply.push(newExternals);\n },\n\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n returnType: AnyData | undefined,\n ): ResolvedSnippet {\n const externalMap: ExternalMap = {};\n\n for (const externals of externalsToApply) {\n applyExternals(externalMap, externals);\n }\n\n const id = ctx.getUniqueName(this);\n\n if (typeof implementation === 'string') {\n if (!returnType) {\n throw new Error(\n 'Explicit return type is required for string implementation',\n );\n }\n\n const replacedImpl = replaceExternalsInWgsl(\n ctx,\n externalMap,\n implementation,\n );\n\n let header = '';\n let body = '';\n\n if (fnAttribute !== '') {\n const input = isWgslStruct(argTypes[0])\n ? `(in: ${ctx.resolve(argTypes[0]).value})`\n : '()';\n\n const attributes = isWgslData(returnType)\n ? getAttributesString(returnType)\n : '';\n const output = returnType !== Void\n ? isWgslStruct(returnType)\n ? `-> ${ctx.resolve(returnType).value}`\n : `-> ${attributes !== '' ? attributes : '@location(0)'} ${\n ctx.resolve(returnType).value\n }`\n : '';\n\n header = `${input} ${output} `;\n body = replacedImpl;\n } else {\n const providedArgs = extractArgs(replacedImpl);\n\n if (providedArgs.args.length !== argTypes.length) {\n throw new Error(\n `WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`,\n );\n }\n\n const input = providedArgs.args.map((argInfo, i) =>\n `${argInfo.identifier}: ${\n checkAndReturnType(\n ctx,\n `parameter ${argInfo.identifier}`,\n argInfo.type,\n argTypes[i],\n )\n }`\n ).join(', ');\n\n const output = returnType === Void ? '' : `-> ${\n checkAndReturnType(\n ctx,\n 'return type',\n providedArgs.ret?.type,\n returnType,\n )\n }`;\n\n header = `(${input}) ${output}`;\n\n body = replacedImpl.slice(providedArgs.range.end);\n }\n\n ctx.addDeclaration(`${fnAttribute}fn ${id}${header}${body}`);\n return snip(id, returnType);\n }\n\n // get data generated by the plugin\n const pluginData = getMetaData(implementation);\n\n if (pluginData?.externals) {\n const missing = Object.fromEntries(\n Object.entries(pluginData.externals).filter(\n ([name]) => !(name in externalMap),\n ),\n );\n\n applyExternals(externalMap, missing);\n }\n\n const ast = pluginData?.ast;\n if (!ast) {\n throw new Error(\n \"Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)\",\n );\n }\n\n // verify all required externals are present\n const missingExternals = ast.externalNames.filter(\n (name) => !(name in externalMap),\n );\n if (missingExternals.length > 0) {\n throw new MissingLinksError(getName(this), missingExternals);\n }\n\n // If an entrypoint implementation has a second argument, it represents the output schema.\n // We look at the identifier chosen by the user and add it to externals.\n const maybeSecondArg = ast.params[1];\n if (\n maybeSecondArg && maybeSecondArg.type === 'i' && fnAttribute !== ''\n ) {\n applyExternals(\n externalMap,\n {\n // biome-ignore lint/style/noNonNullAssertion: entry functions cannot be shellless\n [maybeSecondArg.name]: undecorate(returnType!),\n },\n );\n }\n\n // generate wgsl string\n\n const args: Snippet[] = [];\n const argAliases: [string, Snippet][] = [];\n\n for (const [i, argType] of argTypes.entries()) {\n const astParam = ast.params[i];\n\n switch (astParam?.type) {\n case FuncParameterType.identifier: {\n const rawName = astParam.name;\n const snippet = snip(ctx.makeNameValid(rawName), argType);\n args.push(snippet);\n if (snippet.value !== rawName) {\n argAliases.push([rawName, snippet]);\n }\n break;\n }\n case FuncParameterType.destructuredObject: {\n args.push(snip(`_arg_${i}`, argType));\n argAliases.push(...astParam.props.map(({ name, alias }) =>\n [\n alias,\n snip(\n `_arg_${i}.${name}`,\n (argTypes[i] as WgslStruct)\n .propTypes[name],\n ),\n ] as [string, Snippet]\n ));\n break;\n }\n case undefined:\n args.push(snip(`_arg_${i}`, argType));\n }\n }\n\n const { head, body, returnType: actualReturnType } = ctx.fnToWgsl({\n args,\n argAliases: Object.fromEntries(argAliases),\n returnType,\n body: ast.body,\n externalMap,\n });\n\n ctx.addDeclaration(\n `${fnAttribute}fn ${id}${ctx.resolve(head).value}${\n ctx.resolve(body).value\n }`,\n );\n\n return snip(id, actualReturnType);\n },\n };\n\n // The implementation could have been given a name by a bundler plugin,\n // so we try to transfer it to the core.\n const maybeName = getName(implementation);\n if (maybeName !== undefined) {\n setName(core, maybeName);\n }\n\n return core;\n}\n\nfunction checkAndReturnType(\n ctx: ResolutionCtx,\n name: string,\n wgslType: string | undefined,\n jsType: unknown,\n) {\n const resolvedJsType = ctx.resolve(jsType).value.replace(/\\s/g, '');\n\n if (!wgslType) {\n return resolvedJsType;\n }\n\n const resolvedWgslType = wgslType.replace(/\\s/g, '');\n\n if (resolvedWgslType !== resolvedJsType) {\n throw new Error(\n `Type mismatch between TGPU shell and WGSL code string: ${name}, JS type \"${resolvedJsType}\", WGSL type \"${resolvedWgslType}\".`,\n );\n }\n\n return wgslType;\n}\n","import { isLooseData } from '../../data/dataTypes.ts';\nimport { isWgslStruct } from '../../data/wgslTypes.ts';\nimport { getName, hasTinyestMetadata, setName } from '../../shared/meta.ts';\nimport { isWgsl, type ResolutionCtx } from '../../types.ts';\n\n/**\n * A key-value mapping where keys represent identifiers within shader code,\n * and values can be any type that can be resolved to a code string.\n */\nexport type ExternalMap = Record<string, unknown>;\n\n/**\n * Merges two external maps into one. If a key is present in both maps, the value from the new map is used.\n * If the external value is a namable object, it is given a name if it does not already have one.\n * @param existing - The existing external map.\n * @param newExternals - The new external map.\n */\nexport function applyExternals(\n existing: ExternalMap,\n newExternals: ExternalMap,\n) {\n for (const [key, value] of Object.entries(newExternals)) {\n existing[key] = value;\n\n // Giving name to external value, if it does not already have one.\n if (\n value && (typeof value === 'object' || typeof value === 'function') &&\n getName(value) === undefined\n ) {\n setName(value, key);\n }\n }\n}\n\nexport function addArgTypesToExternals(\n implementation: string,\n argTypes: unknown[],\n applyExternals: (externals: ExternalMap) => void,\n) {\n const argTypeNames = [\n ...implementation.matchAll(/:\\s*(?<arg>.*?)\\s*[,)]/g),\n ].map((found) => (found ? found[1] : undefined));\n\n applyExternals(\n Object.fromEntries(\n argTypes.flatMap((argType, i) => {\n const argTypeName = argTypeNames ? argTypeNames[i] : undefined;\n return isWgslStruct(argType) && argTypeName !== undefined\n ? [[argTypeName, argType]]\n : [];\n }),\n ),\n );\n}\n\nexport function addReturnTypeToExternals(\n implementation: string,\n returnType: unknown,\n applyExternals: (externals: ExternalMap) => void,\n) {\n const matched = implementation.match(/->\\s(?<output>[\\w\\d_]+)\\s{/);\n const outputName = matched ? matched[1]?.trim() : undefined;\n\n if (isWgslStruct(returnType) && outputName && !/\\s/g.test(outputName)) {\n applyExternals({ [outputName]: returnType });\n }\n}\n\nfunction identifierRegex(name: string) {\n return new RegExp(\n `(?<![\\\\w\\\\$_.])${\n name.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }(?![\\\\w\\\\$_])`,\n 'g',\n );\n}\n\n/**\n * Replaces all occurrences of external names in WGSL code with their resolved values.\n * It adds all necessary definitions to the resolution context.\n * @param ctx - The resolution context.\n * @param externalMap - The external map.\n * @param wgsl - The WGSL code.\n *\n * @returns The WGSL code with all external names replaced with their resolved values.\n */\nexport function replaceExternalsInWgsl(\n ctx: ResolutionCtx,\n externalMap: ExternalMap,\n wgsl: string,\n): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n const externalRegex = identifierRegex(externalName);\n if (\n wgsl &&\n externalName !== 'Out' &&\n externalName !== 'In' &&\n !externalRegex.test(wgsl)\n ) {\n console.warn(\n `The external '${externalName}' wasn't used in the resolved template.`,\n );\n // continue anyway, we still might need to resolve the external\n }\n\n if (\n isWgsl(external) || isLooseData(external) || hasTinyestMetadata(external)\n ) {\n return acc.replaceAll(externalRegex, ctx.resolve(external).value);\n }\n\n if (external !== null && typeof external === 'object') {\n const foundProperties = [\n ...wgsl.matchAll(\n new RegExp(\n `${\n externalName.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }\\\\.(?<prop>.*?)(?![\\\\w\\\\$_])`,\n 'g',\n ),\n ),\n ].map((found) => found[1]);\n const uniqueProperties = [...new Set(foundProperties)];\n\n return uniqueProperties.reduce(\n (innerAcc: string, prop) =>\n prop && prop in external\n ? replaceExternalsInWgsl(\n ctx,\n {\n [`${externalName}.${prop}`]:\n external[prop as keyof typeof external],\n },\n innerAcc,\n )\n : innerAcc,\n acc,\n );\n }\n\n console.warn(\n `During resolution, the external '${externalName}' has been omitted. Only primitives, TGPU resources and plain JS objects can be used as externals.`,\n );\n\n return acc;\n }, wgsl);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-5Y6GTBWR.cjs","../src/core/function/fnCore.ts","../src/core/resolve/externals.ts"],"names":["applyExternals","existing","newExternals","key","value","getName","setName","addArgTypesToExternals","implementation","argTypes","argTypeNames","found","argType","argTypeName","isWgslStruct","addReturnTypeToExternals","returnType","matched","outputName","identifierRegex","name","replaceExternalsInWgsl","ctx","externalMap","wgsl","acc","externalName","external","externalRegex","isWgsl","isLooseData","hasTinyestMetadata","foundProperties"],"mappings":"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","file":"/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-5Y6GTBWR.cjs","sourcesContent":[null,"import { FuncParameterType } from 'tinyest';\nimport { getAttributesString } from '../../data/attributes.ts';\nimport { type AnyData, undecorate } from '../../data/dataTypes.ts';\nimport {\n type ResolvedSnippet,\n snip,\n type Snippet,\n} from '../../data/snippet.ts';\nimport {\n isWgslData,\n isWgslStruct,\n Void,\n type WgslStruct,\n} from '../../data/wgslTypes.ts';\nimport { MissingLinksError } from '../../errors.ts';\nimport { getMetaData, getName, setName } from '../../shared/meta.ts';\nimport type { ResolutionCtx } from '../../types.ts';\nimport {\n applyExternals,\n type ExternalMap,\n replaceExternalsInWgsl,\n} from '../resolve/externals.ts';\nimport { extractArgs } from './extractArgs.ts';\nimport type { Implementation } from './fnTypes.ts';\n\nexport interface FnCore {\n applyExternals(newExternals: ExternalMap): void;\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: AnyData | undefined,\n ): ResolvedSnippet;\n}\n\nexport function createFnCore(\n implementation: Implementation,\n fnAttribute = '',\n): FnCore {\n /**\n * External application has to be deferred until resolution because\n * some externals can reference the owner function which has not been\n * initialized yet (like when accessing the Output struct of a vertex\n * entry fn).\n */\n const externalsToApply: ExternalMap[] = [];\n\n const core = {\n applyExternals(newExternals: ExternalMap): void {\n externalsToApply.push(newExternals);\n },\n\n resolve(\n ctx: ResolutionCtx,\n argTypes: AnyData[],\n returnType: AnyData | undefined,\n ): ResolvedSnippet {\n const externalMap: ExternalMap = {};\n\n for (const externals of externalsToApply) {\n applyExternals(externalMap, externals);\n }\n\n const id = ctx.getUniqueName(this);\n\n if (typeof implementation === 'string') {\n if (!returnType) {\n throw new Error(\n 'Explicit return type is required for string implementation',\n );\n }\n\n const replacedImpl = replaceExternalsInWgsl(\n ctx,\n externalMap,\n implementation,\n );\n\n let header = '';\n let body = '';\n\n if (fnAttribute !== '') {\n const input = isWgslStruct(argTypes[0])\n ? `(in: ${ctx.resolve(argTypes[0]).value})`\n : '()';\n\n const attributes = isWgslData(returnType)\n ? getAttributesString(returnType)\n : '';\n const output = returnType !== Void\n ? isWgslStruct(returnType)\n ? `-> ${ctx.resolve(returnType).value}`\n : `-> ${attributes !== '' ? attributes : '@location(0)'} ${\n ctx.resolve(returnType).value\n }`\n : '';\n\n header = `${input} ${output} `;\n body = replacedImpl;\n } else {\n const providedArgs = extractArgs(replacedImpl);\n\n if (providedArgs.args.length !== argTypes.length) {\n throw new Error(\n `WGSL implementation has ${providedArgs.args.length} arguments, while the shell has ${argTypes.length} arguments.`,\n );\n }\n\n const input = providedArgs.args.map((argInfo, i) =>\n `${argInfo.identifier}: ${\n checkAndReturnType(\n ctx,\n `parameter ${argInfo.identifier}`,\n argInfo.type,\n argTypes[i],\n )\n }`\n ).join(', ');\n\n const output = returnType === Void ? '' : `-> ${\n checkAndReturnType(\n ctx,\n 'return type',\n providedArgs.ret?.type,\n returnType,\n )\n }`;\n\n header = `(${input}) ${output}`;\n\n body = replacedImpl.slice(providedArgs.range.end);\n }\n\n ctx.addDeclaration(`${fnAttribute}fn ${id}${header}${body}`);\n return snip(id, returnType);\n }\n\n // get data generated by the plugin\n const pluginData = getMetaData(implementation);\n\n if (pluginData?.externals) {\n const missing = Object.fromEntries(\n Object.entries(pluginData.externals).filter(\n ([name]) => !(name in externalMap),\n ),\n );\n\n applyExternals(externalMap, missing);\n }\n\n const ast = pluginData?.ast;\n if (!ast) {\n throw new Error(\n \"Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)\",\n );\n }\n\n // verify all required externals are present\n const missingExternals = ast.externalNames.filter(\n (name) => !(name in externalMap),\n );\n if (missingExternals.length > 0) {\n throw new MissingLinksError(getName(this), missingExternals);\n }\n\n // If an entrypoint implementation has a second argument, it represents the output schema.\n // We look at the identifier chosen by the user and add it to externals.\n const maybeSecondArg = ast.params[1];\n if (\n maybeSecondArg && maybeSecondArg.type === 'i' && fnAttribute !== ''\n ) {\n applyExternals(\n externalMap,\n {\n // biome-ignore lint/style/noNonNullAssertion: entry functions cannot be shellless\n [maybeSecondArg.name]: undecorate(returnType!),\n },\n );\n }\n\n // generate wgsl string\n\n const args: Snippet[] = [];\n const argAliases: [string, Snippet][] = [];\n\n for (const [i, argType] of argTypes.entries()) {\n const astParam = ast.params[i];\n\n switch (astParam?.type) {\n case FuncParameterType.identifier: {\n const rawName = astParam.name;\n const snippet = snip(ctx.makeNameValid(rawName), argType);\n args.push(snippet);\n if (snippet.value !== rawName) {\n argAliases.push([rawName, snippet]);\n }\n break;\n }\n case FuncParameterType.destructuredObject: {\n args.push(snip(`_arg_${i}`, argType));\n argAliases.push(...astParam.props.map(({ name, alias }) =>\n [\n alias,\n snip(\n `_arg_${i}.${name}`,\n (argTypes[i] as WgslStruct)\n .propTypes[name],\n ),\n ] as [string, Snippet]\n ));\n break;\n }\n case undefined:\n args.push(snip(`_arg_${i}`, argType));\n }\n }\n\n const { head, body, returnType: actualReturnType } = ctx.fnToWgsl({\n args,\n argAliases: Object.fromEntries(argAliases),\n returnType,\n body: ast.body,\n externalMap,\n });\n\n ctx.addDeclaration(\n `${fnAttribute}fn ${id}${ctx.resolve(head).value}${\n ctx.resolve(body).value\n }`,\n );\n\n return snip(id, actualReturnType);\n },\n };\n\n // The implementation could have been given a name by a bundler plugin,\n // so we try to transfer it to the core.\n const maybeName = getName(implementation);\n if (maybeName !== undefined) {\n setName(core, maybeName);\n }\n\n return core;\n}\n\nfunction checkAndReturnType(\n ctx: ResolutionCtx,\n name: string,\n wgslType: string | undefined,\n jsType: unknown,\n) {\n const resolvedJsType = ctx.resolve(jsType).value.replace(/\\s/g, '');\n\n if (!wgslType) {\n return resolvedJsType;\n }\n\n const resolvedWgslType = wgslType.replace(/\\s/g, '');\n\n if (resolvedWgslType !== resolvedJsType) {\n throw new Error(\n `Type mismatch between TGPU shell and WGSL code string: ${name}, JS type \"${resolvedJsType}\", WGSL type \"${resolvedWgslType}\".`,\n );\n }\n\n return wgslType;\n}\n","import { isLooseData } from '../../data/dataTypes.ts';\nimport { isWgslStruct } from '../../data/wgslTypes.ts';\nimport { getName, hasTinyestMetadata, setName } from '../../shared/meta.ts';\nimport { isWgsl, type ResolutionCtx } from '../../types.ts';\n\n/**\n * A key-value mapping where keys represent identifiers within shader code,\n * and values can be any type that can be resolved to a code string.\n */\nexport type ExternalMap = Record<string, unknown>;\n\n/**\n * Merges two external maps into one. If a key is present in both maps, the value from the new map is used.\n * If the external value is a namable object, it is given a name if it does not already have one.\n * @param existing - The existing external map.\n * @param newExternals - The new external map.\n */\nexport function applyExternals(\n existing: ExternalMap,\n newExternals: ExternalMap,\n) {\n for (const [key, value] of Object.entries(newExternals)) {\n existing[key] = value;\n\n // Giving name to external value, if it does not already have one.\n if (\n value && (typeof value === 'object' || typeof value === 'function') &&\n getName(value) === undefined\n ) {\n setName(value, key);\n }\n }\n}\n\nexport function addArgTypesToExternals(\n implementation: string,\n argTypes: unknown[],\n applyExternals: (externals: ExternalMap) => void,\n) {\n const argTypeNames = [\n ...implementation.matchAll(/:\\s*(?<arg>.*?)\\s*[,)]/g),\n ].map((found) => (found ? found[1] : undefined));\n\n applyExternals(\n Object.fromEntries(\n argTypes.flatMap((argType, i) => {\n const argTypeName = argTypeNames ? argTypeNames[i] : undefined;\n return isWgslStruct(argType) && argTypeName !== undefined\n ? [[argTypeName, argType]]\n : [];\n }),\n ),\n );\n}\n\nexport function addReturnTypeToExternals(\n implementation: string,\n returnType: unknown,\n applyExternals: (externals: ExternalMap) => void,\n) {\n const matched = implementation.match(/->\\s(?<output>[\\w\\d_]+)\\s{/);\n const outputName = matched ? matched[1]?.trim() : undefined;\n\n if (isWgslStruct(returnType) && outputName && !/\\s/g.test(outputName)) {\n applyExternals({ [outputName]: returnType });\n }\n}\n\nfunction identifierRegex(name: string) {\n return new RegExp(\n `(?<![\\\\w\\\\$_.])${\n name.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }(?![\\\\w\\\\$_])`,\n 'g',\n );\n}\n\n/**\n * Replaces all occurrences of external names in WGSL code with their resolved values.\n * It adds all necessary definitions to the resolution context.\n * @param ctx - The resolution context.\n * @param externalMap - The external map.\n * @param wgsl - The WGSL code.\n *\n * @returns The WGSL code with all external names replaced with their resolved values.\n */\nexport function replaceExternalsInWgsl(\n ctx: ResolutionCtx,\n externalMap: ExternalMap,\n wgsl: string,\n): string {\n return Object.entries(externalMap).reduce((acc, [externalName, external]) => {\n const externalRegex = identifierRegex(externalName);\n if (\n wgsl &&\n externalName !== 'Out' &&\n externalName !== 'In' &&\n !externalRegex.test(wgsl)\n ) {\n console.warn(\n `The external '${externalName}' wasn't used in the resolved template.`,\n );\n // continue anyway, we still might need to resolve the external\n }\n\n if (\n isWgsl(external) || isLooseData(external) || hasTinyestMetadata(external)\n ) {\n return acc.replaceAll(externalRegex, ctx.resolve(external).value);\n }\n\n if (external !== null && typeof external === 'object') {\n const foundProperties = [\n ...wgsl.matchAll(\n new RegExp(\n `${\n externalName.replaceAll('.', '\\\\.').replaceAll('$', '\\\\$')\n }\\\\.(?<prop>.*?)(?![\\\\w\\\\$_])`,\n 'g',\n ),\n ),\n ].map((found) => found[1]);\n const uniqueProperties = [...new Set(foundProperties)];\n\n return uniqueProperties.reduce(\n (innerAcc: string, prop) =>\n prop && prop in external\n ? replaceExternalsInWgsl(\n ctx,\n {\n [`${externalName}.${prop}`]:\n external[prop as keyof typeof external],\n },\n innerAcc,\n )\n : innerAcc,\n acc,\n );\n }\n\n console.warn(\n `During resolution, the external '${externalName}' has been omitted. Only primitives, TGPU resources and plain JS objects can be used as externals.`,\n );\n\n return acc;\n }, wgsl);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as D,
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as D,ib as O}from"./chunk-2UXPGML5.js";import{C as y,D as f,E as m,F as d,L as x,La as P,R as g,S as T,T as A,W as B,Wa as l,a as o,aa as I,j as W,k as w,qc as h}from"./chunk-4W5Z7BO4.js";function E(t){return u("function",t,"read-write")}function V(t){return u("private",t,"read-write")}function U(t){return u("workgroup",t,"read-write")}function $(t,e="read"){return u("storage",t,e)}function C(t){return u("uniform",t,"read")}function L(t){return u("handle",t,"read")}function u(t,e,r){return{[o]:!0,type:"ptr",addressSpace:t,inner:e,access:r}}var k=P(((t,e)=>e===void 0?r=>b(t,r):b(t,e)),(t,e)=>{if(e===void 0||e.value===void 0){let r=a=>k[o].gpuImpl(t,a);return r[o]=!0,I(r,B)}if(typeof e.value!="number")throw new Error(`Cannot create disarray schema with count unknown at compile-time: '${e.value}'`);return I(b(t.value,e.value),t.value)},"disarrayOf");function b(t,e){let r=a=>{if(a&&a.length!==e)throw new Error(`Disarray schema of ${e} elements of type ${t.type} called with ${a.length} argument(s).`);return Array.from({length:e},(s,n)=>h(t,a?.[n]))};if(Object.setPrototypeOf(r,M),r.elementType=t,!Number.isInteger(e)||e<0)throw new Error(`Cannot create disarray schema with invalid element count: ${e}.`);return r.elementCount=e,r}var M={[o]:!0,type:"disarray",toString(){return`disarrayOf(${this.elementType}, ${this.elementCount})`}};function j(t){let e=r=>Object.fromEntries(Object.entries(t).map(([a,s])=>[a,h(s,r?.[a])]));return Object.setPrototypeOf(e,F),e.propTypes=t,e}var F={[o]:!0,type:"unstruct",$name(t){return w(this,t),this},toString(){return`unstruct:${W(this)??"<unnamed>"}`}};function c(t,e){if(t===e)return!0;if(t.type!==e.type)return!1;if(f(t)&&f(e)||T(t)&&T(e)){let r=t.propTypes,a=e.propTypes,s=Object.keys(r),n=Object.keys(a);if(s.length!==n.length)return!1;for(let i=0;i<s.length;i++){let S=s[i],v=n[i];if(S!==v||!S||!v||!c(r[S],a[v]))return!1}return!0}if(y(t)&&y(e)||g(t)&&g(e))return t.elementCount===e.elementCount&&c(t.elementType,e.elementType);if(m(t)&&m(e))return t.addressSpace===e.addressSpace&&t.access===e.access&&c(t.inner,e.inner);if(d(t)&&d(e))return c(t.inner,e.inner);if(x(t)&&x(e)||A(t)&&A(e)){if(!c(t.inner,e.inner)||t.attribs.length!==e.attribs.length)return!1;let r=n=>{let i=n;return`${i.type}(${(i.params??[]).join(",")})`},a=t.attribs.map(r),s=e.attribs.map(r);for(let n=0;n<a.length;n++)if(a[n]!==s[n])return!1}return!0}function p(t,e){let r=t.prototype,a=O[e][o].jsImpl;r[e]=function(s){return a(this,s)}}p(l,"add");p(l,"sub");p(l,"mul");p(l,"div");p(D,"add");p(D,"sub");p(D,"mul");export{E as a,V as b,U as c,$ as d,C as e,L as f,k as g,j as h,c as i};
|
|
2
|
+
//# sourceMappingURL=chunk-7S3IK3D4.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{B as P,D as I,M as N,P as _,Q as U,U as T,V as H,a as L,aa as y,c as D,f as W,ga as K,j as g,k as h,l as k,
|
|
1
|
+
import{B as P,D as I,M as N,P as _,Q as U,U as T,V as H,a as L,aa as y,c as D,f as W,ga as K,j as g,k as h,l as k,lc as w,m as M,n as j,oc as q,pc as J,q as C,rc as z,va as G}from"./chunk-4W5Z7BO4.js";import{FuncParameterType as ee}from"tinyest";function S(n,e){for(let[r,t]of Object.entries(e))n[r]=t,t&&(typeof t=="object"||typeof t=="function")&&g(t)===void 0&&h(t,r)}function Se(n,e,r){let t=[...n.matchAll(/:\s*(?<arg>.*?)\s*[,)]/g)].map(s=>s?s[1]:void 0);r(Object.fromEntries(e.flatMap((s,i)=>{let o=t?t[i]:void 0;return I(s)&&o!==void 0?[[o,s]]:[]})))}function $e(n,e,r){let t=n.match(/->\s(?<output>[\w\d_]+)\s{/),s=t?t[1]?.trim():void 0;I(e)&&s&&!/\s/g.test(s)&&r({[s]:e})}function ue(n){return new RegExp(`(?<![\\w\\$_.])${n.replaceAll(".","\\.").replaceAll("$","\\$")}(?![\\w\\$_])`,"g")}function R(n,e,r){return Object.entries(e).reduce((t,[s,i])=>{let o=ue(s);if(r&&s!=="Out"&&s!=="In"&&!o.test(r)&&console.warn(`The external '${s}' wasn't used in the resolved template.`),G(i)||U(i)||M(i))return t.replaceAll(o,n.resolve(i).value);if(i!==null&&typeof i=="object"){let a=[...r.matchAll(new RegExp(`${s.replaceAll(".","\\.").replaceAll("$","\\$")}\\.(?<prop>.*?)(?![\\w\\$_])`,"g"))].map(d=>d[1]);return[...new Set(a)].reduce((d,f)=>f&&f in i?R(n,{[`${s}.${f}`]:i[f]},d):d,t)}return console.warn(`During resolution, the external '${s}' has been omitted. Only primitives, TGPU resources and plain JS objects can be used as externals.`),t},r)}function Y(n){let{strippedCode:e,argRange:r}=pe(n),t=new $(e);t.consume("(");let s=[];for(;!t.isAt(")");){let o=[];for(;t.isAt("@");)t.parseUntil(Q,X),t.consume(")"),o.push(t.lastParsed);t.parseUntil(ce);let a=t.lastParsed,l;t.isAt(":")&&(t.consume(":"),t.parseUntil(de,fe),l=t.lastParsed),s.push({identifier:a,attributes:o,type:l}),t.isAt(",")&&t.consume(",")}t.consume(")");let i;if(t.isAt("->")){t.consume("->");let o=[];for(;t.isAt("@");)t.parseUntil(Q,X),t.consume(")"),o.push(t.lastParsed);i={type:t.str.slice(t.pos),attributes:o}}return{args:s,ret:i,range:{begin:r[0],end:r[1]}}}function pe(n){let e=new $(n),r="",t;for(;!e.isFinished();){if(e.isAt(le)){e.advanceBy(1);continue}if(e.isAt("//")){e.consume("//"),e.parseUntil(Z),e.advanceBy(1);continue}if(e.isAt("/*")){e.parseUntil(me,ge),e.consume("*/");continue}if(e.isAt("{"))return{strippedCode:r,argRange:[t,e.pos]};e.isAt("(")&&t===void 0&&(t=e.pos),t!==void 0&&(r+=e.str[e.pos]),e.advanceBy(1)}throw new Error("Invalid wgsl code!")}var $=class{constructor(e){this.str=e;this.#e=0}#t;#e;get pos(){return this.#e}get lastParsed(){if(this.#t===void 0)throw new Error("Parse was not called yet!");return this.str.slice(this.#t,this.pos)}isFinished(){return this.#e>=this.str.length}isAt(e){if(typeof e=="string"){for(let r=0;r<e.length;r++)if(this.str[this.#e+r]!==e[r])return!1;return!0}for(let r of e)if(this.isAt(r))return!0;return!1}parseUntil(e,r){this.#t=this.#e;let t=0;for(;this.#e<this.str.length;){if(r&&this.isAt(r[0])&&(t+=1),r&&this.isAt(r[1])&&(t-=1),t===0&&this.isAt(e))return this.#e;this.#e+=1}throw new Error("Reached the end of the string without finding a match!")}advanceBy(e){this.#e+=e}consume(e){if(!this.isAt(e))throw new Error(`Expected '${e}' at position ${this.#e}, but found '${this.str.slice(this.#e,this.#e+e.length)}'`);this.advanceBy(e.length)}},Z=new Set([`
|
|
2
2
|
`,"\v","\f","\r","\x85","\u2028","\u2029"]),le=new Set([...Z," "," ","\u200E","\u200F"]),Q=new Set([")"]),ce=new Set([":",",",")"]),de=new Set([",",")"]),me=new Set(["*/"]),X=["(",")"],fe=["<",">"],ge=["/*","*/"];function ne(n,e=""){let r=[],t={applyExternals(i){r.push(i)},resolve(i,o,a){let l={};for(let u of r)S(l,u);let d=i.getUniqueName(this);if(typeof n=="string"){if(!a)throw new Error("Explicit return type is required for string implementation");let u=R(i,l,n),m="",x="";if(e!==""){let p=I(o[0])?`(in: ${i.resolve(o[0]).value})`:"()",c=P(a)?J(a):"",b=a!==C?I(a)?`-> ${i.resolve(a).value}`:`-> ${c!==""?c:"@location(0)"} ${i.resolve(a).value}`:"";m=`${p} ${b} `,x=u}else{let p=Y(u);if(p.args.length!==o.length)throw new Error(`WGSL implementation has ${p.args.length} arguments, while the shell has ${o.length} arguments.`);let c=p.args.map((E,ae)=>`${E.identifier}: ${te(i,`parameter ${E.identifier}`,E.type,o[ae])}`).join(", "),b=a===C?"":`-> ${te(i,"return type",p.ret?.type,a)}`;m=`(${c}) ${b}`,x=u.slice(p.range.end)}return i.addDeclaration(`${e}fn ${d}${m}${x}`),y(d,a)}let f=j(n);if(f?.externals){let u=Object.fromEntries(Object.entries(f.externals).filter(([m])=>!(m in l)));S(l,u)}let O=f?.ast;if(!O)throw new Error("Missing metadata for tgpu.fn function body (either missing 'use gpu' directive, or misconfigured `unplugin-typegpu`)");let B=O.externalNames.filter(u=>!(u in l));if(B.length>0)throw new K(g(this),B);let A=O.params[1];A&&A.type==="i"&&e!==""&&S(l,{[A.name]:_(a)});let V=[],v=[];for(let[u,m]of o.entries()){let x=O.params[u];switch(x?.type){case ee.identifier:{let p=x.name,c=y(i.makeNameValid(p),m);V.push(c),c.value!==p&&v.push([p,c]);break}case ee.destructuredObject:{V.push(y(`_arg_${u}`,m)),v.push(...x.props.map(({name:p,alias:c})=>[c,y(`_arg_${u}.${p}`,o[u].propTypes[p])]));break}case void 0:V.push(y(`_arg_${u}`,m))}}let{head:ie,body:se,returnType:oe}=i.fnToWgsl({args:V,argAliases:Object.fromEntries(v),returnType:a,body:O.body,externalMap:l});return i.addDeclaration(`${e}fn ${d}${i.resolve(ie).value}${i.resolve(se).value}`),y(d,oe)}},s=g(n);return s!==void 0&&h(t,s),t}function te(n,e,r,t){let s=n.resolve(t).value.replace(/\s/g,"");if(!r)return s;let i=r.replace(/\s/g,"");if(i!==s)throw new Error(`Type mismatch between TGPU shell and WGSL code string: ${e}, JS type "${s}", WGSL type "${i}".`);return r}function xe(n,e={}){let r=0,t=new Set;return Object.fromEntries(Object.entries(n??{}).map(([s,i])=>{let o=T(i);if(o!==void 0){if(t.has(o))throw new Error("Duplicate custom location attributes found");t.add(o)}return[s,i]}).map(([s,i])=>{if(q(i))return[s,i];if(T(i)!==void 0)return[s,i];if(e[s])return[s,w(e[s],i)];for(;t.has(r);)r++;return[s,w(r++,i)]}))}function F(n,e={}){return H(n)?N(n)||T(n)!==void 0?n:w(0,n):z(xe(n,e))}function re(n,...e){return ye(n)?he(n,...e):n}function ye(n){return Array.isArray(n)&&"raw"in n&&Array.isArray(n.raw)&&n.raw.every(e=>typeof e=="string")}function he(n,...e){return n.slice(1).reduce((r,t,s)=>`${r}${e[s]}${t}`,n[0])}function Qe(n){if(Object.keys(n.out).length===0)throw new Error("A vertexFn output cannot be empty since it must include the 'position' builtin.");let e={in:n.in,out:n.out,argTypes:n.in&&Object.keys(n.in).length!==0?[F(n.in)]:[],isEntry:!0},r=(t,...s)=>Ie(e,re(t,...s));return Object.assign(Object.assign(r,e),{does:r})}function Ie(n,e){let r=ne(e,"@vertex "),t=n.argTypes[0];return{shell:n,$uses(i){return r.applyExternals(i),this},[L]:!0,[D]:r,$name(i){return h(r,i),k(t)&&t.$name(`${i}_Input`),this},[W](i){let o=F(n.out,i.varyingLocations).$name(`${g(this)??""}_Output`);return typeof e=="string"&&(t&&r.applyExternals({In:t}),r.applyExternals({Out:o})),r.resolve(i,n.argTypes,o)},toString(){return`vertexFn:${g(r)??"<unnamed>"}`}}}export{S as a,Se as b,$e as c,R as d,ne as e,F as f,re as g,Qe as h};
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
//# sourceMappingURL=chunk-7XFSK632.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkZYGTVBDHcjs = require('./chunk-ZYGTVBDH.cjs');var _chunkTRE7NUKEcjs = require('./chunk-TRE7NUKE.cjs');function E(t){return u("function",t,"read-write")}function V(t){return u("private",t,"read-write")}function U(t){return u("workgroup",t,"read-write")}function $(t,e="read"){return u("storage",t,e)}function C(t){return u("uniform",t,"read")}function L(t){return u("handle",t,"read")}function u(t,e,r){return{[_chunkTRE7NUKEcjs.a]:!0,type:"ptr",addressSpace:t,inner:e,access:r}}var k=_chunkTRE7NUKEcjs.La.call(void 0, ((t,e)=>e===void 0?r=>b(t,r):b(t,e)),(t,e)=>{if(e===void 0||e.value===void 0){let r=a=>k[_chunkTRE7NUKEcjs.a].gpuImpl(t,a);return r[_chunkTRE7NUKEcjs.a]=!0,_chunkTRE7NUKEcjs.aa.call(void 0, r,_chunkTRE7NUKEcjs.W)}if(typeof e.value!="number")throw new Error(`Cannot create disarray schema with count unknown at compile-time: '${e.value}'`);return _chunkTRE7NUKEcjs.aa.call(void 0, b(t.value,e.value),t.value)},"disarrayOf");function b(t,e){let r=a=>{if(a&&a.length!==e)throw new Error(`Disarray schema of ${e} elements of type ${t.type} called with ${a.length} argument(s).`);return Array.from({length:e},(s,n)=>_chunkTRE7NUKEcjs.qc.call(void 0, t,_optionalChain([a, 'optionalAccess', _ => _[n]])))};if(Object.setPrototypeOf(r,M),r.elementType=t,!Number.isInteger(e)||e<0)throw new Error(`Cannot create disarray schema with invalid element count: ${e}.`);return r.elementCount=e,r}var M={[_chunkTRE7NUKEcjs.a]:!0,type:"disarray",toString(){return`disarrayOf(${this.elementType}, ${this.elementCount})`}};function j(t){let e=r=>Object.fromEntries(Object.entries(t).map(([a,s])=>[a,_chunkTRE7NUKEcjs.qc.call(void 0, s,_optionalChain([r, 'optionalAccess', _2 => _2[a]]))]));return Object.setPrototypeOf(e,F),e.propTypes=t,e}var F={[_chunkTRE7NUKEcjs.a]:!0,type:"unstruct",$name(t){return _chunkTRE7NUKEcjs.k.call(void 0, this,t),this},toString(){return`unstruct:${_nullishCoalesce(_chunkTRE7NUKEcjs.j.call(void 0, this), () => ("<unnamed>"))}`}};function c(t,e){if(t===e)return!0;if(t.type!==e.type)return!1;if(_chunkTRE7NUKEcjs.D.call(void 0, t)&&_chunkTRE7NUKEcjs.D.call(void 0, e)||_chunkTRE7NUKEcjs.S.call(void 0, t)&&_chunkTRE7NUKEcjs.S.call(void 0, e)){let r=t.propTypes,a=e.propTypes,s=Object.keys(r),n=Object.keys(a);if(s.length!==n.length)return!1;for(let i=0;i<s.length;i++){let S=s[i],v=n[i];if(S!==v||!S||!v||!c(r[S],a[v]))return!1}return!0}if(_chunkTRE7NUKEcjs.C.call(void 0, t)&&_chunkTRE7NUKEcjs.C.call(void 0, e)||_chunkTRE7NUKEcjs.R.call(void 0, t)&&_chunkTRE7NUKEcjs.R.call(void 0, e))return t.elementCount===e.elementCount&&c(t.elementType,e.elementType);if(_chunkTRE7NUKEcjs.E.call(void 0, t)&&_chunkTRE7NUKEcjs.E.call(void 0, e))return t.addressSpace===e.addressSpace&&t.access===e.access&&c(t.inner,e.inner);if(_chunkTRE7NUKEcjs.F.call(void 0, t)&&_chunkTRE7NUKEcjs.F.call(void 0, e))return c(t.inner,e.inner);if(_chunkTRE7NUKEcjs.L.call(void 0, t)&&_chunkTRE7NUKEcjs.L.call(void 0, e)||_chunkTRE7NUKEcjs.T.call(void 0, t)&&_chunkTRE7NUKEcjs.T.call(void 0, e)){if(!c(t.inner,e.inner)||t.attribs.length!==e.attribs.length)return!1;let r=n=>{let i=n;return`${i.type}(${(_nullishCoalesce(i.params, () => ([]))).join(",")})`},a=t.attribs.map(r),s=e.attribs.map(r);for(let n=0;n<a.length;n++)if(a[n]!==s[n])return!1}return!0}function p(t,e){let r=t.prototype,a=_chunkZYGTVBDHcjs.ib[e][_chunkTRE7NUKEcjs.a].jsImpl;r[e]=function(s){return a(this,s)}}p(_chunkTRE7NUKEcjs.Wa,"add");p(_chunkTRE7NUKEcjs.Wa,"sub");p(_chunkTRE7NUKEcjs.Wa,"mul");p(_chunkTRE7NUKEcjs.Wa,"div");p(_chunkZYGTVBDHcjs.a,"add");p(_chunkZYGTVBDHcjs.a,"sub");p(_chunkZYGTVBDHcjs.a,"mul");exports.a = E; exports.b = V; exports.c = U; exports.d = $; exports.e = C; exports.f = L; exports.g = k; exports.h = j; exports.i = c;
|
|
2
|
+
//# sourceMappingURL=chunk-PRMFGUQT.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-WDMOZFKN.cjs","../src/data/ptr.ts","../src/data/disarray.ts","../src/data/unstruct.ts"],"names":["ptrFn","inner","INTERNAL_createPtr","ptrPrivate","ptrWorkgroup","ptrStorage","access","ptrUniform","ptrHandle","addressSpace","$internal","disarrayOf","createDualImpl","elementType","elementCount","count","cpu_disarrayOf","partial","snip","UnknownData","disarraySchema","elements","_","i","schemaCallWrapper","DisarrayImpl","unstruct","properties","unstructSchema","instanceProps","key","schema","UnstructImpl","label","setName","getName"],"mappings":"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","file":"/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-WDMOZFKN.cjs","sourcesContent":[null,"import { $internal } from '../shared/symbols.ts';\nimport type { Access, AddressSpace, Ptr, StorableData } from './wgslTypes.ts';\n\nexport function ptrFn<T extends StorableData>(\n inner: T,\n): Ptr<'function', T, 'read-write'> {\n return INTERNAL_createPtr('function', inner, 'read-write');\n}\n\nexport function ptrPrivate<T extends StorableData>(\n inner: T,\n): Ptr<'private', T, 'read-write'> {\n return INTERNAL_createPtr('private', inner, 'read-write');\n}\n\nexport function ptrWorkgroup<T extends StorableData>(\n inner: T,\n): Ptr<'workgroup', T, 'read-write'> {\n return INTERNAL_createPtr('workgroup', inner, 'read-write');\n}\n\nexport function ptrStorage<\n T extends StorableData,\n TAccess extends 'read' | 'read-write' = 'read',\n>(inner: T, access: TAccess = 'read' as TAccess): Ptr<'storage', T, TAccess> {\n return INTERNAL_createPtr('storage', inner, access);\n}\n\nexport function ptrUniform<T extends StorableData>(\n inner: T,\n): Ptr<'uniform', T, 'read'> {\n return INTERNAL_createPtr('uniform', inner, 'read');\n}\n\nexport function ptrHandle<T extends StorableData>(\n inner: T,\n): Ptr<'handle', T, 'read'> {\n return INTERNAL_createPtr('handle', inner, 'read');\n}\n\nfunction INTERNAL_createPtr<\n TAddressSpace extends AddressSpace,\n TInner extends StorableData,\n TAccess extends Access,\n>(\n addressSpace: TAddressSpace,\n inner: TInner,\n access: TAccess,\n): Ptr<TAddressSpace, TInner, TAccess> {\n return {\n [$internal]: true,\n type: 'ptr',\n addressSpace,\n inner,\n access,\n } as Ptr<TAddressSpace, TInner, TAccess>;\n}\n","import { createDualImpl } from '../core/function/dualImpl.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { UnknownData } from './dataTypes.ts';\nimport { snip, type Snippet } from './snippet.ts';\nimport type { AnyData, Disarray } from './dataTypes.ts';\nimport { schemaCallWrapper } from './schemaCallWrapper.ts';\nimport type { AnyWgslData } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\ninterface DisarrayConstructor {\n <TElement extends AnyData>(\n elementType: TElement,\n ): (elementCount: number) => Disarray<TElement>;\n\n <TElement extends AnyData>(\n elementType: TElement,\n elementCount: number,\n ): Disarray<TElement>;\n}\n\n/**\n * Creates an array schema that can be used to construct vertex buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const disarray = d.disarrayOf(d.vec3f, 3); // packed array of vec3f\n *\n * @example\n * const disarray = d.disarrayOf(d.align(16, d.vec3f), 3);\n *\n * If `elementCount` is not specified, a partially applied function is returned.\n * @example\n * const disarray = d.disarrayOf(d.vec3f);\n * // ^? (n: number) => Disarray<d.Vec3f>\n *\n * @param elementType The type of elements in the array.\n * @param elementCount The number of elements in the array.\n */\nexport const disarrayOf = createDualImpl(\n // JS implementation\n ((elementType, elementCount) => {\n if (elementCount === undefined) {\n return (count: number) => cpu_disarrayOf(elementType, count);\n }\n return cpu_disarrayOf(elementType, elementCount);\n }) as DisarrayConstructor,\n // CODEGEN implementation\n (elementType, elementCount) => {\n if (elementCount === undefined || elementCount.value === undefined) {\n const partial = (count: Snippet) =>\n disarrayOf[$internal].gpuImpl(elementType, count);\n // Marking so the WGSL generator lets this function through\n partial[$internal] = true;\n\n return snip(partial, UnknownData);\n }\n\n if (typeof elementCount.value !== 'number') {\n throw new Error(\n `Cannot create disarray schema with count unknown at compile-time: '${elementCount.value}'`,\n );\n }\n\n return snip(\n cpu_disarrayOf(elementType.value as AnyWgslData, elementCount.value),\n elementType.value as AnyWgslData,\n );\n },\n 'disarrayOf',\n);\n\nexport function cpu_disarrayOf<TElement extends AnyData>(\n elementType: TElement,\n elementCount: number,\n): Disarray<TElement> {\n // In the schema call, create and return a deep copy\n // by wrapping all the values in `elementType` schema calls.\n const disarraySchema = (elements?: TElement[]) => {\n if (elements && elements.length !== elementCount) {\n throw new Error(\n `Disarray schema of ${elementCount} elements of type ${elementType.type} called with ${elements.length} argument(s).`,\n );\n }\n\n return Array.from(\n { length: elementCount },\n (_, i) => schemaCallWrapper(elementType, elements?.[i]),\n );\n };\n Object.setPrototypeOf(disarraySchema, DisarrayImpl);\n\n disarraySchema.elementType = elementType;\n\n if (!Number.isInteger(elementCount) || elementCount < 0) {\n throw new Error(\n `Cannot create disarray schema with invalid element count: ${elementCount}.`,\n );\n }\n disarraySchema.elementCount = elementCount;\n\n return disarraySchema as unknown as Disarray<TElement>;\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DisarrayImpl = {\n [$internal]: true,\n type: 'disarray',\n\n toString(this: Disarray): string {\n return `disarrayOf(${this.elementType}, ${this.elementCount})`;\n },\n};\n","import { getName, setName } from '../shared/meta.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport type { AnyData, Unstruct } from './dataTypes.ts';\nimport { schemaCallWrapper } from './schemaCallWrapper.ts';\nimport type { BaseData } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Creates a loose struct schema that can be used to construct vertex buffers.\n * Describes structs with members of both loose and non-loose types.\n *\n * The order of members matches the passed in properties object.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const CircleStruct = d.unstruct({ radius: d.f32, pos: d.vec3f }); // packed struct with no padding\n *\n * @example\n * const CircleStruct = d.unstruct({ radius: d.f32, pos: d.align(16, d.vec3f) });\n *\n * @param properties Record with `string` keys and `TgpuData` or `TgpuLooseData` values,\n * each entry describing one struct member.\n */\nexport function unstruct<TProps extends Record<string, BaseData>>(\n properties: TProps,\n): Unstruct<TProps> {\n // In the schema call, create and return a deep copy\n // by wrapping all the values in corresponding schema calls.\n const unstructSchema = (instanceProps?: TProps) =>\n Object.fromEntries(\n Object.entries(properties).map(([key, schema]) => [\n key,\n schemaCallWrapper(schema as AnyData, instanceProps?.[key]),\n ]),\n );\n Object.setPrototypeOf(unstructSchema, UnstructImpl);\n unstructSchema.propTypes = properties;\n\n return unstructSchema as unknown as Unstruct<TProps>;\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst UnstructImpl = {\n [$internal]: true,\n type: 'unstruct',\n\n $name(label: string) {\n setName(this, label);\n return this;\n },\n\n toString(): string {\n return `unstruct:${getName(this) ?? '<unnamed>'}`;\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-PRMFGUQT.cjs","../src/data/ptr.ts","../src/data/disarray.ts","../src/data/unstruct.ts"],"names":["ptrFn","inner","INTERNAL_createPtr","ptrPrivate","ptrWorkgroup","ptrStorage","access","ptrUniform","ptrHandle","addressSpace","$internal","disarrayOf","createDualImpl","elementType","elementCount","count","cpu_disarrayOf","partial","snip","UnknownData","disarraySchema","elements","_","i","schemaCallWrapper","DisarrayImpl","unstruct","properties","unstructSchema","instanceProps","key","schema","UnstructImpl","label","setName","getName"],"mappings":"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","file":"/Users/iwo/Projects/wigsill/packages/typegpu/dist/chunk-PRMFGUQT.cjs","sourcesContent":[null,"import { $internal } from '../shared/symbols.ts';\nimport type { Access, AddressSpace, Ptr, StorableData } from './wgslTypes.ts';\n\nexport function ptrFn<T extends StorableData>(\n inner: T,\n): Ptr<'function', T, 'read-write'> {\n return INTERNAL_createPtr('function', inner, 'read-write');\n}\n\nexport function ptrPrivate<T extends StorableData>(\n inner: T,\n): Ptr<'private', T, 'read-write'> {\n return INTERNAL_createPtr('private', inner, 'read-write');\n}\n\nexport function ptrWorkgroup<T extends StorableData>(\n inner: T,\n): Ptr<'workgroup', T, 'read-write'> {\n return INTERNAL_createPtr('workgroup', inner, 'read-write');\n}\n\nexport function ptrStorage<\n T extends StorableData,\n TAccess extends 'read' | 'read-write' = 'read',\n>(inner: T, access: TAccess = 'read' as TAccess): Ptr<'storage', T, TAccess> {\n return INTERNAL_createPtr('storage', inner, access);\n}\n\nexport function ptrUniform<T extends StorableData>(\n inner: T,\n): Ptr<'uniform', T, 'read'> {\n return INTERNAL_createPtr('uniform', inner, 'read');\n}\n\nexport function ptrHandle<T extends StorableData>(\n inner: T,\n): Ptr<'handle', T, 'read'> {\n return INTERNAL_createPtr('handle', inner, 'read');\n}\n\nfunction INTERNAL_createPtr<\n TAddressSpace extends AddressSpace,\n TInner extends StorableData,\n TAccess extends Access,\n>(\n addressSpace: TAddressSpace,\n inner: TInner,\n access: TAccess,\n): Ptr<TAddressSpace, TInner, TAccess> {\n return {\n [$internal]: true,\n type: 'ptr',\n addressSpace,\n inner,\n access,\n } as Ptr<TAddressSpace, TInner, TAccess>;\n}\n","import { createDualImpl } from '../core/function/dualImpl.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { UnknownData } from './dataTypes.ts';\nimport { snip, type Snippet } from './snippet.ts';\nimport type { AnyData, Disarray } from './dataTypes.ts';\nimport { schemaCallWrapper } from './schemaCallWrapper.ts';\nimport type { AnyWgslData } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\ninterface DisarrayConstructor {\n <TElement extends AnyData>(\n elementType: TElement,\n ): (elementCount: number) => Disarray<TElement>;\n\n <TElement extends AnyData>(\n elementType: TElement,\n elementCount: number,\n ): Disarray<TElement>;\n}\n\n/**\n * Creates an array schema that can be used to construct vertex buffers.\n * Describes arrays with fixed-size length, storing elements of the same type.\n *\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const disarray = d.disarrayOf(d.vec3f, 3); // packed array of vec3f\n *\n * @example\n * const disarray = d.disarrayOf(d.align(16, d.vec3f), 3);\n *\n * If `elementCount` is not specified, a partially applied function is returned.\n * @example\n * const disarray = d.disarrayOf(d.vec3f);\n * // ^? (n: number) => Disarray<d.Vec3f>\n *\n * @param elementType The type of elements in the array.\n * @param elementCount The number of elements in the array.\n */\nexport const disarrayOf = createDualImpl(\n // JS implementation\n ((elementType, elementCount) => {\n if (elementCount === undefined) {\n return (count: number) => cpu_disarrayOf(elementType, count);\n }\n return cpu_disarrayOf(elementType, elementCount);\n }) as DisarrayConstructor,\n // CODEGEN implementation\n (elementType, elementCount) => {\n if (elementCount === undefined || elementCount.value === undefined) {\n const partial = (count: Snippet) =>\n disarrayOf[$internal].gpuImpl(elementType, count);\n // Marking so the WGSL generator lets this function through\n partial[$internal] = true;\n\n return snip(partial, UnknownData);\n }\n\n if (typeof elementCount.value !== 'number') {\n throw new Error(\n `Cannot create disarray schema with count unknown at compile-time: '${elementCount.value}'`,\n );\n }\n\n return snip(\n cpu_disarrayOf(elementType.value as AnyWgslData, elementCount.value),\n elementType.value as AnyWgslData,\n );\n },\n 'disarrayOf',\n);\n\nexport function cpu_disarrayOf<TElement extends AnyData>(\n elementType: TElement,\n elementCount: number,\n): Disarray<TElement> {\n // In the schema call, create and return a deep copy\n // by wrapping all the values in `elementType` schema calls.\n const disarraySchema = (elements?: TElement[]) => {\n if (elements && elements.length !== elementCount) {\n throw new Error(\n `Disarray schema of ${elementCount} elements of type ${elementType.type} called with ${elements.length} argument(s).`,\n );\n }\n\n return Array.from(\n { length: elementCount },\n (_, i) => schemaCallWrapper(elementType, elements?.[i]),\n );\n };\n Object.setPrototypeOf(disarraySchema, DisarrayImpl);\n\n disarraySchema.elementType = elementType;\n\n if (!Number.isInteger(elementCount) || elementCount < 0) {\n throw new Error(\n `Cannot create disarray schema with invalid element count: ${elementCount}.`,\n );\n }\n disarraySchema.elementCount = elementCount;\n\n return disarraySchema as unknown as Disarray<TElement>;\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst DisarrayImpl = {\n [$internal]: true,\n type: 'disarray',\n\n toString(this: Disarray): string {\n return `disarrayOf(${this.elementType}, ${this.elementCount})`;\n },\n};\n","import { getName, setName } from '../shared/meta.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport type { AnyData, Unstruct } from './dataTypes.ts';\nimport { schemaCallWrapper } from './schemaCallWrapper.ts';\nimport type { BaseData } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Creates a loose struct schema that can be used to construct vertex buffers.\n * Describes structs with members of both loose and non-loose types.\n *\n * The order of members matches the passed in properties object.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n *\n * @example\n * const CircleStruct = d.unstruct({ radius: d.f32, pos: d.vec3f }); // packed struct with no padding\n *\n * @example\n * const CircleStruct = d.unstruct({ radius: d.f32, pos: d.align(16, d.vec3f) });\n *\n * @param properties Record with `string` keys and `TgpuData` or `TgpuLooseData` values,\n * each entry describing one struct member.\n */\nexport function unstruct<TProps extends Record<string, BaseData>>(\n properties: TProps,\n): Unstruct<TProps> {\n // In the schema call, create and return a deep copy\n // by wrapping all the values in corresponding schema calls.\n const unstructSchema = (instanceProps?: TProps) =>\n Object.fromEntries(\n Object.entries(properties).map(([key, schema]) => [\n key,\n schemaCallWrapper(schema as AnyData, instanceProps?.[key]),\n ]),\n );\n Object.setPrototypeOf(unstructSchema, UnstructImpl);\n unstructSchema.propTypes = properties;\n\n return unstructSchema as unknown as Unstruct<TProps>;\n}\n\n// --------------\n// Implementation\n// --------------\n\nconst UnstructImpl = {\n [$internal]: true,\n type: 'unstruct',\n\n $name(label: string) {\n setName(this, label);\n return this;\n },\n\n toString(): string {\n return `unstruct:${getName(this) ?? '<unnamed>'}`;\n },\n};\n"]}
|