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.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
package/std/boolean.js CHANGED
@@ -1,332 +1,340 @@
1
- import { isBool, isNumericSchema, isVec, isVecBool, isVecInstance } from "../data/wgslTypes.js";
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 { vec2b, vec2f, vec2h, vec2i, vec2u, vec3b, vec3f, vec3h, vec3i, vec3u, vec4b, vec4f, vec4h, vec4i, vec4u } from "../data/vector.js";
7
- import { dualImpl } from "../core/function/dualImpl.js";
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
- if (dataType.type.includes("2")) return vec2b;
14
- if (dataType.type.includes("3")) return vec3b;
15
- return vec4b;
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
- name: "allEq",
26
- signature: (...argTypes) => ({
27
- argTypes,
28
- returnType: bool
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
- name: "eq",
45
- signature: (...argTypes) => ({
46
- argTypes,
47
- returnType: correspondingBooleanVectorSchema(argTypes[0])
48
- }),
49
- normalImpl: cpuEq,
50
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} == ${rhs})`
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
- name: "ne",
62
- signature: (...argTypes) => ({
63
- argTypes,
64
- returnType: correspondingBooleanVectorSchema(argTypes[0])
65
- }),
66
- normalImpl: (lhs, rhs) => cpuNot(cpuEq(lhs, rhs)),
67
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} != ${rhs})`
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
- name: "lt",
80
- signature: (...argTypes) => ({
81
- argTypes,
82
- returnType: correspondingBooleanVectorSchema(argTypes[0])
83
- }),
84
- normalImpl: cpuLt,
85
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} < ${rhs})`
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
- name: "le",
97
- signature: (...argTypes) => ({
98
- argTypes,
99
- returnType: correspondingBooleanVectorSchema(argTypes[0])
100
- }),
101
- normalImpl: (lhs, rhs) => cpuOr(cpuLt(lhs, rhs), cpuEq(lhs, rhs)),
102
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} <= ${rhs})`
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
- name: "gt",
114
- signature: (...argTypes) => ({
115
- argTypes,
116
- returnType: correspondingBooleanVectorSchema(argTypes[0])
117
- }),
118
- normalImpl: (lhs, rhs) => cpuAnd(cpuNot(cpuLt(lhs, rhs)), cpuNot(cpuEq(lhs, rhs))),
119
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} > ${rhs})`
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
- name: "ge",
131
- signature: (...argTypes) => ({
132
- argTypes,
133
- returnType: correspondingBooleanVectorSchema(argTypes[0])
134
- }),
135
- normalImpl: (lhs, rhs) => cpuNot(cpuLt(lhs, rhs)),
136
- codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} >= ${rhs})`
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
- if (typeof value === "number" && isNaN(value)) return false;
140
- if (isVecInstance(value)) {
141
- if (value.length === 2) return vec2b(cpuNot(value.x), cpuNot(value.y));
142
- if (value.length === 3) return vec3b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z));
143
- if (value.length === 4) return vec4b(cpuNot(value.x), cpuNot(value.y), cpuNot(value.z), cpuNot(value.w));
144
- }
145
- return !value;
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 scalars (bool, number), returns `!value`.
150
- * For boolean vectors, returns **component-wise** `!value`.
151
- * For numeric vectors, returns a boolean vector with component-wise truthiness negation.
152
- * For all other types, returns the truthiness negation (in WGSL, this applies only if the value is known at compile-time).
153
- * @example
154
- * not(true) // returns false
155
- * not(-1) // returns false
156
- * not(0) // returns true
157
- * not(vec3b(true, true, false)) // returns vec3b(false, false, true)
158
- * not(vec3f(1.0, 0.0, -1.0)) // returns vec3b(false, true, false)
159
- * not({a: 1882}) // returns false
160
- * not(NaN) // returns false **as in WGSL**
161
- */
162
- const not = dualImpl({
163
- name: "not",
164
- signature: (arg) => {
165
- const returnType = isVec(arg) ? correspondingBooleanVectorSchema(arg) : bool;
166
- return {
167
- argTypes: [arg],
168
- returnType
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
- name: "or",
190
- signature: (...argTypes) => ({
191
- argTypes,
192
- returnType: argTypes[0]
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
- name: "and",
206
- signature: (...argTypes) => ({
207
- argTypes,
208
- returnType: argTypes[0]
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
- name: "all",
222
- signature: (...argTypes) => ({
223
- argTypes,
224
- returnType: bool
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
- name: "any",
237
- signature: (...argTypes) => ({
238
- argTypes,
239
- returnType: bool
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
- name: "isCloseTo",
255
- signature: (...args) => ({
256
- argTypes: args,
257
- returnType: bool
258
- }),
259
- normalImpl: (lhs, rhs, precision = .01) => {
260
- if (typeof lhs === "number" && typeof rhs === "number") return Math.abs(lhs - rhs) < precision;
261
- if (isVecInstance(lhs) && isVecInstance(rhs)) return VectorOps.isCloseToZero[lhs.kind](sub(lhs, rhs), precision);
262
- return false;
263
- },
264
- codegenImpl: (_ctx, [lhs, rhs, precision = snip(.01, f32, "constant")]) => {
265
- if (isSnippetNumeric(lhs) && isSnippetNumeric(rhs)) return stitch`(abs(f32(${lhs}) - f32(${rhs})) <= ${precision})`;
266
- if (!isSnippetNumeric(lhs) && !isSnippetNumeric(rhs)) return stitch`all(abs(${lhs} - ${rhs}) <= (${lhs} - ${lhs}) + ${precision})`;
267
- return "false";
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
- if (typeof cond === "boolean") return cond ? t : f;
272
- return VectorOps.select[f.kind](f, t, cond);
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
- f32,
276
- f16,
277
- i32,
278
- u32,
279
- bool,
280
- vec2f,
281
- vec3f,
282
- vec4f,
283
- vec2h,
284
- vec3h,
285
- vec4h,
286
- vec2i,
287
- vec3i,
288
- vec4i,
289
- vec2u,
290
- vec3u,
291
- vec4u,
292
- vec2b,
293
- vec3b,
294
- vec4b
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
- name: "select",
307
- signature: (f, t, cond) => {
308
- const [uf, ut] = unify([f, t], validSelectBranchTypes) ?? [f, t];
309
- return {
310
- argTypes: [
311
- uf,
312
- ut,
313
- cond
314
- ],
315
- returnType: uf
316
- };
317
- },
318
- normalImpl: cpuSelect,
319
- codegenImpl: (ctx, [f, t, cond]) => {
320
- const result = stitch`select(${f}, ${t}, ${cond})`;
321
- if (!validSelectBranchTypes.includes(f.dataType) || !validSelectBranchTypes.includes(t.dataType)) throw new Error(`'${result}' is invalid, std.select requires both branches to be either scalars or vectors.`);
322
- if (f.dataType !== t.dataType) {
323
- const fStr = ctx.resolve(f.dataType);
324
- const tStr = ctx.resolve(t.dataType);
325
- throw new Error(`'${result}' is invalid, std.select requires both branches to be the same type, got [${fStr.value}, ${tStr.value}].`);
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
- import { DualFn } from "../types.js";
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>;