typegpu 0.11.8 → 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 +37 -38
- 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 -0
- package/core/function/fnCore.js +148 -92
- 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 +18 -20
- 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 +90 -93
- package/core/resolve/externals.d.ts +25 -7
- package/core/resolve/externals.js +79 -62
- 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 -55
- 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 -454
- package/core/root/rootTypes.d.ts +461 -627
- 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 -214
- 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 -192
- 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 -120
- 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 +428 -398
- package/package.json +9 -3
- package/resolutionCtx.d.ts +162 -22
- package/resolutionCtx.js +911 -624
- 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 -100
- package/tgsl/accessStructProp.d.ts +5 -0
- package/tgsl/accessStructProp.js +18 -0
- 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 +272 -193
- 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 -747
- package/types.d.ts +287 -221
- 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/std/boolean.js
CHANGED
|
@@ -1,332 +1,340 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { isSnippetNumeric, snip } from "../data/snippet.js";
|
|
1
|
+
import { dualImpl } from "../core/function/dualImpl.js";
|
|
3
2
|
import { stitch } from "../core/resolve/stitch.js";
|
|
4
|
-
import { unify } from "../tgsl/conversion.js";
|
|
5
3
|
import { bool, f16, f32, i32, u32 } from "../data/numeric.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { isSnippetNumeric, snip } from "../data/snippet.js";
|
|
5
|
+
import { vec2b, vec2f, vec2h, vec2i, vec2u, vec3b, vec3f, vec3h, vec3i, vec3u, vec4b, vec4f, vec4h, vec4i, vec4u, } from "../data/vector.js";
|
|
8
6
|
import { VectorOps } from "../data/vectorOps.js";
|
|
7
|
+
import { isBool, isVecBool, isVecBoolInstance, isVecInstance, } from "../data/wgslTypes.js";
|
|
8
|
+
import { SignatureNotSupportedError } from "../errors.js";
|
|
9
|
+
import { unify } from "../tgsl/conversion.js";
|
|
10
|
+
import { cpuCopy } from "./copy.js";
|
|
9
11
|
import { sub } from "./operators.js";
|
|
10
|
-
|
|
11
|
-
//#region src/std/boolean.ts
|
|
12
12
|
function correspondingBooleanVectorSchema(dataType) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (dataType.type.includes('2')) {
|
|
14
|
+
return vec2b;
|
|
15
|
+
}
|
|
16
|
+
if (dataType.type.includes('3')) {
|
|
17
|
+
return vec3b;
|
|
18
|
+
}
|
|
19
|
+
return vec4b;
|
|
16
20
|
}
|
|
21
|
+
// comparison
|
|
17
22
|
/**
|
|
18
|
-
* Checks whether `lhs == rhs` on all components.
|
|
19
|
-
* Equivalent to `all(eq(lhs, rhs))`.
|
|
20
|
-
* @example
|
|
21
|
-
* allEq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns false
|
|
22
|
-
* allEq(vec3u(0, 1, 2), vec3u(0, 1, 2)) // returns true
|
|
23
|
-
*/
|
|
24
|
-
const allEq = dualImpl({
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
normalImpl: (lhs, rhs) => cpuAll(cpuEq(lhs, rhs)),
|
|
31
|
-
codegenImpl: (_ctx, [lhs, rhs]) => stitch`all(${lhs} == ${rhs})`
|
|
23
|
+
* Checks whether `lhs == rhs` on all components.
|
|
24
|
+
* Equivalent to `all(eq(lhs, rhs))`.
|
|
25
|
+
* @example
|
|
26
|
+
* allEq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns false
|
|
27
|
+
* allEq(vec3u(0, 1, 2), vec3u(0, 1, 2)) // returns true
|
|
28
|
+
*/
|
|
29
|
+
export const allEq = dualImpl({
|
|
30
|
+
name: 'allEq',
|
|
31
|
+
signature: (...argTypes) => ({ argTypes, returnType: bool }),
|
|
32
|
+
normalImpl: (lhs, rhs) => cpuAll(cpuEq(lhs, rhs)),
|
|
33
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `all(${lhs} == ${rhs})`,
|
|
34
|
+
sideEffects: false,
|
|
32
35
|
});
|
|
33
36
|
const cpuEq = (lhs, rhs) => VectorOps.eq[lhs.kind](lhs, rhs);
|
|
34
37
|
/**
|
|
35
|
-
* Checks **component-wise** whether `lhs == rhs`.
|
|
36
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `all`, or use `allEq`.
|
|
37
|
-
* @example
|
|
38
|
-
* eq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(true, false)
|
|
39
|
-
* eq(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, false)
|
|
40
|
-
* all(eq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1))) // returns true
|
|
41
|
-
* allEq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1)) // returns true
|
|
42
|
-
*/
|
|
43
|
-
const eq = dualImpl({
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
* Checks **component-wise** whether `lhs == rhs`.
|
|
39
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `all`, or use `allEq`.
|
|
40
|
+
* @example
|
|
41
|
+
* eq(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(true, false)
|
|
42
|
+
* eq(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, false)
|
|
43
|
+
* all(eq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1))) // returns true
|
|
44
|
+
* allEq(vec4i(4, 3, 2, 1), vec4i(4, 3, 2, 1)) // returns true
|
|
45
|
+
*/
|
|
46
|
+
export const eq = dualImpl({
|
|
47
|
+
name: 'eq',
|
|
48
|
+
signature: (...argTypes) => ({
|
|
49
|
+
argTypes,
|
|
50
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
51
|
+
}),
|
|
52
|
+
normalImpl: cpuEq,
|
|
53
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} == ${rhs})`,
|
|
54
|
+
sideEffects: false,
|
|
51
55
|
});
|
|
52
56
|
/**
|
|
53
|
-
* Checks **component-wise** whether `lhs != rhs`.
|
|
54
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `any`.
|
|
55
|
-
* @example
|
|
56
|
-
* ne(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(false, true)
|
|
57
|
-
* ne(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, true)
|
|
58
|
-
* any(ne(vec4i(4, 3, 2, 1), vec4i(4, 2, 2, 1))) // returns true
|
|
59
|
-
*/
|
|
60
|
-
const ne = dualImpl({
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
* Checks **component-wise** whether `lhs != rhs`.
|
|
58
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `any`.
|
|
59
|
+
* @example
|
|
60
|
+
* ne(vec2f(0.0, 1.0), vec2f(0.0, 2.0)) // returns vec2b(false, true)
|
|
61
|
+
* ne(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, true)
|
|
62
|
+
* any(ne(vec4i(4, 3, 2, 1), vec4i(4, 2, 2, 1))) // returns true
|
|
63
|
+
*/
|
|
64
|
+
export const ne = dualImpl({
|
|
65
|
+
name: 'ne',
|
|
66
|
+
signature: (...argTypes) => ({
|
|
67
|
+
argTypes,
|
|
68
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
69
|
+
}),
|
|
70
|
+
normalImpl: (lhs, rhs) => cpuNot(cpuEq(lhs, rhs)),
|
|
71
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} != ${rhs})`,
|
|
72
|
+
sideEffects: false,
|
|
68
73
|
});
|
|
69
74
|
const cpuLt = (lhs, rhs) => VectorOps.lt[lhs.kind](lhs, rhs);
|
|
70
75
|
/**
|
|
71
|
-
* Checks **component-wise** whether `lhs < rhs`.
|
|
72
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
73
|
-
* @example
|
|
74
|
-
* lt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, true)
|
|
75
|
-
* lt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, false)
|
|
76
|
-
* all(lt(vec4i(1, 2, 3, 4), vec4i(2, 3, 4, 5))) // returns true
|
|
77
|
-
*/
|
|
78
|
-
const lt = dualImpl({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
76
|
+
* Checks **component-wise** whether `lhs < rhs`.
|
|
77
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
78
|
+
* @example
|
|
79
|
+
* lt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, true)
|
|
80
|
+
* lt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, false, false)
|
|
81
|
+
* all(lt(vec4i(1, 2, 3, 4), vec4i(2, 3, 4, 5))) // returns true
|
|
82
|
+
*/
|
|
83
|
+
export const lt = dualImpl({
|
|
84
|
+
name: 'lt',
|
|
85
|
+
signature: (...argTypes) => ({
|
|
86
|
+
argTypes,
|
|
87
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
88
|
+
}),
|
|
89
|
+
normalImpl: cpuLt,
|
|
90
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} < ${rhs})`,
|
|
91
|
+
sideEffects: false,
|
|
86
92
|
});
|
|
87
93
|
/**
|
|
88
|
-
* Checks **component-wise** whether `lhs <= rhs`.
|
|
89
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
90
|
-
* @example
|
|
91
|
-
* le(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, true)
|
|
92
|
-
* le(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, true, false)
|
|
93
|
-
* all(le(vec4i(1, 2, 3, 4), vec4i(2, 3, 3, 5))) // returns true
|
|
94
|
-
*/
|
|
95
|
-
const le = dualImpl({
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
94
|
+
* Checks **component-wise** whether `lhs <= rhs`.
|
|
95
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
96
|
+
* @example
|
|
97
|
+
* le(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, true)
|
|
98
|
+
* le(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(true, true, false)
|
|
99
|
+
* all(le(vec4i(1, 2, 3, 4), vec4i(2, 3, 3, 5))) // returns true
|
|
100
|
+
*/
|
|
101
|
+
export const le = dualImpl({
|
|
102
|
+
name: 'le',
|
|
103
|
+
signature: (...argTypes) => ({
|
|
104
|
+
argTypes,
|
|
105
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
106
|
+
}),
|
|
107
|
+
normalImpl: (lhs, rhs) => cpuOr(cpuLt(lhs, rhs), cpuEq(lhs, rhs)),
|
|
108
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} <= ${rhs})`,
|
|
109
|
+
sideEffects: false,
|
|
103
110
|
});
|
|
104
111
|
/**
|
|
105
|
-
* Checks **component-wise** whether `lhs > rhs`.
|
|
106
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
107
|
-
* @example
|
|
108
|
-
* gt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, false)
|
|
109
|
-
* gt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, false, true)
|
|
110
|
-
* all(gt(vec4i(2, 3, 4, 5), vec4i(1, 2, 3, 4))) // returns true
|
|
111
|
-
*/
|
|
112
|
-
const gt = dualImpl({
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
112
|
+
* Checks **component-wise** whether `lhs > rhs`.
|
|
113
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
114
|
+
* @example
|
|
115
|
+
* gt(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(false, false)
|
|
116
|
+
* gt(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, false, true)
|
|
117
|
+
* all(gt(vec4i(2, 3, 4, 5), vec4i(1, 2, 3, 4))) // returns true
|
|
118
|
+
*/
|
|
119
|
+
export const gt = dualImpl({
|
|
120
|
+
name: 'gt',
|
|
121
|
+
signature: (...argTypes) => ({
|
|
122
|
+
argTypes,
|
|
123
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
124
|
+
}),
|
|
125
|
+
normalImpl: (lhs, rhs) => cpuAnd(cpuNot(cpuLt(lhs, rhs)), cpuNot(cpuEq(lhs, rhs))),
|
|
126
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} > ${rhs})`,
|
|
127
|
+
sideEffects: false,
|
|
120
128
|
});
|
|
121
129
|
/**
|
|
122
|
-
* Checks **component-wise** whether `lhs >= rhs`.
|
|
123
|
-
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
124
|
-
* @example
|
|
125
|
-
* ge(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, false)
|
|
126
|
-
* ge(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, true)
|
|
127
|
-
* all(ge(vec4i(2, 2, 4, 5), vec4i(1, 2, 3, 4))) // returns true
|
|
128
|
-
*/
|
|
129
|
-
const ge = dualImpl({
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
130
|
+
* Checks **component-wise** whether `lhs >= rhs`.
|
|
131
|
+
* This function does **not** return `bool`, for that use-case, wrap the result in `all`.
|
|
132
|
+
* @example
|
|
133
|
+
* ge(vec2f(0.0, 0.0), vec2f(0.0, 1.0)) // returns vec2b(true, false)
|
|
134
|
+
* ge(vec3u(0, 1, 2), vec3u(2, 1, 0)) // returns vec3b(false, true, true)
|
|
135
|
+
* all(ge(vec4i(2, 2, 4, 5), vec4i(1, 2, 3, 4))) // returns true
|
|
136
|
+
*/
|
|
137
|
+
export const ge = dualImpl({
|
|
138
|
+
name: 'ge',
|
|
139
|
+
signature: (...argTypes) => ({
|
|
140
|
+
argTypes: argTypes,
|
|
141
|
+
returnType: correspondingBooleanVectorSchema(argTypes[0]),
|
|
142
|
+
}),
|
|
143
|
+
normalImpl: (lhs, rhs) => cpuNot(cpuLt(lhs, rhs)),
|
|
144
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} >= ${rhs})`,
|
|
145
|
+
sideEffects: false,
|
|
137
146
|
});
|
|
138
147
|
function cpuNot(value) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
148
|
+
if (typeof value === 'boolean') {
|
|
149
|
+
return !value;
|
|
150
|
+
}
|
|
151
|
+
if (!isVecBoolInstance(value)) {
|
|
152
|
+
throw new Error(`'std.not' requires a boolean or boolean vector.`);
|
|
153
|
+
}
|
|
154
|
+
switch (value.length) {
|
|
155
|
+
case 2:
|
|
156
|
+
return vec2b(cpuNot(value.x), cpuNot(value.y));
|
|
157
|
+
case 3:
|
|
158
|
+
return vec3b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z));
|
|
159
|
+
case 4:
|
|
160
|
+
return vec4b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z), cpuNot(value.w));
|
|
161
|
+
}
|
|
146
162
|
}
|
|
147
163
|
/**
|
|
148
|
-
* Returns the logical negation of the given value.
|
|
149
|
-
* For
|
|
150
|
-
* For boolean vectors, returns **component-wise** `!value`.
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
};
|
|
170
|
-
},
|
|
171
|
-
normalImpl: cpuNot,
|
|
172
|
-
codegenImpl: (_ctx, [arg]) => {
|
|
173
|
-
const { dataType } = arg;
|
|
174
|
-
if (isBool(dataType)) return stitch`!${arg}`;
|
|
175
|
-
if (isNumericSchema(dataType)) return stitch`!bool(${arg})`;
|
|
176
|
-
if (isVecBool(dataType)) return stitch`!(${arg})`;
|
|
177
|
-
if (isVec(dataType)) return stitch`!(${`vec${dataType.componentCount}<bool>`}(${arg}))`;
|
|
178
|
-
return "false";
|
|
179
|
-
}
|
|
164
|
+
* Returns the logical negation of the given value.
|
|
165
|
+
* For booleans returns `!value`.
|
|
166
|
+
* For boolean vectors, returns **component-wise** `!value`.
|
|
167
|
+
* @example
|
|
168
|
+
* not(true) // returns false
|
|
169
|
+
* not(vec3b(true, true, false)) // returns vec3b(false, false, true)
|
|
170
|
+
*/
|
|
171
|
+
export const not = dualImpl({
|
|
172
|
+
name: 'not',
|
|
173
|
+
signature: (arg) => {
|
|
174
|
+
if (!isBool(arg) && !isVecBool(arg)) {
|
|
175
|
+
throw new SignatureNotSupportedError([arg], [bool, vec2b, vec3b, vec4b]);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
argTypes: [arg],
|
|
179
|
+
returnType: arg,
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
normalImpl: cpuNot,
|
|
183
|
+
codegenImpl: (_ctx, [arg]) => stitch `!(${arg})`,
|
|
184
|
+
sideEffects: false,
|
|
180
185
|
});
|
|
181
186
|
const cpuOr = (lhs, rhs) => VectorOps.or[lhs.kind](lhs, rhs);
|
|
182
187
|
/**
|
|
183
|
-
* Returns **component-wise** logical `or` result.
|
|
184
|
-
* @example
|
|
185
|
-
* or(vec2b(false, true), vec2b(false, false)) // returns vec2b(false, true)
|
|
186
|
-
* or(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(true, true, false)
|
|
187
|
-
*/
|
|
188
|
-
const or = dualImpl({
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
normalImpl: cpuOr,
|
|
195
|
-
codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} | ${rhs})`
|
|
188
|
+
* Returns **component-wise** logical `or` result.
|
|
189
|
+
* @example
|
|
190
|
+
* or(vec2b(false, true), vec2b(false, false)) // returns vec2b(false, true)
|
|
191
|
+
* or(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(true, true, false)
|
|
192
|
+
*/
|
|
193
|
+
export const or = dualImpl({
|
|
194
|
+
name: 'or',
|
|
195
|
+
signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),
|
|
196
|
+
normalImpl: cpuOr,
|
|
197
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} | ${rhs})`,
|
|
198
|
+
sideEffects: false,
|
|
196
199
|
});
|
|
197
200
|
const cpuAnd = (lhs, rhs) => cpuNot(cpuOr(cpuNot(lhs), cpuNot(rhs)));
|
|
198
201
|
/**
|
|
199
|
-
* Returns **component-wise** logical `and` result.
|
|
200
|
-
* @example
|
|
201
|
-
* and(vec2b(false, true), vec2b(true, true)) // returns vec2b(false, true)
|
|
202
|
-
* and(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(false, true, false)
|
|
203
|
-
*/
|
|
204
|
-
const and = dualImpl({
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
normalImpl: cpuAnd,
|
|
211
|
-
codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} & ${rhs})`
|
|
202
|
+
* Returns **component-wise** logical `and` result.
|
|
203
|
+
* @example
|
|
204
|
+
* and(vec2b(false, true), vec2b(true, true)) // returns vec2b(false, true)
|
|
205
|
+
* and(vec3b(true, true, false), vec3b(false, true, false)) // returns vec3b(false, true, false)
|
|
206
|
+
*/
|
|
207
|
+
export const and = dualImpl({
|
|
208
|
+
name: 'and',
|
|
209
|
+
signature: (...argTypes) => ({ argTypes, returnType: argTypes[0] }),
|
|
210
|
+
normalImpl: cpuAnd,
|
|
211
|
+
codegenImpl: (_ctx, [lhs, rhs]) => stitch `(${lhs} & ${rhs})`,
|
|
212
|
+
sideEffects: false,
|
|
212
213
|
});
|
|
214
|
+
// logical aggregation
|
|
213
215
|
const cpuAll = (value) => VectorOps.all[value.kind](value);
|
|
214
216
|
/**
|
|
215
|
-
* Returns `true` if each component of `value` is true.
|
|
216
|
-
* @example
|
|
217
|
-
* all(vec2b(false, true)) // returns false
|
|
218
|
-
* all(vec3b(true, true, true)) // returns true
|
|
219
|
-
*/
|
|
220
|
-
const all = dualImpl({
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
normalImpl: cpuAll,
|
|
227
|
-
codegenImpl: (_ctx, [value]) => stitch`all(${value})`
|
|
217
|
+
* Returns `true` if each component of `value` is true.
|
|
218
|
+
* @example
|
|
219
|
+
* all(vec2b(false, true)) // returns false
|
|
220
|
+
* all(vec3b(true, true, true)) // returns true
|
|
221
|
+
*/
|
|
222
|
+
export const all = dualImpl({
|
|
223
|
+
name: 'all',
|
|
224
|
+
signature: (...argTypes) => ({ argTypes, returnType: bool }),
|
|
225
|
+
normalImpl: cpuAll,
|
|
226
|
+
codegenImpl: (_ctx, [value]) => stitch `all(${value})`,
|
|
227
|
+
sideEffects: false,
|
|
228
228
|
});
|
|
229
229
|
/**
|
|
230
|
-
* Returns `true` if any component of `value` is true.
|
|
231
|
-
* @example
|
|
232
|
-
* any(vec2b(false, true)) // returns true
|
|
233
|
-
* any(vec3b(false, false, false)) // returns false
|
|
234
|
-
*/
|
|
235
|
-
const any = dualImpl({
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
normalImpl: (value) => !cpuAll(cpuNot(value)),
|
|
242
|
-
codegenImpl: (_ctx, [arg]) => stitch`any(${arg})`
|
|
230
|
+
* Returns `true` if any component of `value` is true.
|
|
231
|
+
* @example
|
|
232
|
+
* any(vec2b(false, true)) // returns true
|
|
233
|
+
* any(vec3b(false, false, false)) // returns false
|
|
234
|
+
*/
|
|
235
|
+
export const any = dualImpl({
|
|
236
|
+
name: 'any',
|
|
237
|
+
signature: (...argTypes) => ({ argTypes, returnType: bool }),
|
|
238
|
+
normalImpl: (value) => !cpuAll(cpuNot(value)),
|
|
239
|
+
codegenImpl: (_ctx, [arg]) => stitch `any(${arg})`,
|
|
240
|
+
sideEffects: false,
|
|
243
241
|
});
|
|
242
|
+
// other
|
|
244
243
|
/**
|
|
245
|
-
* Checks whether the given elements differ by at most the `precision` value.
|
|
246
|
-
* Checks all elements of `lhs` and `rhs` if arguments are vectors.
|
|
247
|
-
* @example
|
|
248
|
-
* isCloseTo(0, 0.1) // returns false
|
|
249
|
-
* isCloseTo(vec3f(0, 0, 0), vec3f(0.002, -0.009, 0)) // returns true
|
|
250
|
-
*
|
|
251
|
-
* @param {number} precision argument that specifies the maximum allowed difference, 0.01 by default.
|
|
252
|
-
*/
|
|
253
|
-
const isCloseTo = dualImpl({
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
244
|
+
* Checks whether the given elements differ by at most the `precision` value.
|
|
245
|
+
* Checks all elements of `lhs` and `rhs` if arguments are vectors.
|
|
246
|
+
* @example
|
|
247
|
+
* isCloseTo(0, 0.1) // returns false
|
|
248
|
+
* isCloseTo(vec3f(0, 0, 0), vec3f(0.002, -0.009, 0)) // returns true
|
|
249
|
+
*
|
|
250
|
+
* @param {number} precision argument that specifies the maximum allowed difference, 0.01 by default.
|
|
251
|
+
*/
|
|
252
|
+
export const isCloseTo = dualImpl({
|
|
253
|
+
name: 'isCloseTo',
|
|
254
|
+
signature: (...args) => ({
|
|
255
|
+
argTypes: args,
|
|
256
|
+
returnType: bool,
|
|
257
|
+
}),
|
|
258
|
+
// CPU implementation
|
|
259
|
+
normalImpl: (lhs, rhs, precision = 0.01) => {
|
|
260
|
+
if (typeof lhs === 'number' && typeof rhs === 'number') {
|
|
261
|
+
return Math.abs(lhs - rhs) < precision;
|
|
262
|
+
}
|
|
263
|
+
if (isVecInstance(lhs) && isVecInstance(rhs)) {
|
|
264
|
+
return VectorOps.isCloseToZero[lhs.kind](sub(lhs, rhs), precision);
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
},
|
|
268
|
+
// GPU implementation
|
|
269
|
+
codegenImpl: (_ctx, [lhs, rhs, precision = snip(0.01, f32, /* origin */ 'constant', false)]) => {
|
|
270
|
+
if (isSnippetNumeric(lhs) && isSnippetNumeric(rhs)) {
|
|
271
|
+
return stitch `(abs(f32(${lhs}) - f32(${rhs})) <= ${precision})`;
|
|
272
|
+
}
|
|
273
|
+
if (!isSnippetNumeric(lhs) && !isSnippetNumeric(rhs)) {
|
|
274
|
+
// https://www.w3.org/TR/WGSL/#vector-multi-component:~:text=Binary%20arithmetic%20expressions%20with%20mixed%20scalar%20and%20vector%20operands
|
|
275
|
+
// (a-a)+prec creates a vector of a.length elements, all equal to prec
|
|
276
|
+
return stitch `all(abs(${lhs} - ${rhs}) <= (${lhs} - ${lhs}) + ${precision})`;
|
|
277
|
+
}
|
|
278
|
+
return 'false';
|
|
279
|
+
},
|
|
280
|
+
sideEffects: false,
|
|
269
281
|
});
|
|
270
282
|
function cpuSelect(f, t, cond) {
|
|
271
|
-
|
|
272
|
-
|
|
283
|
+
if (typeof cond === 'boolean') {
|
|
284
|
+
return cpuCopy(cond ? t : f);
|
|
285
|
+
}
|
|
286
|
+
return VectorOps.select[f.kind](f, t, cond);
|
|
273
287
|
}
|
|
274
|
-
const validSelectBranchTypes = [
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
288
|
+
export const validSelectBranchTypes = [
|
|
289
|
+
f32,
|
|
290
|
+
f16,
|
|
291
|
+
i32,
|
|
292
|
+
u32,
|
|
293
|
+
bool,
|
|
294
|
+
vec2f,
|
|
295
|
+
vec3f,
|
|
296
|
+
vec4f,
|
|
297
|
+
vec2h,
|
|
298
|
+
vec3h,
|
|
299
|
+
vec4h,
|
|
300
|
+
vec2i,
|
|
301
|
+
vec3i,
|
|
302
|
+
vec4i,
|
|
303
|
+
vec2u,
|
|
304
|
+
vec3u,
|
|
305
|
+
vec4u,
|
|
306
|
+
vec2b,
|
|
307
|
+
vec3b,
|
|
308
|
+
vec4b,
|
|
295
309
|
];
|
|
296
310
|
/**
|
|
297
|
-
* Returns `t` if `cond` is `true`, and `f` otherwise.
|
|
298
|
-
* Component-wise if `cond` is a vector.
|
|
299
|
-
* @example
|
|
300
|
-
* select(1, 2, false) // returns 1
|
|
301
|
-
* select(1, 2, true) // returns 2
|
|
302
|
-
* select(vec2i(1, 2), vec2i(3, 4), true) // returns vec2i(3, 4)
|
|
303
|
-
* select(vec2i(1, 2), vec2i(3, 4), vec2b(false, true)) // returns vec2i(1, 4)
|
|
304
|
-
*/
|
|
305
|
-
const select = dualImpl({
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
}
|
|
327
|
-
return result;
|
|
328
|
-
}
|
|
311
|
+
* Returns `t` if `cond` is `true`, and `f` otherwise.
|
|
312
|
+
* Component-wise if `cond` is a vector.
|
|
313
|
+
* @example
|
|
314
|
+
* select(1, 2, false) // returns 1
|
|
315
|
+
* select(1, 2, true) // returns 2
|
|
316
|
+
* select(vec2i(1, 2), vec2i(3, 4), true) // returns vec2i(3, 4)
|
|
317
|
+
* select(vec2i(1, 2), vec2i(3, 4), vec2b(false, true)) // returns vec2i(1, 4)
|
|
318
|
+
*/
|
|
319
|
+
export const select = dualImpl({
|
|
320
|
+
name: 'select',
|
|
321
|
+
signature: (f, t, cond) => {
|
|
322
|
+
const [uf, ut] = unify([f, t], validSelectBranchTypes) ?? [f, t];
|
|
323
|
+
return { argTypes: [uf, ut, cond], returnType: uf };
|
|
324
|
+
},
|
|
325
|
+
normalImpl: cpuSelect,
|
|
326
|
+
codegenImpl: (ctx, [f, t, cond]) => {
|
|
327
|
+
const result = ctx.gen.emitCall('select', [], [f, t, cond]);
|
|
328
|
+
if (!validSelectBranchTypes.includes(f.dataType) ||
|
|
329
|
+
!validSelectBranchTypes.includes(t.dataType)) {
|
|
330
|
+
throw new Error(`'${result}' is invalid, std.select requires both branches to be either scalars or vectors.`);
|
|
331
|
+
}
|
|
332
|
+
if (f.dataType !== t.dataType) {
|
|
333
|
+
const fStr = ctx.resolve(f.dataType);
|
|
334
|
+
const tStr = ctx.resolve(t.dataType);
|
|
335
|
+
throw new Error(`'${result}' is invalid, std.select requires both branches to be the same type, got [${fStr.value}, ${tStr.value}].`);
|
|
336
|
+
}
|
|
337
|
+
return result;
|
|
338
|
+
},
|
|
339
|
+
sideEffects: false,
|
|
329
340
|
});
|
|
330
|
-
|
|
331
|
-
//#endregion
|
|
332
|
-
export { all, allEq, and, any, eq, ge, gt, isCloseTo, le, lt, ne, not, or, select, validSelectBranchTypes };
|
package/std/copy.d.ts
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//#region src/std/copy.d.ts
|
|
4
|
-
declare function cpuCopy<T>(e: T): T;
|
|
5
|
-
declare const copy: DualFn<typeof cpuCopy>;
|
|
6
|
-
//#endregion
|
|
7
|
-
export { copy };
|
|
1
|
+
export declare function cpuCopy<T>(e: T): T;
|
|
2
|
+
export declare const copy: import("../types.ts").DualFn<typeof cpuCopy>;
|