typegpu 0.11.9 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builtin.d.ts +51 -53
- package/builtin.js +30 -34
- package/common/fullScreenTriangle.d.ts +2 -10
- package/common/fullScreenTriangle.js +20 -28
- package/common/index.d.ts +2 -9
- package/common/index.js +3 -12
- package/common/writeSoA.d.ts +11 -12
- package/common/writeSoA.js +88 -76
- package/core/buffer/buffer.d.ts +79 -62
- package/core/buffer/buffer.js +279 -205
- package/core/buffer/bufferBinding.d.ts +71 -0
- package/core/buffer/bufferBinding.js +154 -0
- package/core/buffer/bufferUsage.d.ts +14 -45
- package/core/buffer/bufferUsage.js +1 -171
- package/core/buffer/laidOutBuffer.d.ts +25 -0
- package/core/buffer/laidOutBuffer.js +55 -0
- package/core/commandEncoder/attachments.d.ts +125 -0
- package/core/commandEncoder/attachments.js +29 -0
- package/core/commandEncoder/commandEncoder.d.ts +53 -0
- package/core/commandEncoder/commandEncoder.js +56 -0
- package/core/commandEncoder/computePass.d.ts +58 -0
- package/core/commandEncoder/computePass.js +63 -0
- package/core/commandEncoder/renderPass.d.ts +121 -0
- package/core/commandEncoder/renderPass.js +196 -0
- package/core/constant/tgpuConstant.d.ts +26 -26
- package/core/constant/tgpuConstant.js +76 -65
- package/core/declare/tgpuDeclare.d.ts +3 -6
- package/core/declare/tgpuDeclare.js +36 -36
- package/core/function/autoIO.d.ts +61 -33
- package/core/function/autoIO.js +68 -73
- package/core/function/comptime.d.ts +11 -13
- package/core/function/comptime.js +60 -52
- package/core/function/createCallableSchema.d.ts +16 -0
- package/core/function/createCallableSchema.js +50 -40
- package/core/function/dualImpl.d.ts +44 -0
- package/core/function/dualImpl.js +71 -50
- package/core/function/entryInputRouter.d.ts +26 -0
- package/core/function/entryInputRouter.js +31 -33
- package/core/function/extractArgs.d.ts +38 -0
- package/core/function/extractArgs.js +202 -200
- package/core/function/fnCore.d.ts +44 -5
- package/core/function/fnCore.js +148 -93
- package/core/function/fnTypes.d.ts +31 -29
- package/core/function/fnTypes.js +1 -0
- package/core/function/ioSchema.d.ts +12 -10
- package/core/function/ioSchema.js +65 -47
- package/core/function/shelllessImpl.d.ts +9 -12
- package/core/function/shelllessImpl.js +17 -22
- package/core/function/templateUtils.d.ts +2 -0
- package/core/function/templateUtils.js +9 -8
- package/core/function/tgpuComputeFn.d.ts +26 -28
- package/core/function/tgpuComputeFn.js +47 -48
- package/core/function/tgpuFn.d.ts +34 -37
- package/core/function/tgpuFn.js +179 -153
- package/core/function/tgpuFragmentFn.d.ts +52 -53
- package/core/function/tgpuFragmentFn.js +63 -56
- package/core/function/tgpuVertexFn.d.ts +36 -39
- package/core/function/tgpuVertexFn.js +56 -53
- package/core/pipeline/computePipeline.d.ts +141 -53
- package/core/pipeline/computePipeline.js +291 -225
- package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
- package/core/pipeline/connectAttachmentToShader.js +25 -22
- package/core/pipeline/connectTargetsToShader.d.ts +3 -0
- package/core/pipeline/connectTargetsToShader.js +29 -27
- package/core/pipeline/drawState.d.ts +52 -0
- package/core/pipeline/drawState.js +225 -0
- package/core/pipeline/limitsOverflow.d.ts +2 -0
- package/core/pipeline/limitsOverflow.js +13 -10
- package/core/pipeline/performanceTracker.d.ts +14 -0
- package/core/pipeline/performanceTracker.js +34 -0
- package/core/pipeline/pipelineUtils.d.ts +18 -0
- package/core/pipeline/pipelineUtils.js +54 -25
- package/core/pipeline/priors.d.ts +1 -0
- package/core/pipeline/priors.js +12 -0
- package/core/pipeline/renderPipeline.d.ts +246 -261
- package/core/pipeline/renderPipeline.js +487 -480
- package/core/pipeline/timeable.d.ts +28 -18
- package/core/pipeline/timeable.js +90 -52
- package/core/pipeline/typeGuards.d.ts +17 -0
- package/core/pipeline/typeGuards.js +52 -22
- package/core/querySet/querySet.d.ts +26 -21
- package/core/querySet/querySet.js +127 -103
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
- package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
- package/core/resolve/externals.d.ts +25 -8
- package/core/resolve/externals.js +78 -54
- package/core/resolve/namespace.d.ts +22 -25
- package/core/resolve/namespace.js +16 -21
- package/core/resolve/resolvableString.d.ts +7 -0
- package/core/resolve/resolvableString.js +13 -0
- package/core/resolve/resolveData.d.ts +10 -0
- package/core/resolve/resolveData.js +162 -121
- package/core/resolve/stitch.d.ts +8 -0
- package/core/resolve/stitch.js +23 -21
- package/core/resolve/tgpuResolve.d.ts +55 -53
- package/core/resolve/tgpuResolve.js +106 -53
- package/core/root/configurableImpl.d.ts +10 -0
- package/core/root/configurableImpl.js +17 -19
- package/core/root/init.d.ts +76 -38
- package/core/root/init.js +346 -455
- package/core/root/rootTypes.d.ts +461 -636
- package/core/root/rootTypes.js +1 -0
- package/core/sampler/sampler.d.ts +50 -31
- package/core/sampler/sampler.js +120 -113
- package/core/simulate/tgpuSimulate.d.ts +9 -12
- package/core/simulate/tgpuSimulate.js +68 -71
- package/core/slot/accessor.d.ts +36 -13
- package/core/slot/accessor.js +138 -91
- package/core/slot/internalSlots.d.ts +2 -0
- package/core/slot/internalSlots.js +1 -6
- package/core/slot/lazy.d.ts +2 -6
- package/core/slot/lazy.js +71 -39
- package/core/slot/slot.d.ts +2 -6
- package/core/slot/slot.js +45 -38
- package/core/slot/slotTypes.d.ts +78 -80
- package/core/slot/slotTypes.js +11 -16
- package/core/texture/externalTexture.d.ts +20 -11
- package/core/texture/externalTexture.js +46 -46
- package/core/texture/texture.d.ts +152 -97
- package/core/texture/texture.js +407 -314
- package/core/texture/textureFormats.d.ts +42 -23
- package/core/texture/textureFormats.js +104 -75
- package/core/texture/textureProps.d.ts +7 -10
- package/core/texture/textureProps.js +1 -0
- package/core/texture/textureUtils.d.ts +8 -0
- package/core/texture/textureUtils.js +185 -179
- package/core/texture/usageExtension.d.ts +21 -18
- package/core/texture/usageExtension.js +13 -17
- package/core/unroll/tgpuUnroll.d.ts +20 -19
- package/core/unroll/tgpuUnroll.js +82 -91
- package/core/valueProxyUtils.d.ts +3 -0
- package/core/valueProxyUtils.js +52 -41
- package/core/variable/tgpuVariable.d.ts +26 -27
- package/core/variable/tgpuVariable.js +93 -96
- package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
- package/core/vertexLayout/connectAttributesToShader.js +61 -56
- package/core/vertexLayout/vertexAttribute.d.ts +21 -17
- package/core/vertexLayout/vertexAttribute.js +1 -0
- package/core/vertexLayout/vertexLayout.d.ts +24 -18
- package/core/vertexLayout/vertexLayout.js +130 -99
- package/core/whitespaces.d.ts +2 -0
- package/core/whitespaces.js +16 -0
- package/data/alignIO.d.ts +7 -0
- package/data/alignIO.js +13 -13
- package/data/alignmentOf.d.ts +5 -8
- package/data/alignmentOf.js +90 -75
- package/data/array.d.ts +6 -9
- package/data/array.js +48 -40
- package/data/atomic.d.ts +2 -7
- package/data/atomic.js +26 -23
- package/data/attributes.d.ts +19 -21
- package/data/attributes.js +192 -132
- package/data/autoStruct.d.ts +36 -3
- package/data/autoStruct.js +84 -81
- package/data/compiledIO.d.ts +5 -0
- package/data/compiledIO.js +231 -215
- package/data/dataIO.d.ts +13 -11
- package/data/dataIO.js +643 -589
- package/data/dataTypes.d.ts +83 -65
- package/data/dataTypes.js +66 -68
- package/data/deepEqual.d.ts +2 -7
- package/data/deepEqual.js +80 -55
- package/data/disarray.d.ts +6 -10
- package/data/disarray.js +52 -46
- package/data/float16Conversion.d.ts +4 -0
- package/data/float16Conversion.js +7 -0
- package/data/getLongestContiguousPrefix.d.ts +4 -8
- package/data/getLongestContiguousPrefix.js +6 -11
- package/data/index.d.ts +30 -31
- package/data/index.js +39 -172
- package/data/instanceToSchema.d.ts +24 -27
- package/data/instanceToSchema.js +1 -0
- package/data/isContiguous.d.ts +4 -8
- package/data/isContiguous.js +6 -11
- package/data/matrix.d.ts +21 -21
- package/data/matrix.js +513 -505
- package/data/numberOps.d.ts +6 -0
- package/data/numberOps.js +26 -20
- package/data/numeric.d.ts +21 -12
- package/data/numeric.js +287 -197
- package/data/offsetUtils.d.ts +9 -13
- package/data/offsetUtils.js +204 -144
- package/data/offsets.d.ts +8 -0
- package/data/offsets.js +33 -33
- package/data/partialIO.d.ts +13 -8
- package/data/partialIO.js +124 -113
- package/data/ptr.d.ts +12 -12
- package/data/ptr.js +42 -44
- package/data/ref.d.ts +40 -27
- package/data/ref.js +125 -95
- package/data/sampler.d.ts +99 -101
- package/data/sampler.js +17 -21
- package/data/schemaCallWrapper.d.ts +19 -0
- package/data/schemaCallWrapper.js +31 -26
- package/data/schemaMemoryLayout.d.ts +8 -0
- package/data/schemaMemoryLayout.js +213 -185
- package/data/sizeOf.d.ts +4 -8
- package/data/sizeOf.js +6 -11
- package/data/snippet.d.ts +96 -20
- package/data/snippet.js +75 -86
- package/data/struct.d.ts +4 -7
- package/data/struct.js +51 -39
- package/data/texture.d.ts +253 -250
- package/data/texture.js +238 -200
- package/data/unstruct.d.ts +2 -7
- package/data/unstruct.js +43 -37
- package/data/vector.d.ts +33 -21
- package/data/vector.js +234 -221
- package/data/vectorImpl.d.ts +231 -0
- package/data/vectorImpl.js +563 -515
- package/data/vectorOps.d.ts +63 -0
- package/data/vectorOps.js +642 -630
- package/data/vertexFormatData.d.ts +181 -184
- package/data/vertexFormatData.js +104 -106
- package/data/wgslTypes.d.ts +665 -600
- package/data/wgslTypes.js +220 -198
- package/errors.d.ts +50 -24
- package/errors.js +146 -126
- package/execMode.d.ts +16 -0
- package/execMode.js +47 -40
- package/extension.d.ts +13 -8
- package/extension.js +10 -16
- package/getGPUValue.d.ts +1 -0
- package/getGPUValue.js +2 -7
- package/index.d.ts +28 -68
- package/index.js +8 -28
- package/indexNamedExports.d.ts +69 -42
- package/indexNamedExports.js +25 -0
- package/internal.d.ts +16 -0
- package/internal.js +12 -0
- package/mathUtils.d.ts +5 -0
- package/mathUtils.js +7 -11
- package/memo.d.ts +11 -0
- package/memo.js +20 -22
- package/minify.d.ts +5 -0
- package/minify.js +93 -0
- package/nameUtils.d.ts +29 -0
- package/nameUtils.js +427 -394
- package/package.json +5 -1
- package/resolutionCtx.d.ts +162 -22
- package/resolutionCtx.js +911 -629
- package/serial/registry.d.ts +15 -0
- package/serial/registry.js +106 -0
- package/serial/restore.d.ts +49 -0
- package/serial/restore.js +68 -0
- package/serial/schema.d.ts +58 -0
- package/serial/schema.js +209 -0
- package/serial/types.d.ts +5 -0
- package/serial/types.js +1 -0
- package/shared/env.d.ts +9 -0
- package/shared/env.js +9 -12
- package/shared/generators.d.ts +4 -0
- package/shared/generators.js +10 -12
- package/shared/meta.d.ts +29 -14
- package/shared/meta.js +71 -55
- package/shared/normalizeMetadata.d.ts +32 -27
- package/shared/normalizeMetadata.js +23 -36
- package/shared/repr.d.ts +73 -55
- package/shared/repr.js +1 -0
- package/shared/soul.d.ts +17 -0
- package/shared/soul.js +1 -0
- package/shared/stringify.d.ts +2 -0
- package/shared/stringify.js +29 -20
- package/shared/symbols.d.ts +26 -20
- package/shared/symbols.js +79 -79
- package/shared/tseynit.d.ts +2 -0
- package/shared/tseynit.js +160 -75
- package/shared/utilityTypes.d.ts +30 -14
- package/shared/utilityTypes.js +2 -6
- package/shared/vertexFormat.d.ts +41 -43
- package/shared/vertexFormat.js +59 -62
- package/std/array.d.ts +2 -7
- package/std/array.js +18 -23
- package/std/atomic.d.ts +14 -18
- package/std/atomic.js +96 -95
- package/std/bitcast.d.ts +193 -10
- package/std/bitcast.js +309 -39
- package/std/boolean.d.ts +19 -33
- package/std/boolean.js +296 -288
- package/std/copy.d.ts +2 -7
- package/std/copy.js +27 -24
- package/std/derivative.d.ts +11 -15
- package/std/derivative.js +56 -79
- package/std/discard.d.ts +1 -6
- package/std/discard.js +7 -14
- package/std/environment.d.ts +19 -14
- package/std/environment.js +71 -51
- package/std/extensions.d.ts +2 -8
- package/std/extensions.js +10 -11
- package/std/index.d.ts +20 -24
- package/std/index.js +32 -187
- package/std/matrix.d.ts +6 -12
- package/std/matrix.js +60 -69
- package/std/numeric.d.ts +143 -146
- package/std/numeric.js +858 -749
- package/std/operators.d.ts +19 -27
- package/std/operators.js +227 -193
- package/std/packing.d.ts +5 -11
- package/std/packing.js +67 -75
- package/std/range.d.ts +6 -11
- package/std/range.js +48 -36
- package/std/subgroup.d.ts +33 -37
- package/std/subgroup.js +180 -217
- package/std/texture.d.ts +70 -38
- package/std/texture.js +176 -172
- package/taskQueue.d.ts +6 -0
- package/taskQueue.js +30 -0
- package/tgpu.d.ts +16 -0
- package/tgpu.js +17 -44
- package/tgpuBindGroupLayout.d.ts +132 -152
- package/tgpuBindGroupLayout.js +346 -268
- package/tgpuLogger.d.ts +34 -0
- package/tgpuLogger.js +63 -0
- package/tgpuUnstable.d.ts +16 -22
- package/tgpuUnstable.js +13 -35
- package/tgsl/accessIndex.d.ts +2 -0
- package/tgsl/accessIndex.js +76 -33
- package/tgsl/accessProp.d.ts +2 -0
- package/tgsl/accessProp.js +142 -101
- package/tgsl/accessStructProp.d.ts +5 -0
- package/tgsl/accessStructProp.js +13 -15
- package/tgsl/consoleLog/deserializers.d.ts +13 -0
- package/tgsl/consoleLog/deserializers.js +119 -103
- package/tgsl/consoleLog/logGenerator.d.ts +21 -0
- package/tgsl/consoleLog/logGenerator.js +85 -80
- package/tgsl/consoleLog/serializers.d.ts +21 -0
- package/tgsl/consoleLog/serializers.js +119 -100
- package/tgsl/consoleLog/types.d.ts +40 -39
- package/tgsl/consoleLog/types.js +1 -0
- package/tgsl/conversion.d.ts +33 -0
- package/tgsl/conversion.js +271 -216
- package/tgsl/forOfUtils.d.ts +15 -0
- package/tgsl/forOfUtils.js +85 -70
- package/tgsl/generationHelpers.d.ts +22 -39
- package/tgsl/generationHelpers.js +85 -58
- package/tgsl/infixDispatch.d.ts +70 -0
- package/tgsl/infixDispatch.js +48 -46
- package/tgsl/jsPolyfills.d.ts +16 -19
- package/tgsl/jsPolyfills.js +44 -42
- package/tgsl/makeDereferenceable.d.ts +48 -0
- package/tgsl/makeDereferenceable.js +86 -0
- package/tgsl/makeResolvable.d.ts +22 -0
- package/tgsl/makeResolvable.js +33 -0
- package/tgsl/shaderGenerator.d.ts +77 -17
- package/tgsl/shaderGenerator.js +1 -0
- package/tgsl/shellless.d.ts +6 -9
- package/tgsl/shellless.js +73 -43
- package/tgsl/wgslGenerator.d.ts +66 -59
- package/tgsl/wgslGenerator.js +1344 -760
- package/types.d.ts +287 -222
- package/types.js +61 -44
- package/unwrapper.d.ts +31 -26
- package/unwrapper.js +1 -0
- package/wgslExtensions.d.ts +3 -5
- package/wgslExtensions.js +12 -16
- package/_virtual/rolldown_runtime.js +0 -13
- package/core/buffer/bufferShorthand.d.ts +0 -50
- package/core/buffer/bufferShorthand.js +0 -55
- package/core/pipeline/applyPipelineState.js +0 -37
- package/package.js +0 -5
- package/tgsl/shaderGenerator_members.d.ts +0 -33
- package/tgsl/shaderGenerator_members.js +0 -12
package/shared/meta.js
CHANGED
|
@@ -1,70 +1,86 @@
|
|
|
1
|
-
|
|
1
|
+
const version = "0.12.0";
|
|
2
2
|
import { DEV, TEST } from "./env.js";
|
|
3
|
-
import { $getNameForward, isMarkedInternal } from "./symbols.js";
|
|
3
|
+
import { $getNameForward, $soul, isMarkedInternal } from "./symbols.js";
|
|
4
4
|
import { normalizeMetadata } from "./normalizeMetadata.js";
|
|
5
|
-
|
|
6
|
-
//#region src/shared/meta.ts
|
|
7
5
|
const globalExt = globalThis;
|
|
8
|
-
if (globalExt.__TYPEGPU_VERSION__ !==
|
|
6
|
+
if (globalExt.__TYPEGPU_VERSION__ !== undefined) {
|
|
7
|
+
console.warn(`Found duplicate TypeGPU version. First was ${globalExt.__TYPEGPU_VERSION__}, this one is ${version}. This may cause unexpected behavior.`);
|
|
8
|
+
}
|
|
9
9
|
globalExt.__TYPEGPU_VERSION__ = version;
|
|
10
10
|
globalExt.__TYPEGPU_AUTONAME__ = (exp, label) => isNamable(exp) && isMarkedInternal(exp) && !getName(exp) ? exp.$name(label) : exp;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
// --- NAMING ---
|
|
12
|
+
const nameMap = new WeakMap();
|
|
13
|
+
export function isNamable(value) {
|
|
14
|
+
return !!value?.$name;
|
|
14
15
|
}
|
|
15
16
|
function isForwarded(value) {
|
|
16
|
-
|
|
17
|
+
return !!value?.[$getNameForward];
|
|
18
|
+
}
|
|
19
|
+
function soulOf(value) {
|
|
20
|
+
return value?.[$soul];
|
|
17
21
|
}
|
|
18
|
-
function getName(definition) {
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
export function getName(definition) {
|
|
23
|
+
if (isForwarded(definition)) {
|
|
24
|
+
return getName(definition[$getNameForward]);
|
|
25
|
+
}
|
|
26
|
+
return (nameMap.get(definition) ??
|
|
27
|
+
// nameMap is runtime-local, soul labels travel with the resource between runtimes
|
|
28
|
+
soulOf(definition)?.label ??
|
|
29
|
+
globalExt.__TYPEGPU_META__?.get(definition)?.name);
|
|
21
30
|
}
|
|
22
|
-
function setName(definition, name) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
export function setName(definition, name) {
|
|
32
|
+
if (isForwarded(definition)) {
|
|
33
|
+
setName(definition[$getNameForward], name);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
nameMap.set(definition, name);
|
|
37
|
+
const soul = soulOf(definition);
|
|
38
|
+
if (soul) {
|
|
39
|
+
soul.label = name;
|
|
40
|
+
}
|
|
28
41
|
}
|
|
29
|
-
|
|
42
|
+
// --- METADATA ---
|
|
43
|
+
const metadataMap = new WeakMap();
|
|
30
44
|
/**
|
|
31
|
-
* Retrieves normalized (non-raw) function metadata.
|
|
32
|
-
* If `globalExt.__TYPEGPU_META__` contains raw metadata for the function,
|
|
33
|
-
* it is normalized, and then deleted to avoid unnecessary re-normalization.
|
|
34
|
-
*/
|
|
35
|
-
function getFunctionMetadata(definition) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
* Retrieves normalized (non-raw) function metadata.
|
|
46
|
+
* If `globalExt.__TYPEGPU_META__` contains raw metadata for the function,
|
|
47
|
+
* it is normalized, and then deleted to avoid unnecessary re-normalization.
|
|
48
|
+
*/
|
|
49
|
+
export function getFunctionMetadata(definition) {
|
|
50
|
+
// it's fine, if it's not an object, the get will return undefined
|
|
51
|
+
const maybeRawMeta = globalExt.__TYPEGPU_META__?.get(definition);
|
|
52
|
+
if (maybeRawMeta) {
|
|
53
|
+
globalExt.__TYPEGPU_META__?.delete(definition);
|
|
54
|
+
const normalized = normalizeMetadata(maybeRawMeta);
|
|
55
|
+
metadataMap.set(definition, normalized);
|
|
56
|
+
if (maybeRawMeta.name && nameMap.get(definition) === undefined) {
|
|
57
|
+
nameMap.set(definition, maybeRawMeta.name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return metadataMap.get(definition);
|
|
44
61
|
}
|
|
45
62
|
/**
|
|
46
|
-
* AST's are given to functions with a 'use gpu' directive, which this function checks for.
|
|
47
|
-
*/
|
|
48
|
-
function hasTinyestMetadata(value) {
|
|
49
|
-
|
|
63
|
+
* AST's are given to functions with a 'use gpu' directive, which this function checks for.
|
|
64
|
+
*/
|
|
65
|
+
export function hasTinyestMetadata(value) {
|
|
66
|
+
return typeof value === 'function' && !!getFunctionMetadata(value);
|
|
50
67
|
}
|
|
68
|
+
// --- PERF ---
|
|
51
69
|
/**
|
|
52
|
-
* Performance measurements are only enabled in dev & test environments for now
|
|
53
|
-
*/
|
|
54
|
-
const PERF = (DEV || TEST) && {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
} ||
|
|
68
|
-
|
|
69
|
-
//#endregion
|
|
70
|
-
export { PERF, getFunctionMetadata, getName, hasTinyestMetadata, isNamable, setName };
|
|
70
|
+
* Performance measurements are only enabled in dev & test environments for now
|
|
71
|
+
*/
|
|
72
|
+
export const PERF = ((DEV || TEST) && {
|
|
73
|
+
get enabled() {
|
|
74
|
+
return !!globalExt.__TYPEGPU_MEASURE_PERF__;
|
|
75
|
+
},
|
|
76
|
+
record(name, data) {
|
|
77
|
+
const records = (globalExt.__TYPEGPU_PERF_RECORDS__ ??= new Map());
|
|
78
|
+
let entries = records.get(name);
|
|
79
|
+
if (!entries) {
|
|
80
|
+
entries = [];
|
|
81
|
+
records.set(name, entries);
|
|
82
|
+
}
|
|
83
|
+
entries.push(data);
|
|
84
|
+
},
|
|
85
|
+
}) ||
|
|
86
|
+
undefined;
|
|
@@ -1,32 +1,37 @@
|
|
|
1
|
-
import { Block, FuncParameter } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
};
|
|
12
|
-
externals: Record<string, unknown> | (() => Record<string, unknown>);
|
|
1
|
+
import type { Block, FuncParameter } from 'tinyest';
|
|
2
|
+
export interface RawMetadataV1 {
|
|
3
|
+
v: 1;
|
|
4
|
+
name: string;
|
|
5
|
+
ast: {
|
|
6
|
+
params: FuncParameter[];
|
|
7
|
+
body: Block;
|
|
8
|
+
externalNames: string[];
|
|
9
|
+
};
|
|
10
|
+
externals: Record<string, unknown> | (() => Record<string, unknown>);
|
|
13
11
|
}
|
|
14
|
-
interface
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
externals: ExternalsV2;
|
|
12
|
+
export interface RawMetadataV2 {
|
|
13
|
+
v: 2;
|
|
14
|
+
name: string;
|
|
15
|
+
ast: {
|
|
16
|
+
params: FuncParameter[];
|
|
17
|
+
body: Block;
|
|
18
|
+
};
|
|
19
|
+
externals: {
|
|
20
|
+
[key: string]: () => unknown;
|
|
21
|
+
};
|
|
26
22
|
}
|
|
27
23
|
/**
|
|
28
24
|
* Holds all function info collected by typegpu-unplugin
|
|
29
25
|
*/
|
|
30
|
-
type RawMetadata = RawMetadataV1 | RawMetadataV2;
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
export type RawMetadata = RawMetadataV1 | RawMetadataV2;
|
|
27
|
+
/**
|
|
28
|
+
* Holds normalized function metadata required for WGSL generation
|
|
29
|
+
*/
|
|
30
|
+
export interface Metadata {
|
|
31
|
+
ast: {
|
|
32
|
+
params: FuncParameter[];
|
|
33
|
+
body: Block;
|
|
34
|
+
};
|
|
35
|
+
externals: () => Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export declare function normalizeMetadata(meta: RawMetadata): Metadata;
|
|
@@ -1,41 +1,28 @@
|
|
|
1
1
|
import { safeStringify } from "./stringify.js";
|
|
2
|
-
|
|
3
|
-
//#region src/shared/normalizeMetadata.ts
|
|
4
2
|
/**
|
|
5
|
-
* The values of ExternalsV2 are zero-argument functions for accessing the value.
|
|
6
|
-
* Since they would be recognized by the
|
|
7
|
-
* we turn them into getters.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* normalizeExternalsV2({ ext
|
|
11
|
-
*/
|
|
3
|
+
* The values of ExternalsV2 are zero-argument functions for accessing the value.
|
|
4
|
+
* Since they would be recognized by the WgslGenerator as regular, non 'use gpu' functions,
|
|
5
|
+
* we turn them into getters.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* normalizeExternalsV2({ "ext.prop": () => ext.prop; }); // { get "ext.prop"() => ext.prop; }
|
|
9
|
+
*/
|
|
12
10
|
function normalizeExternalsV2(externals) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
else result[key] = normalizeExternalsV2(value);
|
|
19
|
-
return result;
|
|
11
|
+
const result = {};
|
|
12
|
+
for (const [key, value] of Object.entries(externals)) {
|
|
13
|
+
Object.defineProperty(result, key, { get: value, enumerable: true });
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
20
16
|
}
|
|
21
|
-
function normalizeMetadata(meta) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
...meta,
|
|
34
|
-
externals: () => externals
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
throw new Error(`Unrecognized TypeGPU metadata format: ${safeStringify(meta)}`);
|
|
17
|
+
export function normalizeMetadata(meta) {
|
|
18
|
+
if (meta.v === 1) {
|
|
19
|
+
const rawExternals = meta.externals;
|
|
20
|
+
const externals = typeof rawExternals === 'function' ? rawExternals : () => rawExternals;
|
|
21
|
+
return { ...meta, externals };
|
|
22
|
+
}
|
|
23
|
+
if (meta.v === 2) {
|
|
24
|
+
const externals = normalizeExternalsV2(meta?.externals);
|
|
25
|
+
return { ...meta, externals: () => externals };
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`Unrecognized TypeGPU metadata format: ${safeStringify(meta)}`);
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
//#endregion
|
|
41
|
-
export { normalizeMetadata };
|
package/shared/repr.d.ts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
//#region src/shared/repr.d.ts
|
|
10
|
-
|
|
1
|
+
import type { TgpuTexture } from '../core/texture/texture.ts';
|
|
2
|
+
import type { Disarray, Undecorate } from '../data/dataTypes.ts';
|
|
3
|
+
import type { WgslStorageTexture, WgslTexture } from '../data/texture.ts';
|
|
4
|
+
import type { U16, U32, WgslArray } from '../data/wgslTypes.ts';
|
|
5
|
+
import type { $gpuRepr, $gpuValueOf, $inRepr, $invalidSchemaReason, $memIdent, $repr, $reprPartial, $reprPatch, $validStorageSchema, $validUniformSchema, $validVertexSchema } from './symbols.ts';
|
|
6
|
+
import type { ViewDimensionToDimension } from '../core/texture/textureFormats.ts';
|
|
7
|
+
import type { Default } from './utilityTypes.ts';
|
|
11
8
|
/**
|
|
12
9
|
* Extracts the inferred representation of a resource.
|
|
13
10
|
* For inferring types as seen by the GPU, see {@link InferGPU}
|
|
@@ -17,8 +14,8 @@ import { Disarray, Undecorate } from "../data/dataTypes.js";
|
|
|
17
14
|
* type B = Infer<WgslArray<F32>> // => number[]
|
|
18
15
|
* type C = Infer<Atomic<U32>> // => number
|
|
19
16
|
*/
|
|
20
|
-
type Infer<T> = T extends {
|
|
21
|
-
|
|
17
|
+
export type Infer<T> = T extends {
|
|
18
|
+
readonly [$repr]: infer TRepr;
|
|
22
19
|
} ? TRepr : T;
|
|
23
20
|
/**
|
|
24
21
|
* Extracts the inferred input (write-side) representation of a resource.
|
|
@@ -30,8 +27,8 @@ type Infer<T> = T extends {
|
|
|
30
27
|
* const arrayOfStructs = d.arrayOf(d.struct({ pos: d.vec3f, id: d.f32 }), 4);
|
|
31
28
|
* type D = d.InferInput<typeof arrayOfStructs>; // { pos: d.v3f | Float32Array<ArrayBufferLike> | [number, number, number]; id: number; }[]
|
|
32
29
|
*/
|
|
33
|
-
type InferInput<T> = Infer<T> | (T extends {
|
|
34
|
-
|
|
30
|
+
export type InferInput<T> = Infer<T> | (T extends {
|
|
31
|
+
readonly [$inRepr]: infer TRepr;
|
|
35
32
|
} ? TRepr : never);
|
|
36
33
|
/**
|
|
37
34
|
* Extracts a sparse/partial inferred representation of a resource.
|
|
@@ -44,10 +41,10 @@ type InferInput<T> = Infer<T> | (T extends {
|
|
|
44
41
|
* type B = InferPartial<WgslStruct<{ a: F32 }>> // => { a?: number | undefined }
|
|
45
42
|
* type C = InferPartial<WgslArray<F32>> // => { idx: number; value: number | undefined }[] | undefined
|
|
46
43
|
*/
|
|
47
|
-
type InferPartial<T> = T extends {
|
|
48
|
-
|
|
44
|
+
export type InferPartial<T> = T extends {
|
|
45
|
+
readonly [$reprPartial]: infer TRepr;
|
|
49
46
|
} ? TRepr : T extends {
|
|
50
|
-
|
|
47
|
+
readonly [$repr]: infer TRepr;
|
|
51
48
|
} ? TRepr | undefined : T;
|
|
52
49
|
/**
|
|
53
50
|
* Extracts the inferred representation of a resource (as seen by the GPU).
|
|
@@ -57,13 +54,19 @@ type InferPartial<T> = T extends {
|
|
|
57
54
|
* type B = InferGPU<WgslArray<F32>> // => number[]
|
|
58
55
|
* type C = InferGPU<Atomic<U32>> // => atomicU32
|
|
59
56
|
*/
|
|
60
|
-
type InferGPU<T> = T extends {
|
|
61
|
-
|
|
57
|
+
export type InferGPU<T> = T extends {
|
|
58
|
+
readonly [$gpuRepr]: infer TRepr;
|
|
62
59
|
} ? TRepr : Infer<T>;
|
|
63
|
-
type InferRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
64
|
-
|
|
60
|
+
export type InferRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
61
|
+
[Key in keyof T]: Infer<T[Key]>;
|
|
62
|
+
};
|
|
63
|
+
export type InferInputRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
64
|
+
[Key in keyof T]: InferInput<T[Key]>;
|
|
65
|
+
};
|
|
65
66
|
/** @deprecated */
|
|
66
|
-
type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
67
|
+
export type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
68
|
+
[Key in keyof T]?: InferPartial<T[Key]>;
|
|
69
|
+
};
|
|
67
70
|
/**
|
|
68
71
|
* Extracts the patch representation of a resource.
|
|
69
72
|
* Used by the `buffer.patch` API.
|
|
@@ -73,67 +76,82 @@ type InferPartialRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
|
73
76
|
* type B = InferPatch<WgslStruct<{ a: F32 }>> // => { a?: number | undefined }
|
|
74
77
|
* type C = InferPatch<WgslArray<F32>> // => Record<number, number | undefined> | number[] | undefined
|
|
75
78
|
*/
|
|
76
|
-
type InferPatch<T> = T extends {
|
|
77
|
-
|
|
79
|
+
export type InferPatch<T> = T extends {
|
|
80
|
+
readonly [$reprPatch]: infer TRepr;
|
|
78
81
|
} ? TRepr : InferInput<T> | undefined;
|
|
79
|
-
type InferPatchRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
export type InferPatchRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
83
|
+
[Key in keyof T]?: InferPatch<T[Key]>;
|
|
84
|
+
};
|
|
85
|
+
export type InferGPURecord<T extends Record<string | number | symbol, unknown>> = {
|
|
86
|
+
[Key in keyof T]: InferGPU<T[Key]>;
|
|
87
|
+
};
|
|
88
|
+
export type GPUValueOf<T> = T extends {
|
|
89
|
+
readonly [$gpuValueOf]: infer TValue;
|
|
83
90
|
} ? TValue : T;
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Expands a schema to a union of other schemas that have the same binary representation.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* type A = MemIdentity<F32> // => F32
|
|
96
|
+
* type B = MemIdentity<I32> // => I32 | Atomic<I32> | Decorated<I32, Location[]>
|
|
97
|
+
* type C = MemIdentity<WgslArray<I32>> // => WgslArray<I32 | Atomic<I32> | Decorated<I32, Location[]>>
|
|
98
|
+
*/
|
|
99
|
+
export type MemIdentity<T> = T extends {
|
|
100
|
+
readonly [$memIdent]: infer TMemIdent;
|
|
86
101
|
} ? TMemIdent : T;
|
|
87
|
-
type MemIdentityRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
88
|
-
|
|
89
|
-
|
|
102
|
+
export type MemIdentityRecord<T extends Record<string | number | symbol, unknown>> = {
|
|
103
|
+
[Key in keyof T]: MemIdentity<T[Key]>;
|
|
104
|
+
};
|
|
105
|
+
export type IsValidStorageSchema<T> = (T extends {
|
|
106
|
+
readonly [$validStorageSchema]: true;
|
|
90
107
|
} ? true : false) extends false ? false : true;
|
|
91
|
-
type IsValidUniformSchema<T> = (T extends {
|
|
92
|
-
|
|
108
|
+
export type IsValidUniformSchema<T> = (T extends {
|
|
109
|
+
readonly [$validUniformSchema]: true;
|
|
93
110
|
} ? true : false) extends false ? false : true;
|
|
94
|
-
type IsValidVertexSchema<T> = (T extends {
|
|
95
|
-
|
|
111
|
+
export type IsValidVertexSchema<T> = (T extends {
|
|
112
|
+
readonly [$validVertexSchema]: true;
|
|
96
113
|
} ? true : false) extends false ? false : true;
|
|
97
114
|
/**
|
|
98
115
|
* Accepts only arrays (or disarrays) of u32 or u16.
|
|
99
116
|
*/
|
|
100
|
-
type IsValidIndexSchema<T> = Undecorate<T> extends WgslArray | Disarray ? Undecorate<Undecorate<T>['elementType']> extends U32 | U16 ? true : false : false;
|
|
117
|
+
export type IsValidIndexSchema<T> = Undecorate<T> extends WgslArray | Disarray ? Undecorate<Undecorate<T>['elementType']> extends U32 | U16 ? true : false : false;
|
|
101
118
|
/**
|
|
102
119
|
* Checks if a schema can be used in a buffer at all
|
|
103
120
|
*/
|
|
104
|
-
type IsValidBufferSchema<T> = IsValidStorageSchema<T> | IsValidUniformSchema<T> | IsValidVertexSchema<T> | IsValidIndexSchema<T> extends false ? false : true;
|
|
121
|
+
export type IsValidBufferSchema<T> = IsValidStorageSchema<T> | IsValidUniformSchema<T> | IsValidVertexSchema<T> | IsValidIndexSchema<T> extends false ? false : true;
|
|
105
122
|
/**
|
|
106
123
|
* Validates if a texture can be used as sampled texture
|
|
107
124
|
*/
|
|
108
|
-
type IsValidSampledTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsSampled'] extends true ? true : {
|
|
109
|
-
|
|
125
|
+
export type IsValidSampledTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsSampled'] extends true ? true : {
|
|
126
|
+
readonly invalidSampled: "Texture not usable as sampled, call $usage('sampled') first";
|
|
110
127
|
};
|
|
111
128
|
/**
|
|
112
129
|
* Validates if a texture can be used as storage texture
|
|
113
130
|
*/
|
|
114
|
-
type IsValidStorageTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsStorage'] extends true ? true : {
|
|
115
|
-
|
|
131
|
+
export type IsValidStorageTextureUsage<TTexture extends TgpuTexture> = TTexture['usableAsStorage'] extends true ? true : {
|
|
132
|
+
readonly invalidStorage: "Texture not usable as storage, call $usage('storage') first";
|
|
116
133
|
};
|
|
117
134
|
/**
|
|
118
135
|
* Validates if a texture view dimension is compatible with the texture dimension
|
|
119
136
|
*/
|
|
120
|
-
type IsValidSubdimension<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = ViewDimensionToDimension[TSchema['dimension']] extends infer TVDim ? TVDim extends Default<TTexture['props']['dimension'], '2d'> ? true : {
|
|
121
|
-
|
|
137
|
+
export type IsValidSubdimension<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = ViewDimensionToDimension[TSchema['dimension']] extends infer TVDim ? TVDim extends Default<TTexture['props']['dimension'], '2d'> ? true : {
|
|
138
|
+
readonly invalidViewDim: `Texture dimension '${Default<TTexture['props']['dimension'], '2d'>}' incompatible with view dimension '${TSchema['dimension']}'`;
|
|
122
139
|
} : never;
|
|
123
|
-
type IsValidStorageFormat<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = TSchema['format'] extends TTexture['props']['format'] ? true : TTexture['props']['viewFormats'] extends readonly unknown[] ? TSchema['format'] extends TTexture['props']['viewFormats'][number] ? true : FormatError<TSchema, TTexture> : FormatError<TSchema, TTexture>;
|
|
140
|
+
export type IsValidStorageFormat<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = TSchema['format'] extends TTexture['props']['format'] ? true : TTexture['props']['viewFormats'] extends readonly unknown[] ? TSchema['format'] extends TTexture['props']['viewFormats'][number] ? true : FormatError<TSchema, TTexture> : FormatError<TSchema, TTexture>;
|
|
124
141
|
type FormatError<TSchema extends WgslStorageTexture, TTexture extends TgpuTexture> = {
|
|
125
|
-
|
|
142
|
+
readonly invalidFormat: `Storage texture format '${TSchema['format']}' incompatible with texture format '${TTexture['props']['format']}'`;
|
|
126
143
|
};
|
|
127
144
|
type IsExactly<T, U> = [T] extends [U] ? ([U] extends [T] ? true : false) : false;
|
|
128
145
|
type SelfOrErrors<TSelf, T> = IsExactly<T, true> extends true ? TSelf : `(Error) ${T[Extract<keyof T, `invalid${string}`>] & string}`;
|
|
129
|
-
type ValidStorageUsage<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = IsValidStorageTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema> & IsValidStorageFormat<TTexture, TSchema>;
|
|
130
|
-
type ValidSampledUsage<TTexture extends TgpuTexture, TSchema extends WgslTexture> = IsValidSampledTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema>;
|
|
146
|
+
export type ValidStorageUsage<TTexture extends TgpuTexture, TSchema extends WgslStorageTexture> = IsValidStorageTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema> & IsValidStorageFormat<TTexture, TSchema>;
|
|
147
|
+
export type ValidSampledUsage<TTexture extends TgpuTexture, TSchema extends WgslTexture> = IsValidSampledTextureUsage<TTexture> & IsValidSubdimension<TTexture, TSchema>;
|
|
131
148
|
/**
|
|
132
149
|
* Validates texture view schema against texture usage
|
|
133
150
|
*/
|
|
134
|
-
type ValidateTextureViewSchema<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = TSchema extends WgslStorageTexture ? SelfOrErrors<TSchema, ValidStorageUsage<TTexture, TSchema>> : TSchema extends WgslTexture ? SelfOrErrors<TSchema, ValidSampledUsage<TTexture, TSchema>> : never;
|
|
135
|
-
type ExtractInvalidSchemaError<T, TPrefix extends string = ''> = [T] extends [
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
151
|
+
export type ValidateTextureViewSchema<TTexture extends TgpuTexture, TSchema extends WgslTexture | WgslStorageTexture> = TSchema extends WgslStorageTexture ? SelfOrErrors<TSchema, ValidStorageUsage<TTexture, TSchema>> : TSchema extends WgslTexture ? SelfOrErrors<TSchema, ValidSampledUsage<TTexture, TSchema>> : never;
|
|
152
|
+
export type ExtractInvalidSchemaError<T, TPrefix extends string = ''> = [T] extends [
|
|
153
|
+
{
|
|
154
|
+
readonly [$invalidSchemaReason]: string;
|
|
155
|
+
}
|
|
156
|
+
] ? `${TPrefix}${T[typeof $invalidSchemaReason]}` : never;
|
|
157
|
+
export {};
|
package/shared/repr.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/shared/soul.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The base shape of a soul: a plain record of all definitional state of a resource,
|
|
3
|
+
* holding everything that survives transfer between runtimes. Souls carry own data
|
|
4
|
+
* properties only, no methods, no prototype and no symbol keys. Raw GPU objects
|
|
5
|
+
* belong here too, they cross runtimes as shareable host objects pointing to the
|
|
6
|
+
* same underlying resource
|
|
7
|
+
*/
|
|
8
|
+
export interface TgpuSoul<TType extends string = string> {
|
|
9
|
+
readonly type: TType;
|
|
10
|
+
/** Only set/read through `setName` and `getName` - do not change manually */
|
|
11
|
+
label?: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
/** A soul of a resource that owns a device object, filled in by `[$internal].materialize()` */
|
|
14
|
+
export interface TgpuDeviceOwningSoul<TType extends string = string, TRaw = unknown> extends TgpuSoul<TType> {
|
|
15
|
+
readonly device: GPUDevice;
|
|
16
|
+
raw?: TRaw | undefined;
|
|
17
|
+
}
|
package/shared/soul.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/shared/stringify.js
CHANGED
|
@@ -1,23 +1,32 @@
|
|
|
1
1
|
import { isMatInstance, isVecInstance } from "../data/wgslTypes.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
2
|
+
import { logger } from "../tgpuLogger.js";
|
|
3
|
+
export function safeStringify(item) {
|
|
4
|
+
if (Array.isArray(item)) {
|
|
5
|
+
return `[${item.map(safeStringify).join(', ')}]`;
|
|
6
|
+
}
|
|
7
|
+
const asString = String(item);
|
|
8
|
+
if (asString !== '[object Object]') {
|
|
9
|
+
return asString;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
return JSON.stringify(item);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
logger.warn('suspicious', 'Error parsing JSON:', error);
|
|
16
|
+
return '<invalid json>';
|
|
17
|
+
}
|
|
14
18
|
}
|
|
15
|
-
function niceStringify(item) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
export function niceStringify(item) {
|
|
20
|
+
if (isVecInstance(item) || isMatInstance(item)) {
|
|
21
|
+
return item.toString();
|
|
22
|
+
}
|
|
23
|
+
if (Array.isArray(item)) {
|
|
24
|
+
return `[${item.map(niceStringify).join(', ')}]`;
|
|
25
|
+
}
|
|
26
|
+
if (item && typeof item === 'object') {
|
|
27
|
+
return `{ ${Object.entries(item)
|
|
28
|
+
.map(([key, value]) => `${key}: ${niceStringify(value)}`)
|
|
29
|
+
.join(', ')} }`;
|
|
30
|
+
}
|
|
31
|
+
return String(item);
|
|
20
32
|
}
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
export { niceStringify, safeStringify };
|