@onerjs/core 8.56.4 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/Animations/animatable.core.js +36 -0
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animationGroup.pure.d.ts +61 -1
  4. package/Animations/animationGroup.pure.js +191 -2
  5. package/Animations/animationGroup.pure.js.map +1 -1
  6. package/Animations/index.d.ts +1 -0
  7. package/Animations/index.js +1 -0
  8. package/Animations/index.js.map +1 -1
  9. package/Animations/pure.d.ts +1 -0
  10. package/Animations/pure.js +1 -0
  11. package/Animations/pure.js.map +1 -1
  12. package/Animations/rootMotion.d.ts +560 -0
  13. package/Animations/rootMotion.js +1709 -0
  14. package/Animations/rootMotion.js.map +1 -0
  15. package/Animations/runtimeAnimation.d.ts +57 -0
  16. package/Animations/runtimeAnimation.js +127 -3
  17. package/Animations/runtimeAnimation.js.map +1 -1
  18. package/Cameras/arcRotateCamera.pure.d.ts +2 -0
  19. package/Cameras/arcRotateCamera.pure.js +2 -0
  20. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  21. package/Cameras/targetCamera.pure.d.ts +2 -0
  22. package/Cameras/targetCamera.pure.js +13 -2
  23. package/Cameras/targetCamera.pure.js.map +1 -1
  24. package/Collisions/gpuPicker.js +5 -5
  25. package/Collisions/gpuPicker.js.map +1 -1
  26. package/Engines/AbstractEngine/abstractEngine.query.pure.js +4 -2
  27. package/Engines/AbstractEngine/abstractEngine.query.pure.js.map +1 -1
  28. package/Engines/AbstractEngine/abstractEngine.query.types.d.ts +11 -2
  29. package/Engines/AbstractEngine/abstractEngine.query.types.js.map +1 -1
  30. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js +1 -0
  31. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js.map +1 -1
  32. package/Engines/Extensions/engine.multiRender.pure.js +63 -0
  33. package/Engines/Extensions/engine.multiRender.pure.js.map +1 -1
  34. package/Engines/Extensions/engine.multiRender.types.d.ts +13 -0
  35. package/Engines/Extensions/engine.multiRender.types.js.map +1 -1
  36. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +2 -2
  37. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
  38. package/Engines/Extensions/engine.prefilteredCubeTexture.types.d.ts +2 -1
  39. package/Engines/Extensions/engine.prefilteredCubeTexture.types.js.map +1 -1
  40. package/Engines/Extensions/index.d.ts +1 -0
  41. package/Engines/Extensions/index.js +1 -0
  42. package/Engines/Extensions/index.js.map +1 -1
  43. package/Engines/Extensions/pure.d.ts +1 -1
  44. package/Engines/Extensions/pure.js +1 -1
  45. package/Engines/Extensions/pure.js.map +1 -1
  46. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +88 -39
  47. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
  48. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.d.ts +20 -2
  49. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.js.map +1 -1
  50. package/Engines/Native/nativeHardwareTexture.d.ts +8 -1
  51. package/Engines/Native/nativeHardwareTexture.js +7 -0
  52. package/Engines/Native/nativeHardwareTexture.js.map +1 -1
  53. package/Engines/Native/nativeHelpers.js +56 -1
  54. package/Engines/Native/nativeHelpers.js.map +1 -1
  55. package/Engines/Native/nativeInterfaces.d.ts +37 -8
  56. package/Engines/Native/nativeInterfaces.js.map +1 -1
  57. package/Engines/Native/nativeRenderTargetWrapper.d.ts +40 -0
  58. package/Engines/Native/nativeRenderTargetWrapper.js +265 -5
  59. package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
  60. package/Engines/Processors/shaderCodeCursor.d.ts +1 -0
  61. package/Engines/Processors/shaderCodeCursor.js +40 -3
  62. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  63. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +4 -0
  64. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.multiRender.types.d.ts +13 -0
  66. package/Engines/WebGPU/Extensions/engine.multiRender.types.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.query.pure.js +11 -3
  68. package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js +1 -0
  70. package/Engines/WebGPU/Extensions/engine.renderTarget.pure.js.map +1 -1
  71. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  72. package/Engines/WebGPU/Extensions/index.js +1 -0
  73. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  74. package/Engines/WebGPU/Extensions/pure.d.ts +1 -1
  75. package/Engines/WebGPU/Extensions/pure.js +1 -1
  76. package/Engines/WebGPU/Extensions/pure.js.map +1 -1
  77. package/Engines/WebGPU/webgpuBundleList.d.ts +2 -0
  78. package/Engines/WebGPU/webgpuBundleList.js +4 -0
  79. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  80. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -2
  81. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  82. package/Engines/WebGPU/webgpuHardwareTexture.js +3 -1
  83. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  84. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  85. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  86. package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +4 -0
  87. package/Engines/WebGPU/webgpuSnapshotRendering.js +40 -7
  88. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
  89. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -1
  90. package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
  91. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  92. package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -0
  93. package/Engines/WebGPU/webgpuTextureManager.js +286 -13
  94. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  95. package/Engines/abstractEngine.pure.d.ts +17 -1
  96. package/Engines/abstractEngine.pure.js +17 -5
  97. package/Engines/abstractEngine.pure.js.map +1 -1
  98. package/Engines/constants.d.ts +4 -0
  99. package/Engines/constants.js +4 -0
  100. package/Engines/constants.js.map +1 -1
  101. package/Engines/engine.pure.d.ts +0 -1
  102. package/Engines/engine.pure.js +0 -7
  103. package/Engines/engine.pure.js.map +1 -1
  104. package/Engines/nativeEngine.pure.js +1 -1
  105. package/Engines/nativeEngine.pure.js.map +1 -1
  106. package/Engines/thinEngine.pure.d.ts +15 -0
  107. package/Engines/thinEngine.pure.js +61 -14
  108. package/Engines/thinEngine.pure.js.map +1 -1
  109. package/Engines/thinNativeEngine.pure.d.ts +218 -17
  110. package/Engines/thinNativeEngine.pure.js +1438 -165
  111. package/Engines/thinNativeEngine.pure.js.map +1 -1
  112. package/Engines/thinWebGPUEngine.d.ts +4 -0
  113. package/Engines/thinWebGPUEngine.js +16 -2
  114. package/Engines/thinWebGPUEngine.js.map +1 -1
  115. package/Engines/webgpuEngine.pure.d.ts +17 -3
  116. package/Engines/webgpuEngine.pure.js +56 -13
  117. package/Engines/webgpuEngine.pure.js.map +1 -1
  118. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +2 -2
  119. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
  120. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.d.ts +10 -0
  121. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +24 -12
  122. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js.map +1 -1
  123. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.d.ts +11 -2
  124. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +1 -1
  125. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
  126. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.d.ts +7 -0
  127. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js +43 -0
  128. package/FlowGraph/Blocks/Data/flowGraphGetPropertyBlock.pure.js.map +1 -1
  129. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.d.ts +9 -1
  130. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js +6 -8
  131. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js.map +1 -1
  132. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.d.ts +2 -0
  133. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js +5 -1
  134. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js.map +1 -1
  135. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.d.ts +2 -0
  136. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js +5 -1
  137. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js.map +1 -1
  138. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +9 -0
  139. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +34 -9
  140. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
  141. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +2 -0
  142. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +4 -0
  143. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
  144. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +18 -4
  145. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +24 -6
  146. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
  147. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js +19 -7
  148. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js.map +1 -1
  149. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js +3 -3
  150. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
  151. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
  152. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +85 -25
  153. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
  154. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.d.ts +16 -1
  155. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +64 -14
  156. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
  157. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.d.ts +12 -1
  158. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +8 -0
  159. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
  160. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +4 -1
  161. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
  162. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.d.ts +12 -1
  163. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js +5 -1
  164. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.js.map +1 -1
  165. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js +64 -16
  166. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js.map +1 -1
  167. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.d.ts +2 -0
  168. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js +14 -2
  169. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.js.map +1 -1
  170. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.d.ts +5 -1
  171. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js +23 -8
  172. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.pure.js.map +1 -1
  173. package/FlowGraph/CustomTypes/flowGraphInteger.pure.d.ts +5 -0
  174. package/FlowGraph/CustomTypes/flowGraphInteger.pure.js +7 -0
  175. package/FlowGraph/CustomTypes/flowGraphInteger.pure.js.map +1 -1
  176. package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +10 -0
  177. package/FlowGraph/CustomTypes/flowGraphMatrix.js +14 -0
  178. package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
  179. package/FlowGraph/flowGraph.d.ts +6 -1
  180. package/FlowGraph/flowGraph.js +41 -9
  181. package/FlowGraph/flowGraph.js.map +1 -1
  182. package/FlowGraph/flowGraphAnimationHelpers.d.ts +24 -0
  183. package/FlowGraph/flowGraphAnimationHelpers.js +21 -0
  184. package/FlowGraph/flowGraphAnimationHelpers.js.map +1 -0
  185. package/FlowGraph/flowGraphBlock.js +3 -0
  186. package/FlowGraph/flowGraphBlock.js.map +1 -1
  187. package/FlowGraph/flowGraphConnection.d.ts +7 -0
  188. package/FlowGraph/flowGraphConnection.js +7 -0
  189. package/FlowGraph/flowGraphConnection.js.map +1 -1
  190. package/FlowGraph/flowGraphContext.d.ts +2 -1
  191. package/FlowGraph/flowGraphContext.js +5 -3
  192. package/FlowGraph/flowGraphContext.js.map +1 -1
  193. package/FlowGraph/flowGraphCoordinator.d.ts +15 -1
  194. package/FlowGraph/flowGraphCoordinator.js +47 -16
  195. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  196. package/FlowGraph/flowGraphEventBlock.d.ts +5 -0
  197. package/FlowGraph/flowGraphEventBlock.js +7 -0
  198. package/FlowGraph/flowGraphEventBlock.js.map +1 -1
  199. package/FlowGraph/flowGraphHostResolver.d.ts +2 -1
  200. package/FlowGraph/flowGraphHostResolver.js.map +1 -1
  201. package/FlowGraph/flowGraphParser.js +60 -2
  202. package/FlowGraph/flowGraphParser.js.map +1 -1
  203. package/FlowGraph/flowGraphValidator.js +0 -4
  204. package/FlowGraph/flowGraphValidator.js.map +1 -1
  205. package/FlowGraph/index.d.ts +2 -0
  206. package/FlowGraph/index.js +2 -0
  207. package/FlowGraph/index.js.map +1 -1
  208. package/FlowGraph/pure.d.ts +2 -0
  209. package/FlowGraph/pure.js +2 -0
  210. package/FlowGraph/pure.js.map +1 -1
  211. package/FlowGraph/serialization.d.ts +4 -2
  212. package/FlowGraph/serialization.js +12 -24
  213. package/FlowGraph/serialization.js.map +1 -1
  214. package/FlowGraph/typeDefinitions.d.ts +9 -1
  215. package/FlowGraph/typeDefinitions.js.map +1 -1
  216. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.d.ts +5 -0
  217. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js +8 -0
  218. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js.map +1 -0
  219. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.d.ts +87 -0
  220. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js +295 -0
  221. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js.map +1 -0
  222. package/FrameGraph/Node/Blocks/PostProcesses/pure.d.ts +1 -0
  223. package/FrameGraph/Node/Blocks/PostProcesses/pure.js +1 -0
  224. package/FrameGraph/Node/Blocks/PostProcesses/pure.js.map +1 -1
  225. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +4 -4
  226. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  227. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +5 -1
  228. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +13 -1
  229. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  230. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.d.ts +1 -0
  231. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js +4 -0
  232. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.js.map +1 -0
  233. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.d.ts +54 -0
  234. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js +155 -0
  235. package/FrameGraph/Node/Blocks/Textures/minMaxReducerBlock.pure.js.map +1 -0
  236. package/FrameGraph/Node/Blocks/Textures/pure.d.ts +1 -0
  237. package/FrameGraph/Node/Blocks/Textures/pure.js +1 -0
  238. package/FrameGraph/Node/Blocks/Textures/pure.js.map +1 -1
  239. package/FrameGraph/Node/Blocks/allBlocks.pure.js +4 -0
  240. package/FrameGraph/Node/Blocks/allBlocks.pure.js.map +1 -1
  241. package/FrameGraph/Node/Blocks/index.d.ts +2 -0
  242. package/FrameGraph/Node/Blocks/index.js +2 -0
  243. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  244. package/FrameGraph/Node/Blocks/inputBlock.pure.js +20 -1
  245. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  246. package/FrameGraph/Node/Blocks/pure.d.ts +2 -0
  247. package/FrameGraph/Node/Blocks/pure.js +2 -0
  248. package/FrameGraph/Node/Blocks/pure.js.map +1 -1
  249. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +4 -2
  250. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +4 -2
  251. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  252. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  253. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  254. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +1 -0
  255. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
  256. package/FrameGraph/Tasks/Misc/cullObjectsTask.js +5 -1
  257. package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
  258. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +1 -0
  259. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
  260. package/FrameGraph/Tasks/Misc/minMaxReducerTask.d.ts +62 -0
  261. package/FrameGraph/Tasks/Misc/minMaxReducerTask.js +159 -0
  262. package/FrameGraph/Tasks/Misc/minMaxReducerTask.js.map +1 -0
  263. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.d.ts +69 -0
  264. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js +223 -0
  265. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js.map +1 -0
  266. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +25 -3
  267. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +72 -34
  268. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  269. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -1
  270. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  271. package/FrameGraph/frameGraph.d.ts +4 -0
  272. package/FrameGraph/frameGraph.js +14 -0
  273. package/FrameGraph/frameGraph.js.map +1 -1
  274. package/FrameGraph/frameGraphObjectList.d.ts +6 -1
  275. package/FrameGraph/frameGraphObjectList.js.map +1 -1
  276. package/FrameGraph/frameGraphRenderContext.d.ts +3 -1
  277. package/FrameGraph/frameGraphRenderContext.js +5 -5
  278. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  279. package/FrameGraph/index.d.ts +2 -0
  280. package/FrameGraph/index.js +2 -0
  281. package/FrameGraph/index.js.map +1 -1
  282. package/FrameGraph/pure.d.ts +2 -0
  283. package/FrameGraph/pure.js +2 -0
  284. package/FrameGraph/pure.js.map +1 -1
  285. package/Inputs/scene.inputManager.d.ts +4 -0
  286. package/Inputs/scene.inputManager.js +50 -8
  287. package/Inputs/scene.inputManager.js.map +1 -1
  288. package/Lights/Clustered/clusteredLightingSceneComponent.pure.d.ts +5 -0
  289. package/Lights/Clustered/clusteredLightingSceneComponent.pure.js +22 -1
  290. package/Lights/Clustered/clusteredLightingSceneComponent.pure.js.map +1 -1
  291. package/Lights/Shadows/cascadedShadowGenerator.pure.js +7 -3
  292. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
  293. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.d.ts +7 -0
  294. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js +8 -0
  295. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.js.map +1 -0
  296. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.d.ts +54 -0
  297. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js +81 -0
  298. package/Materials/GaussianSplatting/gaussianPointSplattingBlitMaterial.pure.js.map +1 -0
  299. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.d.ts +7 -0
  300. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js +8 -0
  301. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.js.map +1 -0
  302. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.d.ts +60 -0
  303. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js +90 -0
  304. package/Materials/GaussianSplatting/gaussianPointSplattingDepthBlitMaterial.pure.js.map +1 -0
  305. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.d.ts +31 -0
  306. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +103 -5
  307. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
  308. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +6 -6
  309. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
  310. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
  311. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +153 -49
  312. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  313. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.d.ts +1 -0
  314. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js +4 -0
  315. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.js.map +1 -0
  316. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.d.ts +83 -0
  317. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js +191 -0
  318. package/Materials/GaussianSplatting/gaussianSplattingOverdrawMaterialPlugin.pure.js.map +1 -0
  319. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.d.ts +1 -0
  320. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js +4 -0
  321. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.js.map +1 -0
  322. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.d.ts +62 -0
  323. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js +125 -0
  324. package/Materials/GaussianSplatting/gaussianSplattingSizeMaterialPlugin.pure.js.map +1 -0
  325. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
  326. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
  327. package/Materials/GaussianSplatting/pure.d.ts +4 -0
  328. package/Materials/GaussianSplatting/pure.js +4 -0
  329. package/Materials/GaussianSplatting/pure.js.map +1 -1
  330. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.d.ts +1 -0
  331. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js +12 -0
  332. package/Materials/Node/Blocks/Dual/imageSourceBlock.pure.js.map +1 -1
  333. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +11 -1
  334. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  335. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +17 -2
  336. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  337. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -2
  338. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  339. package/Materials/Node/nodeMaterial.pure.d.ts +4 -0
  340. package/Materials/Node/nodeMaterial.pure.js +4 -0
  341. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  342. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
  343. package/Materials/Node/nodeMaterialBuildState.js +25 -3
  344. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  345. package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -0
  346. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -0
  347. package/Materials/Textures/Procedurals/proceduralTexture.pure.d.ts +14 -14
  348. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +37 -13
  349. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  350. package/Materials/Textures/baseTexture.pure.js +3 -0
  351. package/Materials/Textures/baseTexture.pure.js.map +1 -1
  352. package/Materials/Textures/cubeTexture.pure.js +1 -1
  353. package/Materials/Textures/cubeTexture.pure.js.map +1 -1
  354. package/Materials/Textures/internalTexture.d.ts +8 -1
  355. package/Materials/Textures/internalTexture.js +9 -2
  356. package/Materials/Textures/internalTexture.js.map +1 -1
  357. package/Materials/Textures/mirrorTexture.pure.js +3 -1
  358. package/Materials/Textures/mirrorTexture.pure.js.map +1 -1
  359. package/Materials/Textures/rawTexture2DArray.functions.d.ts +3 -3
  360. package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -1
  361. package/Materials/Textures/rawTexture3D.d.ts +1 -1
  362. package/Materials/Textures/rawTexture3D.js +1 -1
  363. package/Materials/Textures/rawTexture3D.js.map +1 -1
  364. package/Materials/Textures/texture.pure.js +1 -1
  365. package/Materials/Textures/texture.pure.js.map +1 -1
  366. package/Materials/Textures/textureHelper.functions.d.ts +14 -0
  367. package/Materials/Textures/textureHelper.functions.js +24 -0
  368. package/Materials/Textures/textureHelper.functions.js.map +1 -1
  369. package/Materials/ditheredTileFadeMaterialPlugin.d.ts +210 -0
  370. package/Materials/ditheredTileFadeMaterialPlugin.js +509 -0
  371. package/Materials/ditheredTileFadeMaterialPlugin.js.map +1 -0
  372. package/Materials/effectRenderer.pure.d.ts +4 -0
  373. package/Materials/effectRenderer.pure.js +3 -2
  374. package/Materials/effectRenderer.pure.js.map +1 -1
  375. package/Materials/index.d.ts +5 -0
  376. package/Materials/index.js +5 -0
  377. package/Materials/index.js.map +1 -1
  378. package/Materials/material.pure.js +25 -12
  379. package/Materials/material.pure.js.map +1 -1
  380. package/Materials/materialHelper.geometryrendering.d.ts +46 -1
  381. package/Materials/materialHelper.geometryrendering.js +105 -8
  382. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  383. package/Materials/prepass.defines.d.ts +2 -0
  384. package/Materials/prepass.defines.js +2 -0
  385. package/Materials/prepass.defines.js.map +1 -1
  386. package/Materials/pure.d.ts +5 -0
  387. package/Materials/pure.js +5 -0
  388. package/Materials/pure.js.map +1 -1
  389. package/Materials/standardMaterial.pure.d.ts +10 -0
  390. package/Materials/standardMaterial.pure.js +30 -5
  391. package/Materials/standardMaterial.pure.js.map +1 -1
  392. package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
  393. package/Meshes/Builders/polygonBuilder.pure.js +3 -0
  394. package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
  395. package/Meshes/GaussianSplatting/gaussianPointSplattingController.d.ts +8 -0
  396. package/Meshes/GaussianSplatting/gaussianPointSplattingController.js +11 -0
  397. package/Meshes/GaussianSplatting/gaussianPointSplattingController.js.map +1 -0
  398. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.d.ts +231 -0
  399. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js +1212 -0
  400. package/Meshes/GaussianSplatting/gaussianPointSplattingController.pure.js.map +1 -0
  401. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.d.ts +14 -0
  402. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js +15 -0
  403. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.js.map +1 -0
  404. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.d.ts +285 -0
  405. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js +812 -0
  406. package/Meshes/GaussianSplatting/gaussianPointSplattingRenderer.pure.js.map +1 -0
  407. package/Meshes/GaussianSplatting/gaussianSplatting.functions.d.ts +19 -0
  408. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js +23 -0
  409. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js.map +1 -0
  410. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -0
  411. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +2 -0
  412. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  413. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +163 -14
  414. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +239 -24
  415. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  416. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +34 -4
  417. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +125 -25
  418. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  419. package/Meshes/GaussianSplatting/pure.d.ts +2 -0
  420. package/Meshes/GaussianSplatting/pure.js +2 -0
  421. package/Meshes/GaussianSplatting/pure.js.map +1 -1
  422. package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js +25 -11
  423. package/Meshes/Node/Blocks/booleanGeometryBlock.pure.js.map +1 -1
  424. package/Meshes/abstractMesh.pure.d.ts +30 -0
  425. package/Meshes/abstractMesh.pure.js +54 -0
  426. package/Meshes/abstractMesh.pure.js.map +1 -1
  427. package/Meshes/index.d.ts +2 -0
  428. package/Meshes/index.js +2 -0
  429. package/Meshes/index.js.map +1 -1
  430. package/Meshes/instancedMesh.pure.d.ts +5 -0
  431. package/Meshes/instancedMesh.pure.js +12 -0
  432. package/Meshes/instancedMesh.pure.js.map +1 -1
  433. package/Meshes/mesh.pure.js +23 -8
  434. package/Meshes/mesh.pure.js.map +1 -1
  435. package/Meshes/meshBlendingTag.d.ts +47 -0
  436. package/Meshes/meshBlendingTag.js +64 -0
  437. package/Meshes/meshBlendingTag.js.map +1 -0
  438. package/Meshes/polygonMesh.js +2 -2
  439. package/Meshes/polygonMesh.js.map +1 -1
  440. package/Meshes/pure.d.ts +2 -0
  441. package/Meshes/pure.js +2 -0
  442. package/Meshes/pure.js.map +1 -1
  443. package/Meshes/subMesh.pure.d.ts +11 -2
  444. package/Meshes/subMesh.pure.js +20 -5
  445. package/Meshes/subMesh.pure.js.map +1 -1
  446. package/Meshes/thinInstanceMesh.pure.js +1 -0
  447. package/Meshes/thinInstanceMesh.pure.js.map +1 -1
  448. package/Misc/andOrNotEvaluator.js +4 -0
  449. package/Misc/andOrNotEvaluator.js.map +1 -1
  450. package/Misc/fileTools.pure.js +21 -0
  451. package/Misc/fileTools.pure.js.map +1 -1
  452. package/Misc/minMaxReducer.pure.d.ts +6 -0
  453. package/Misc/minMaxReducer.pure.js +10 -0
  454. package/Misc/minMaxReducer.pure.js.map +1 -1
  455. package/Misc/snapshotRenderingHelper.js +2 -2
  456. package/Misc/snapshotRenderingHelper.js.map +1 -1
  457. package/Misc/thinMinMaxReducer.d.ts +19 -2
  458. package/Misc/thinMinMaxReducer.js +74 -21
  459. package/Misc/thinMinMaxReducer.js.map +1 -1
  460. package/Misc/tools.pure.js +1 -1
  461. package/Misc/tools.pure.js.map +1 -1
  462. package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js +19 -7
  463. package/Particles/Node/Blocks/Update/updateNoiseBlock.pure.js.map +1 -1
  464. package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js +3 -2
  465. package/Particles/Node/Blocks/particleSourceTextureBlock.pure.js.map +1 -1
  466. package/Particles/gpuParticleSystem.pure.d.ts +4 -0
  467. package/Particles/gpuParticleSystem.pure.js +101 -32
  468. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  469. package/Particles/particle.js +3 -2
  470. package/Particles/particle.js.map +1 -1
  471. package/Particles/solidParticleSystem.js +7 -1
  472. package/Particles/solidParticleSystem.js.map +1 -1
  473. package/Particles/thinParticleSystem.function.d.ts +6 -0
  474. package/Particles/thinParticleSystem.function.js +144 -88
  475. package/Particles/thinParticleSystem.function.js.map +1 -1
  476. package/Particles/thinParticleSystem.pure.d.ts +8 -0
  477. package/Particles/thinParticleSystem.pure.js +154 -28
  478. package/Particles/thinParticleSystem.pure.js.map +1 -1
  479. package/Particles/webgl2ParticleSystem.pure.d.ts +1 -0
  480. package/Particles/webgl2ParticleSystem.pure.js +12 -4
  481. package/Particles/webgl2ParticleSystem.pure.js.map +1 -1
  482. package/Physics/v2/ragdoll.d.ts +2 -4
  483. package/Physics/v2/ragdoll.js +11 -4
  484. package/Physics/v2/ragdoll.js.map +1 -1
  485. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js +7 -0
  486. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
  487. package/PostProcesses/index.d.ts +2 -0
  488. package/PostProcesses/index.js +2 -0
  489. package/PostProcesses/index.js.map +1 -1
  490. package/PostProcesses/meshBlendingBlueNoise.d.ts +15 -0
  491. package/PostProcesses/meshBlendingBlueNoise.js +77 -0
  492. package/PostProcesses/meshBlendingBlueNoise.js.map +1 -0
  493. package/PostProcesses/meshBlendingPostProcess.d.ts +131 -0
  494. package/PostProcesses/meshBlendingPostProcess.js +315 -0
  495. package/PostProcesses/meshBlendingPostProcess.js.map +1 -0
  496. package/PostProcesses/pure.d.ts +2 -0
  497. package/PostProcesses/pure.js +2 -0
  498. package/PostProcesses/pure.js.map +1 -1
  499. package/PostProcesses/thinMeshBlendingPostProcess.d.ts +339 -0
  500. package/PostProcesses/thinMeshBlendingPostProcess.js +771 -0
  501. package/PostProcesses/thinMeshBlendingPostProcess.js.map +1 -0
  502. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -6
  503. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  504. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +12 -0
  505. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +50 -25
  506. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  507. package/Rendering/boundingBoxRenderer.pure.js +2 -1
  508. package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
  509. package/Rendering/depthRenderer.pure.d.ts +9 -0
  510. package/Rendering/depthRenderer.pure.js +15 -4
  511. package/Rendering/depthRenderer.pure.js.map +1 -1
  512. package/Rendering/edgesRenderer.pure.d.ts +4 -2
  513. package/Rendering/edgesRenderer.pure.js +11 -2
  514. package/Rendering/edgesRenderer.pure.js.map +1 -1
  515. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +14 -0
  516. package/Rendering/fluidRenderer/fluidRenderingObject.js +26 -0
  517. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  518. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +13 -3
  519. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +22 -9
  520. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  521. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -0
  522. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  523. package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
  524. package/Rendering/geometryBufferRenderer.pure.js +130 -18
  525. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  526. package/Rendering/objectRenderer.d.ts +7 -1
  527. package/Rendering/objectRenderer.js +45 -7
  528. package/Rendering/objectRenderer.js.map +1 -1
  529. package/Rendering/outlineRenderer.pure.js +6 -2
  530. package/Rendering/outlineRenderer.pure.js.map +1 -1
  531. package/Rendering/prePassRenderer.pure.js +3 -3
  532. package/Rendering/prePassRenderer.pure.js.map +1 -1
  533. package/Rendering/renderingManager.d.ts +1 -1
  534. package/Rendering/renderingManager.js +5 -4
  535. package/Rendering/renderingManager.js.map +1 -1
  536. package/Shaders/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  537. package/Shaders/ShadersInclude/defaultFragmentAlpha.js +34 -0
  538. package/Shaders/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  539. package/Shaders/ShadersInclude/gaussianSplatting.js +3 -1
  540. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  541. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +5 -1
  542. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  543. package/Shaders/ShadersInclude/geometryRenderingFragment.d.ts +5 -0
  544. package/Shaders/ShadersInclude/geometryRenderingFragment.js +74 -0
  545. package/Shaders/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  546. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +27 -3
  547. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  548. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
  549. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
  550. package/Shaders/ShadersInclude/oitDeclaration.js +1 -1
  551. package/Shaders/ShadersInclude/oitDeclaration.js.map +1 -1
  552. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +24 -17
  553. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  554. package/Shaders/ShadersInclude/pbrBlockPrePass.js +27 -20
  555. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  556. package/Shaders/ShadersInclude/pbrDebug.js +6 -2
  557. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  558. package/Shaders/ShadersInclude/prePassDeclaration.js +95 -2
  559. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  560. package/Shaders/default.fragment.js +31 -40
  561. package/Shaders/default.fragment.js.map +1 -1
  562. package/Shaders/depthOfField.fragment.js +13 -9
  563. package/Shaders/depthOfField.fragment.js.map +1 -1
  564. package/Shaders/fluidRenderingParticleDepth.vertex.js +16 -1
  565. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  566. package/Shaders/fluidRenderingParticleThickness.vertex.js +16 -1
  567. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  568. package/Shaders/gaussianSplatting.fragment.js +63 -3
  569. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  570. package/Shaders/gaussianSplatting.vertex.js +80 -0
  571. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  572. package/Shaders/geometry.fragment.js +17 -11
  573. package/Shaders/geometry.fragment.js.map +1 -1
  574. package/Shaders/gpuRenderParticles.fragment.js +43 -1
  575. package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
  576. package/Shaders/gpuRenderParticles.vertex.js +96 -16
  577. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  578. package/Shaders/meshBlending.fragment.d.ts +5 -0
  579. package/Shaders/meshBlending.fragment.js +519 -0
  580. package/Shaders/meshBlending.fragment.js.map +1 -0
  581. package/Shaders/minmaxRedux.fragment.js +6 -1
  582. package/Shaders/minmaxRedux.fragment.js.map +1 -1
  583. package/Shaders/particles.fragment.js +43 -1
  584. package/Shaders/particles.fragment.js.map +1 -1
  585. package/Shaders/particles.vertex.js +84 -3
  586. package/Shaders/particles.vertex.js.map +1 -1
  587. package/Shaders/sprites.fragment.js +52 -2
  588. package/Shaders/sprites.fragment.js.map +1 -1
  589. package/Shaders/sprites.vertex.js +62 -1
  590. package/Shaders/sprites.vertex.js.map +1 -1
  591. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  592. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js +33 -0
  593. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  594. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.d.ts +5 -0
  595. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js +65 -0
  596. package/ShadersWGSL/ShadersInclude/gaussianPointSplatting.js.map +1 -0
  597. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.d.ts +5 -0
  598. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js +17 -0
  599. package/ShadersWGSL/ShadersInclude/gaussianPointSplattingScan.js.map +1 -0
  600. package/ShadersWGSL/ShadersInclude/gaussianSplatting.d.ts +1 -0
  601. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +6 -78
  602. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  603. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js +2 -2
  604. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -1
  605. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.d.ts +5 -0
  606. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js +79 -0
  607. package/ShadersWGSL/ShadersInclude/gaussianSplattingShared.js.map +1 -0
  608. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.d.ts +6 -0
  609. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js +76 -0
  610. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  611. package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
  612. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  613. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +27 -3
  614. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  615. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.d.ts +5 -0
  616. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js +18 -0
  617. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js.map +1 -0
  618. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +1 -0
  619. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +11 -25
  620. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  621. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.d.ts +1 -0
  622. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +11 -25
  623. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  624. package/ShadersWGSL/ShadersInclude/pbrDebug.js +5 -1
  625. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  626. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +6 -1
  627. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  628. package/ShadersWGSL/default.fragment.js +17 -48
  629. package/ShadersWGSL/default.fragment.js.map +1 -1
  630. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +15 -2
  631. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  632. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -2
  633. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  634. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.d.ts +5 -0
  635. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js +22 -0
  636. package/ShadersWGSL/gaussianPointSplattingBlit.fragment.js.map +1 -0
  637. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.d.ts +5 -0
  638. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js +19 -0
  639. package/ShadersWGSL/gaussianPointSplattingBlit.vertex.js.map +1 -0
  640. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.d.ts +5 -0
  641. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js +21 -0
  642. package/ShadersWGSL/gaussianPointSplattingDepthBlit.fragment.js.map +1 -0
  643. package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
  644. package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
  645. package/ShadersWGSL/gaussianSplatting.vertex.js +82 -1
  646. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  647. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +2 -1
  648. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  649. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js +2 -1
  650. package/ShadersWGSL/gaussianSplattingVoxel.vertex.js.map +1 -1
  651. package/ShadersWGSL/geometry.fragment.js +37 -2
  652. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  653. package/ShadersWGSL/gpsHiZBuild.compute.d.ts +5 -0
  654. package/ShadersWGSL/gpsHiZBuild.compute.js +16 -0
  655. package/ShadersWGSL/gpsHiZBuild.compute.js.map +1 -0
  656. package/ShadersWGSL/gpsPartition.compute.d.ts +5 -0
  657. package/ShadersWGSL/gpsPartition.compute.js +27 -0
  658. package/ShadersWGSL/gpsPartition.compute.js.map +1 -0
  659. package/ShadersWGSL/gpsPreprocess.compute.d.ts +5 -0
  660. package/ShadersWGSL/gpsPreprocess.compute.js +86 -0
  661. package/ShadersWGSL/gpsPreprocess.compute.js.map +1 -0
  662. package/ShadersWGSL/gpsResolve.compute.d.ts +5 -0
  663. package/ShadersWGSL/gpsResolve.compute.js +41 -0
  664. package/ShadersWGSL/gpsResolve.compute.js.map +1 -0
  665. package/ShadersWGSL/gpsScanAdd.compute.d.ts +5 -0
  666. package/ShadersWGSL/gpsScanAdd.compute.js +22 -0
  667. package/ShadersWGSL/gpsScanAdd.compute.js.map +1 -0
  668. package/ShadersWGSL/gpsScanBlocks.compute.d.ts +5 -0
  669. package/ShadersWGSL/gpsScanBlocks.compute.js +23 -0
  670. package/ShadersWGSL/gpsScanBlocks.compute.js.map +1 -0
  671. package/ShadersWGSL/gpsScanSums.compute.d.ts +5 -0
  672. package/ShadersWGSL/gpsScanSums.compute.js +30 -0
  673. package/ShadersWGSL/gpsScanSums.compute.js.map +1 -0
  674. package/ShadersWGSL/gpsSplat.compute.d.ts +5 -0
  675. package/ShadersWGSL/gpsSplat.compute.js +37 -0
  676. package/ShadersWGSL/gpsSplat.compute.js.map +1 -0
  677. package/ShadersWGSL/gpuRenderParticles.fragment.js +47 -2
  678. package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -1
  679. package/ShadersWGSL/gpuRenderParticles.vertex.js +110 -7
  680. package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -1
  681. package/ShadersWGSL/meshBlending.fragment.d.ts +5 -0
  682. package/ShadersWGSL/meshBlending.fragment.js +576 -0
  683. package/ShadersWGSL/meshBlending.fragment.js.map +1 -0
  684. package/ShadersWGSL/minmaxRedux.fragment.js +20 -3
  685. package/ShadersWGSL/minmaxRedux.fragment.js.map +1 -1
  686. package/ShadersWGSL/openpbr.fragment.js +2 -1
  687. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  688. package/ShadersWGSL/particles.fragment.js +45 -1
  689. package/ShadersWGSL/particles.fragment.js.map +1 -1
  690. package/ShadersWGSL/particles.vertex.js +86 -4
  691. package/ShadersWGSL/particles.vertex.js.map +1 -1
  692. package/ShadersWGSL/pbr.fragment.js +2 -1
  693. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  694. package/ShadersWGSL/sprites.fragment.js +56 -2
  695. package/ShadersWGSL/sprites.fragment.js.map +1 -1
  696. package/ShadersWGSL/sprites.vertex.js +62 -1
  697. package/ShadersWGSL/sprites.vertex.js.map +1 -1
  698. package/Sprites/spriteManager.d.ts +13 -0
  699. package/Sprites/spriteManager.js +15 -0
  700. package/Sprites/spriteManager.js.map +1 -1
  701. package/Sprites/spriteRenderer.d.ts +24 -1
  702. package/Sprites/spriteRenderer.js +368 -50
  703. package/Sprites/spriteRenderer.js.map +1 -1
  704. package/Sprites/thinSprite.d.ts +4 -0
  705. package/Sprites/thinSprite.js +4 -0
  706. package/Sprites/thinSprite.js.map +1 -1
  707. package/States/alphaCullingState.d.ts +3 -1
  708. package/States/alphaCullingState.js +18 -3
  709. package/States/alphaCullingState.js.map +1 -1
  710. package/XR/features/WebXRSpaceWarp.pure.js +2 -1
  711. package/XR/features/WebXRSpaceWarp.pure.js.map +1 -1
  712. package/XR/webXRDefaultExperience.d.ts +5 -1
  713. package/XR/webXRDefaultExperience.js.map +1 -1
  714. package/XR/webXREnterExitUI.d.ts +2 -1
  715. package/XR/webXREnterExitUI.js.map +1 -1
  716. package/assetContainer.d.ts +1 -0
  717. package/assetContainer.js +5 -1
  718. package/assetContainer.js.map +1 -1
  719. package/package.json +1 -1
  720. package/scene.pure.d.ts +36 -2
  721. package/scene.pure.js +63 -4
  722. package/scene.pure.js.map +1 -1
@@ -5,6 +5,13 @@ import { type FlowGraphDataConnection } from "../../../flowGraphDataConnection.p
5
5
  import { FlowGraphExecutionBlockWithOutSignal } from "../../../flowGraphExecutionBlockWithOutSignal.js";
6
6
  import { type FlowGraphSignalConnection } from "../../../flowGraphSignalConnection.pure.js";
7
7
  import { type FlowGraphInteger } from "../../../CustomTypes/flowGraphInteger.pure.js";
8
+ /**
9
+ * Configuration for the cancel delay block.
10
+ */
11
+ export interface IFlowGraphCancelDelayBlockConfiguration extends IFlowGraphBlockConfiguration {
12
+ /** Whether invalid delay indices are ignored while still activating out. Defaults to false. */
13
+ ignoreInvalidDelay?: boolean;
14
+ }
8
15
  /**
9
16
  * This block cancels a delay that was previously scheduled.
10
17
  */
@@ -13,7 +20,11 @@ export declare class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWi
13
20
  * Input connection: The index value of the scheduled activation to be cancelled.
14
21
  */
15
22
  readonly delayIndex: FlowGraphDataConnection<FlowGraphInteger>;
16
- constructor(config?: IFlowGraphBlockConfiguration);
23
+ /**
24
+ * Creates a delay cancellation block.
25
+ * @param config optional invalid-index handling
26
+ */
27
+ constructor(config?: IFlowGraphCancelDelayBlockConfiguration);
17
28
  _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void;
18
29
  getClassName(): string;
19
30
  }
@@ -8,6 +8,10 @@ import { RegisterClass } from "../../../../Misc/typeStore.js";
8
8
  * This block cancels a delay that was previously scheduled.
9
9
  */
10
10
  export class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSignal {
11
+ /**
12
+ * Creates a delay cancellation block.
13
+ * @param config optional invalid-index handling
14
+ */
11
15
  constructor(config) {
12
16
  super(config);
13
17
  this.delayIndex = this.registerDataInput("delayIndex", RichTypeFlowGraphInteger);
@@ -15,6 +19,10 @@ export class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSig
15
19
  _execute(context, _callingSignal) {
16
20
  const delayIndex = getNumericValue(this.delayIndex.getValue(context));
17
21
  if (delayIndex < 0 || isNaN(delayIndex) || !isFinite(delayIndex)) {
22
+ if (this.config?.ignoreInvalidDelay) {
23
+ this.out._activateSignal(context);
24
+ return;
25
+ }
18
26
  return this._reportError(context, "Invalid delay index");
19
27
  }
20
28
  const timers = context._getGlobalContextVariable("pendingDelays", []);
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphCancelDelayBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAM7D,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,oCAAoC;IAM/E,YAAY,MAAqC;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IACrF,CAAC;IAEM,QAAQ,CAAC,OAAyB,EAAE,cAAyC;QAChF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,eAAe,EAAE,EAAqB,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,yBAAyB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC;QACD,yFAAyF;QACzF,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvC,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEe,YAAY;QACxB,yEAAuC;IAC3C,CAAC;CACJ;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC7C,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,oEAAkC,yBAAyB,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type AdvancedTimer } from \"../../../../Misc/timer\";\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../../flowGraphExecutionBlockWithOutSignal\";\nimport { RichTypeFlowGraphInteger } from \"../../../flowGraphRichTypes.pure\";\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\nimport { type FlowGraphInteger } from \"core/FlowGraph/CustomTypes/flowGraphInteger.pure\";\nimport { getNumericValue } from \"core/FlowGraph/utils\";\nimport { MarkDelayInactive } from \"core/FlowGraph/flowGraphDelayRegistry\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\n\n/**\n * This block cancels a delay that was previously scheduled.\n */\nexport class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSignal {\n /**\n * Input connection: The index value of the scheduled activation to be cancelled.\n */\n public readonly delayIndex: FlowGraphDataConnection<FlowGraphInteger>;\n\n constructor(config?: IFlowGraphBlockConfiguration) {\n super(config);\n this.delayIndex = this.registerDataInput(\"delayIndex\", RichTypeFlowGraphInteger);\n }\n\n public _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void {\n const delayIndex = getNumericValue(this.delayIndex.getValue(context));\n if (delayIndex < 0 || isNaN(delayIndex) || !isFinite(delayIndex)) {\n return this._reportError(context, \"Invalid delay index\");\n }\n const timers = context._getGlobalContextVariable(\"pendingDelays\", [] as AdvancedTimer[]);\n const timer = timers[delayIndex];\n if (timer) {\n timer.dispose();\n delete timers[delayIndex];\n context._setGlobalContextVariable(\"pendingDelays\", timers);\n }\n // The delay is cancelled, so drop it from the active set used by handle validity checks.\n MarkDelayInactive(context, delayIndex);\n // activate the out output flow\n this.out._activateSignal(context);\n }\n\n public override getClassName(): string {\n return FlowGraphBlockNames.CancelDelay;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for flowGraphCancelDelayBlock.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFlowGraphCancelDelayBlock(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(FlowGraphBlockNames.CancelDelay, FlowGraphCancelDelayBlock);\n}\n"]}
1
+ {"version":3,"file":"flowGraphCancelDelayBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAM7D,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AACrG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUpD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,oCAAoC;IAM/E;;;OAGG;IACH,YAAY,MAAgD;QACxD,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IACrF,CAAC;IAEM,QAAQ,CAAC,OAAyB,EAAE,cAAyC;QAChF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBAClC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;gBAClC,OAAO;YACX,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,eAAe,EAAE,EAAqB,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,KAAK,EAAE,CAAC;YACR,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1B,OAAO,CAAC,yBAAyB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC;QACD,yFAAyF;QACzF,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvC,+BAA+B;QAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEe,YAAY;QACxB,yEAAuC;IAC3C,CAAC;CACJ;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,iCAAiC;IAC7C,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,oEAAkC,yBAAyB,CAAC,CAAC;AAC9E,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type AdvancedTimer } from \"../../../../Misc/timer\";\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../../flowGraphExecutionBlockWithOutSignal\";\nimport { RichTypeFlowGraphInteger } from \"../../../flowGraphRichTypes.pure\";\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\nimport { type FlowGraphInteger } from \"core/FlowGraph/CustomTypes/flowGraphInteger.pure\";\nimport { getNumericValue } from \"core/FlowGraph/utils\";\nimport { MarkDelayInactive } from \"core/FlowGraph/flowGraphDelayRegistry\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\n\n/**\n * Configuration for the cancel delay block.\n */\nexport interface IFlowGraphCancelDelayBlockConfiguration extends IFlowGraphBlockConfiguration {\n /** Whether invalid delay indices are ignored while still activating out. Defaults to false. */\n ignoreInvalidDelay?: boolean;\n}\n\n/**\n * This block cancels a delay that was previously scheduled.\n */\nexport class FlowGraphCancelDelayBlock extends FlowGraphExecutionBlockWithOutSignal {\n /**\n * Input connection: The index value of the scheduled activation to be cancelled.\n */\n public readonly delayIndex: FlowGraphDataConnection<FlowGraphInteger>;\n\n /**\n * Creates a delay cancellation block.\n * @param config optional invalid-index handling\n */\n constructor(config?: IFlowGraphCancelDelayBlockConfiguration) {\n super(config);\n this.delayIndex = this.registerDataInput(\"delayIndex\", RichTypeFlowGraphInteger);\n }\n\n public _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void {\n const delayIndex = getNumericValue(this.delayIndex.getValue(context));\n if (delayIndex < 0 || isNaN(delayIndex) || !isFinite(delayIndex)) {\n if (this.config?.ignoreInvalidDelay) {\n this.out._activateSignal(context);\n return;\n }\n return this._reportError(context, \"Invalid delay index\");\n }\n const timers = context._getGlobalContextVariable(\"pendingDelays\", [] as AdvancedTimer[]);\n const timer = timers[delayIndex];\n if (timer) {\n timer.dispose();\n delete timers[delayIndex];\n context._setGlobalContextVariable(\"pendingDelays\", timers);\n }\n // The delay is cancelled, so drop it from the active set used by handle validity checks.\n MarkDelayInactive(context, delayIndex);\n // activate the out output flow\n this.out._activateSignal(context);\n }\n\n public override getClassName(): string {\n return FlowGraphBlockNames.CancelDelay;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for flowGraphCancelDelayBlock.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFlowGraphCancelDelayBlock(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(FlowGraphBlockNames.CancelDelay, FlowGraphCancelDelayBlock);\n}\n"]}
@@ -30,6 +30,9 @@ export class FlowGraphForLoopBlock extends FlowGraphExecutionBlockWithOutSignal
30
30
  const maxIterations = this.config?.maxLoopIterations ?? FlowGraphForLoopBlock.MaxLoopIterations;
31
31
  let iterations = 0;
32
32
  let truncated = false;
33
+ if (this.config?.incrementIndexWhenLoopDone && !(index < endIndex)) {
34
+ this.index.setValue(new FlowGraphInteger(index), context);
35
+ }
33
36
  for (let i = index; i < endIndex; i += step) {
34
37
  this.index.setValue(new FlowGraphInteger(i), context);
35
38
  this.executionFlow._activateSignal(context);
@@ -48,7 +51,7 @@ export class FlowGraphForLoopBlock extends FlowGraphExecutionBlockWithOutSignal
48
51
  // incrementIndexWhenLoopDone will not land on endIndex).
49
52
  Logger.Warn(`FlowGraphForLoopBlock: loop stopped after reaching the ${maxIterations}-iteration safety cap before its range completed.`);
50
53
  }
51
- if (this.config?.incrementIndexWhenLoopDone) {
54
+ if (this.config?.incrementIndexWhenLoopDone && iterations > 0) {
52
55
  this.index.setValue(new FlowGraphInteger(getNumericValue(this.index.getValue(context)) + step), context);
53
56
  }
54
57
  this.completed._activateSignal(context);
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphForLoopBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\r\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"core/FlowGraph/flowGraphExecutionBlockWithOutSignal\";\r\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\r\nimport { RichTypeAny, RichTypeFlowGraphInteger, RichTypeNumber } from \"../../../flowGraphRichTypes.pure\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\r\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\r\nimport { type FlowGraphNumber, getNumericValue } from \"core/FlowGraph/utils\";\r\nimport { FlowGraphInteger } from \"core/FlowGraph/CustomTypes/flowGraphInteger.pure\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Configuration for the For Loop block.\r\n */\r\nexport interface IFlowGraphForLoopBlockConfiguration extends IFlowGraphBlockConfiguration {\r\n /**\r\n * The initial index of the loop.\r\n * if not set will default to 0\r\n */\r\n initialIndex?: FlowGraphNumber;\r\n\r\n /**\r\n * If set to true, the index of the case will be incremented when the loop is done.\r\n * This will result that the index will equal endIndex when the loop finished its work.\r\n * This is the default behavior in glTF interactivity\r\n */\r\n incrementIndexWhenLoopDone?: boolean;\r\n\r\n /**\r\n * Overrides {@link FlowGraphForLoopBlock.MaxLoopIterations} for this block only.\r\n * Lets a single graph opt into a higher (or lower) runaway-loop guard without changing the\r\n * process-wide default that every other FlowGraph relies on.\r\n */\r\n maxLoopIterations?: number;\r\n}\r\n/**\r\n * Block that executes an action in a loop.\r\n */\r\nexport class FlowGraphForLoopBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * The default maximum number of iterations allowed for the loop, used as a safety net against\r\n * runaway loops. Kept conservative so a runaway loop is caught before it can freeze the tab.\r\n * A single graph that legitimately needs more iterations should set the per-block\r\n * {@link IFlowGraphForLoopBlockConfiguration.maxLoopIterations} rather than raising this\r\n * process-wide default that every other FlowGraph relies on.\r\n */\r\n public static MaxLoopIterations = 1000;\r\n /**\r\n * Input connection: The start index of the loop.\r\n */\r\n public readonly startIndex: FlowGraphDataConnection<FlowGraphNumber>;\r\n /**\r\n * Input connection: The end index of the loop.\r\n */\r\n public readonly endIndex: FlowGraphDataConnection<FlowGraphNumber>;\r\n /**\r\n * Input connection: The step of the loop.\r\n */\r\n public readonly step: FlowGraphDataConnection<number>;\r\n /**\r\n * Output connection: The current index of the loop.\r\n */\r\n public readonly index: FlowGraphDataConnection<FlowGraphInteger>;\r\n /**\r\n * Output connection: The signal that is activated when the loop body is executed.\r\n */\r\n public readonly executionFlow: FlowGraphSignalConnection;\r\n\r\n /**\r\n * Output connection: The completed signal. Triggered when condition is false.\r\n * No out signal is available.\r\n */\r\n public readonly completed: FlowGraphSignalConnection;\r\n\r\n public constructor(config?: IFlowGraphForLoopBlockConfiguration) {\r\n super(config);\r\n\r\n this.startIndex = this.registerDataInput(\"startIndex\", RichTypeAny, 0);\r\n this.endIndex = this.registerDataInput(\"endIndex\", RichTypeAny);\r\n this.step = this.registerDataInput(\"step\", RichTypeNumber, 1);\r\n\r\n this.index = this.registerDataOutput(\"index\", RichTypeFlowGraphInteger, new FlowGraphInteger(getNumericValue(config?.initialIndex ?? 0)));\r\n this.executionFlow = this._registerSignalOutput(\"executionFlow\");\r\n this.completed = this._registerSignalOutput(\"completed\");\r\n\r\n this._unregisterSignalOutput(\"out\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _execute(context: FlowGraphContext): void {\r\n const index = getNumericValue(this.startIndex.getValue(context));\r\n const step = this.step.getValue(context);\r\n let endIndex = getNumericValue(this.endIndex.getValue(context));\r\n // Per-block override of the runaway-loop guard, falling back to the process-wide default.\r\n const maxIterations = (this.config as IFlowGraphForLoopBlockConfiguration | undefined)?.maxLoopIterations ?? FlowGraphForLoopBlock.MaxLoopIterations;\r\n let iterations = 0;\r\n let truncated = false;\r\n for (let i = index; i < endIndex; i += step) {\r\n this.index.setValue(new FlowGraphInteger(i), context);\r\n this.executionFlow._activateSignal(context);\r\n endIndex = getNumericValue(this.endIndex.getValue(context));\r\n // Safety net against runaway loops. The cap counts iterations (not the index value) so it\r\n // behaves correctly regardless of startIndex/step.\r\n if (++iterations >= maxIterations) {\r\n truncated = true;\r\n break;\r\n }\r\n }\r\n\r\n if (truncated) {\r\n // The loop hit its safety cap before its range completed, so the outputs below are for a\r\n // truncated run, not a natural finish. Warn so a genuinely runaway asset is diagnosable\r\n // rather than silently producing wrong numbers (the completed signal still fires, and\r\n // incrementIndexWhenLoopDone will not land on endIndex).\r\n Logger.Warn(`FlowGraphForLoopBlock: loop stopped after reaching the ${maxIterations}-iteration safety cap before its range completed.`);\r\n }\r\n\r\n if (this.config?.incrementIndexWhenLoopDone) {\r\n this.index.setValue(new FlowGraphInteger(getNumericValue(this.index.getValue(context)) + step), context);\r\n }\r\n\r\n this.completed._activateSignal(context);\r\n }\r\n\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.ForLoop;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphForLoopBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphForLoopBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.ForLoop, FlowGraphForLoopBlock);\r\n}\r\n"]}
1
+ {"version":3,"file":"flowGraphForLoopBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\r\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"core/FlowGraph/flowGraphExecutionBlockWithOutSignal\";\r\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\r\nimport { RichTypeAny, RichTypeFlowGraphInteger, RichTypeNumber } from \"../../../flowGraphRichTypes.pure\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\r\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\r\nimport { type FlowGraphNumber, getNumericValue } from \"core/FlowGraph/utils\";\r\nimport { FlowGraphInteger } from \"core/FlowGraph/CustomTypes/flowGraphInteger.pure\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Configuration for the For Loop block.\r\n */\r\nexport interface IFlowGraphForLoopBlockConfiguration extends IFlowGraphBlockConfiguration {\r\n /**\r\n * The initial index of the loop.\r\n * if not set will default to 0\r\n */\r\n initialIndex?: FlowGraphNumber;\r\n\r\n /**\r\n * If set to true, the index of the case will be incremented when the loop is done.\r\n * This will result that the index will equal endIndex when the loop finished its work.\r\n * This is the default behavior in glTF interactivity\r\n */\r\n incrementIndexWhenLoopDone?: boolean;\r\n\r\n /**\r\n * Overrides {@link FlowGraphForLoopBlock.MaxLoopIterations} for this block only.\r\n * Lets a single graph opt into a higher (or lower) runaway-loop guard without changing the\r\n * process-wide default that every other FlowGraph relies on.\r\n */\r\n maxLoopIterations?: number;\r\n}\r\n/**\r\n * Block that executes an action in a loop.\r\n */\r\nexport class FlowGraphForLoopBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * The default maximum number of iterations allowed for the loop, used as a safety net against\r\n * runaway loops. Kept conservative so a runaway loop is caught before it can freeze the tab.\r\n * A single graph that legitimately needs more iterations should set the per-block\r\n * {@link IFlowGraphForLoopBlockConfiguration.maxLoopIterations} rather than raising this\r\n * process-wide default that every other FlowGraph relies on.\r\n */\r\n public static MaxLoopIterations = 1000;\r\n /**\r\n * Input connection: The start index of the loop.\r\n */\r\n public readonly startIndex: FlowGraphDataConnection<FlowGraphNumber>;\r\n /**\r\n * Input connection: The end index of the loop.\r\n */\r\n public readonly endIndex: FlowGraphDataConnection<FlowGraphNumber>;\r\n /**\r\n * Input connection: The step of the loop.\r\n */\r\n public readonly step: FlowGraphDataConnection<number>;\r\n /**\r\n * Output connection: The current index of the loop.\r\n */\r\n public readonly index: FlowGraphDataConnection<FlowGraphInteger>;\r\n /**\r\n * Output connection: The signal that is activated when the loop body is executed.\r\n */\r\n public readonly executionFlow: FlowGraphSignalConnection;\r\n\r\n /**\r\n * Output connection: The completed signal. Triggered when condition is false.\r\n * No out signal is available.\r\n */\r\n public readonly completed: FlowGraphSignalConnection;\r\n\r\n public constructor(config?: IFlowGraphForLoopBlockConfiguration) {\r\n super(config);\r\n\r\n this.startIndex = this.registerDataInput(\"startIndex\", RichTypeAny, 0);\r\n this.endIndex = this.registerDataInput(\"endIndex\", RichTypeAny);\r\n this.step = this.registerDataInput(\"step\", RichTypeNumber, 1);\r\n\r\n this.index = this.registerDataOutput(\"index\", RichTypeFlowGraphInteger, new FlowGraphInteger(getNumericValue(config?.initialIndex ?? 0)));\r\n this.executionFlow = this._registerSignalOutput(\"executionFlow\");\r\n this.completed = this._registerSignalOutput(\"completed\");\r\n\r\n this._unregisterSignalOutput(\"out\");\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _execute(context: FlowGraphContext): void {\r\n const index = getNumericValue(this.startIndex.getValue(context));\r\n const step = this.step.getValue(context);\r\n let endIndex = getNumericValue(this.endIndex.getValue(context));\r\n // Per-block override of the runaway-loop guard, falling back to the process-wide default.\r\n const maxIterations = (this.config as IFlowGraphForLoopBlockConfiguration | undefined)?.maxLoopIterations ?? FlowGraphForLoopBlock.MaxLoopIterations;\r\n let iterations = 0;\r\n let truncated = false;\r\n if (this.config?.incrementIndexWhenLoopDone && !(index < endIndex)) {\r\n this.index.setValue(new FlowGraphInteger(index), context);\r\n }\r\n for (let i = index; i < endIndex; i += step) {\r\n this.index.setValue(new FlowGraphInteger(i), context);\r\n this.executionFlow._activateSignal(context);\r\n endIndex = getNumericValue(this.endIndex.getValue(context));\r\n // Safety net against runaway loops. The cap counts iterations (not the index value) so it\r\n // behaves correctly regardless of startIndex/step.\r\n if (++iterations >= maxIterations) {\r\n truncated = true;\r\n break;\r\n }\r\n }\r\n\r\n if (truncated) {\r\n // The loop hit its safety cap before its range completed, so the outputs below are for a\r\n // truncated run, not a natural finish. Warn so a genuinely runaway asset is diagnosable\r\n // rather than silently producing wrong numbers (the completed signal still fires, and\r\n // incrementIndexWhenLoopDone will not land on endIndex).\r\n Logger.Warn(`FlowGraphForLoopBlock: loop stopped after reaching the ${maxIterations}-iteration safety cap before its range completed.`);\r\n }\r\n\r\n if (this.config?.incrementIndexWhenLoopDone && iterations > 0) {\r\n this.index.setValue(new FlowGraphInteger(getNumericValue(this.index.getValue(context)) + step), context);\r\n }\r\n\r\n this.completed._activateSignal(context);\r\n }\r\n\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.ForLoop;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphForLoopBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphForLoopBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.ForLoop, FlowGraphForLoopBlock);\r\n}\r\n"]}
@@ -4,6 +4,13 @@ import { type FlowGraphDataConnection } from "../../../flowGraphDataConnection.p
4
4
  import { type FlowGraphSignalConnection } from "../../../flowGraphSignalConnection.pure.js";
5
5
  import { FlowGraphExecutionBlockWithOutSignal } from "../../../flowGraphExecutionBlockWithOutSignal.js";
6
6
  import { type IFlowGraphBlockConfiguration } from "../../../flowGraphBlock.js";
7
+ /**
8
+ * Configuration for the throttle block.
9
+ */
10
+ export interface IFlowGraphThrottleBlockConfiguration extends IFlowGraphBlockConfiguration {
11
+ /** Whether a zero duration is accepted and always activates the output. Defaults to false. */
12
+ allowZeroDuration?: boolean;
13
+ }
7
14
  /**
8
15
  * A block that throttles the execution of its output flow.
9
16
  */
@@ -20,7 +27,11 @@ export declare class FlowGraphThrottleBlock extends FlowGraphExecutionBlockWithO
20
27
  * Output connection: The time remaining before the throttle is triggering again, in seconds.
21
28
  */
22
29
  readonly lastRemainingTime: FlowGraphDataConnection<number>;
23
- constructor(config?: IFlowGraphBlockConfiguration);
30
+ /**
31
+ * Creates a throttle block.
32
+ * @param config optional duration handling
33
+ */
34
+ constructor(config?: IFlowGraphThrottleBlockConfiguration);
24
35
  _execute(context: FlowGraphContext, callingSignal: FlowGraphSignalConnection): void;
25
36
  /**
26
37
  * @returns class name of the block.
@@ -6,6 +6,10 @@ import { RegisterClass } from "../../../../Misc/typeStore.js";
6
6
  * A block that throttles the execution of its output flow.
7
7
  */
8
8
  export class FlowGraphThrottleBlock extends FlowGraphExecutionBlockWithOutSignal {
9
+ /**
10
+ * Creates a throttle block.
11
+ * @param config optional duration handling
12
+ */
9
13
  constructor(config) {
10
14
  super(config);
11
15
  this.reset = this._registerSignalInput("reset");
@@ -21,7 +25,7 @@ export class FlowGraphThrottleBlock extends FlowGraphExecutionBlockWithOutSignal
21
25
  }
22
26
  // in seconds
23
27
  const durationValue = this.duration.getValue(context);
24
- if (durationValue <= 0 || isNaN(durationValue) || !isFinite(durationValue)) {
28
+ if (durationValue < 0 || (durationValue === 0 && !this.config?.allowZeroDuration) || isNaN(durationValue) || !isFinite(durationValue)) {
25
29
  return this._reportError(context, "Invalid duration in Throttle block");
26
30
  }
27
31
  const lastRemainingTime = context._getExecutionVariable(this, "lastRemainingTime", NaN);
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphThrottleBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\r\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\r\nimport { RichTypeNumber } from \"../../../flowGraphRichTypes.pure\";\r\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../../flowGraphExecutionBlockWithOutSignal\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\r\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n/**\r\n * A block that throttles the execution of its output flow.\r\n */\r\nexport class FlowGraphThrottleBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * Input connection: The duration of the throttle, in seconds.\r\n */\r\n public readonly duration: FlowGraphDataConnection<number>;\r\n /**\r\n * Input connection: Resets the throttle.\r\n */\r\n public readonly reset: FlowGraphSignalConnection;\r\n /**\r\n * Output connection: The time remaining before the throttle is triggering again, in seconds.\r\n */\r\n public readonly lastRemainingTime: FlowGraphDataConnection<number>;\r\n\r\n constructor(config?: IFlowGraphBlockConfiguration) {\r\n super(config);\r\n this.reset = this._registerSignalInput(\"reset\");\r\n this.duration = this.registerDataInput(\"duration\", RichTypeNumber);\r\n this.lastRemainingTime = this.registerDataOutput(\"lastRemainingTime\", RichTypeNumber, NaN);\r\n }\r\n public _execute(context: FlowGraphContext, callingSignal: FlowGraphSignalConnection): void {\r\n if (callingSignal === this.reset) {\r\n this.lastRemainingTime.setValue(NaN, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", NaN);\r\n context._setExecutionVariable(this, \"timestamp\", 0);\r\n return;\r\n }\r\n // in seconds\r\n const durationValue = this.duration.getValue(context);\r\n if (durationValue <= 0 || isNaN(durationValue) || !isFinite(durationValue)) {\r\n return this._reportError(context, \"Invalid duration in Throttle block\");\r\n }\r\n const lastRemainingTime = context._getExecutionVariable(this, \"lastRemainingTime\", NaN);\r\n // Using Date.now() to get ms since epoch. not using performance.now() because its precision is not needed here\r\n const currentTime = Date.now();\r\n if (isNaN(lastRemainingTime)) {\r\n this.lastRemainingTime.setValue(0, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", 0);\r\n context._setExecutionVariable(this, \"timestamp\", currentTime);\r\n // according to glTF interactivity specs\r\n return this.out._activateSignal(context);\r\n } else {\r\n const elapsedTime = currentTime - context._getExecutionVariable(this, \"timestamp\", 0);\r\n // duration is in seconds, so we need to multiply by 1000\r\n const durationInMs = durationValue * 1000;\r\n if (durationInMs <= elapsedTime) {\r\n this.lastRemainingTime.setValue(0, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", 0);\r\n context._setExecutionVariable(this, \"timestamp\", currentTime);\r\n return this.out._activateSignal(context);\r\n } else {\r\n const remainingTime = durationInMs - elapsedTime;\r\n // output is in seconds\r\n this.lastRemainingTime.setValue(remainingTime / 1000, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", remainingTime);\r\n }\r\n }\r\n }\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.Throttle;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphThrottleBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphThrottleBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.Throttle, FlowGraphThrottleBlock);\r\n}\r\n"]}
1
+ {"version":3,"file":"flowGraphThrottleBlock.pure.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphThrottleBlock.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,EAAE,oCAAoC,EAAE,MAAM,+CAA+C,CAAC;AAGrG,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAS3D;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,oCAAoC;IAc5E;;;OAGG;IACH,YAAY,MAA6C;QACrD,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACnE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;IAC/F,CAAC;IACM,QAAQ,CAAC,OAAyB,EAAE,aAAwC;QAC/E,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO;QACX,CAAC;QACD,aAAa;QACb,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpI,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,oCAAoC,CAAC,CAAC;QAC5E,CAAC;QACD,MAAM,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACxF,+GAA+G;QAC/G,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5C,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAC9D,wCAAwC;YACxC,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACtF,yDAAyD;YACzD,MAAM,YAAY,GAAG,aAAa,GAAG,IAAI,CAAC;YAC1C,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5C,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,CAAC;gBACjD,uBAAuB;gBACvB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;YAC5E,CAAC;QACL,CAAC;IACL,CAAC;IACD;;OAEG;IACa,YAAY;QACxB,mEAAoC;IACxC,CAAC;CACJ;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,8BAA8B;IAC1C,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,aAAa,8DAA+B,sBAAsB,CAAC,CAAC;AACxE,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphContext } from \"../../../flowGraphContext\";\r\nimport { type FlowGraphDataConnection } from \"../../../flowGraphDataConnection.pure\";\r\nimport { RichTypeNumber } from \"../../../flowGraphRichTypes.pure\";\r\nimport { type FlowGraphSignalConnection } from \"../../../flowGraphSignalConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../../flowGraphExecutionBlockWithOutSignal\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../../flowGraphBlock\";\r\nimport { FlowGraphBlockNames } from \"../../flowGraphBlockNames\";\r\nimport { RegisterClass } from \"../../../../Misc/typeStore\";\r\n\r\n/**\r\n * Configuration for the throttle block.\r\n */\r\nexport interface IFlowGraphThrottleBlockConfiguration extends IFlowGraphBlockConfiguration {\r\n /** Whether a zero duration is accepted and always activates the output. Defaults to false. */\r\n allowZeroDuration?: boolean;\r\n}\r\n/**\r\n * A block that throttles the execution of its output flow.\r\n */\r\nexport class FlowGraphThrottleBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * Input connection: The duration of the throttle, in seconds.\r\n */\r\n public readonly duration: FlowGraphDataConnection<number>;\r\n /**\r\n * Input connection: Resets the throttle.\r\n */\r\n public readonly reset: FlowGraphSignalConnection;\r\n /**\r\n * Output connection: The time remaining before the throttle is triggering again, in seconds.\r\n */\r\n public readonly lastRemainingTime: FlowGraphDataConnection<number>;\r\n\r\n /**\r\n * Creates a throttle block.\r\n * @param config optional duration handling\r\n */\r\n constructor(config?: IFlowGraphThrottleBlockConfiguration) {\r\n super(config);\r\n this.reset = this._registerSignalInput(\"reset\");\r\n this.duration = this.registerDataInput(\"duration\", RichTypeNumber);\r\n this.lastRemainingTime = this.registerDataOutput(\"lastRemainingTime\", RichTypeNumber, NaN);\r\n }\r\n public _execute(context: FlowGraphContext, callingSignal: FlowGraphSignalConnection): void {\r\n if (callingSignal === this.reset) {\r\n this.lastRemainingTime.setValue(NaN, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", NaN);\r\n context._setExecutionVariable(this, \"timestamp\", 0);\r\n return;\r\n }\r\n // in seconds\r\n const durationValue = this.duration.getValue(context);\r\n if (durationValue < 0 || (durationValue === 0 && !this.config?.allowZeroDuration) || isNaN(durationValue) || !isFinite(durationValue)) {\r\n return this._reportError(context, \"Invalid duration in Throttle block\");\r\n }\r\n const lastRemainingTime = context._getExecutionVariable(this, \"lastRemainingTime\", NaN);\r\n // Using Date.now() to get ms since epoch. not using performance.now() because its precision is not needed here\r\n const currentTime = Date.now();\r\n if (isNaN(lastRemainingTime)) {\r\n this.lastRemainingTime.setValue(0, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", 0);\r\n context._setExecutionVariable(this, \"timestamp\", currentTime);\r\n // according to glTF interactivity specs\r\n return this.out._activateSignal(context);\r\n } else {\r\n const elapsedTime = currentTime - context._getExecutionVariable(this, \"timestamp\", 0);\r\n // duration is in seconds, so we need to multiply by 1000\r\n const durationInMs = durationValue * 1000;\r\n if (durationInMs <= elapsedTime) {\r\n this.lastRemainingTime.setValue(0, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", 0);\r\n context._setExecutionVariable(this, \"timestamp\", currentTime);\r\n return this.out._activateSignal(context);\r\n } else {\r\n const remainingTime = durationInMs - elapsedTime;\r\n // output is in seconds\r\n this.lastRemainingTime.setValue(remainingTime / 1000, context);\r\n context._setExecutionVariable(this, \"lastRemainingTime\", remainingTime);\r\n }\r\n }\r\n }\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.Throttle;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphThrottleBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphThrottleBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.Throttle, FlowGraphThrottleBlock);\r\n}\r\n"]}
@@ -15,10 +15,14 @@ export class FlowGraphConsoleLogBlock extends FlowGraphExecutionBlockWithOutSign
15
15
  super(config);
16
16
  this.message = this.registerDataInput("message", RichTypeAny);
17
17
  this.logType = this.registerDataInput("logType", RichTypeString, "log");
18
- if (config?.messageTemplate) {
18
+ if (typeof config?.messageTemplate === "string") {
19
19
  const matches = this._getTemplateMatches(config.messageTemplate);
20
+ const registered = new Set();
20
21
  for (const match of matches) {
21
- this.registerDataInput(match, RichTypeAny);
22
+ if (!registered.has(match.name)) {
23
+ registered.add(match.name);
24
+ this.registerDataInput(match.name, RichTypeAny);
25
+ }
22
26
  }
23
27
  }
24
28
  }
@@ -67,28 +71,35 @@ export class FlowGraphConsoleLogBlock extends FlowGraphExecutionBlockWithOutSign
67
71
  return String(value);
68
72
  }
69
73
  _getMessageValue(context) {
70
- if (this.config?.messageTemplate) {
74
+ if (typeof this.config?.messageTemplate === "string") {
71
75
  let template = this.config.messageTemplate;
72
76
  const matches = this._getTemplateMatches(template);
73
77
  // If the message input is an object, use its keys as the primary
74
78
  // source for template placeholders, falling back to named data inputs.
75
79
  const messageValue = this.message.getValue(context);
76
80
  const messageObj = messageValue !== null && messageValue !== undefined && typeof messageValue === "object" ? messageValue : null;
81
+ const replacements = new Map();
77
82
  for (const match of matches) {
83
+ if (replacements.has(match.name)) {
84
+ continue;
85
+ }
78
86
  let value;
79
- if (messageObj !== null && match in messageObj) {
80
- value = messageObj[match];
87
+ if (messageObj !== null && match.name in messageObj) {
88
+ value = messageObj[match.name];
81
89
  }
82
90
  else {
83
- value = this.getDataInput(match)?.getValue(context);
91
+ value = this.getDataInput(match.name)?.getValue(context);
84
92
  }
85
- if (value !== undefined) {
86
- // Escape regex metacharacters in the placeholder name before building the pattern.
87
- const escapedMatch = match.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
88
- template = template.replace(new RegExp(`\\{${escapedMatch}\\}`, "g"), this._serializeValue(value));
93
+ replacements.set(match.name, value === undefined ? undefined : this._serializeValue(value).replace(/[{}]/g, "$&$&"));
94
+ }
95
+ for (let index = matches.length - 1; index >= 0; index--) {
96
+ const match = matches[index];
97
+ const serialized = replacements.get(match.name);
98
+ if (serialized !== undefined) {
99
+ template = template.substring(0, match.start) + serialized + template.substring(match.end + 1);
89
100
  }
90
101
  }
91
- return template;
102
+ return template.replace(/\{\{/g, "{").replace(/\}\}/g, "}");
92
103
  }
93
104
  else {
94
105
  // No template — pass the raw value directly so Logger receives the original
@@ -97,13 +108,50 @@ export class FlowGraphConsoleLogBlock extends FlowGraphExecutionBlockWithOutSign
97
108
  }
98
109
  }
99
110
  _getTemplateMatches(template) {
100
- const regex = /\{([^}]+)\}/g;
111
+ let state = 0;
112
+ let parameterStart = -1;
101
113
  const matches = [];
102
- let match;
103
- while ((match = regex.exec(template)) !== null) {
104
- matches.push(match[1]);
114
+ for (let index = 0; index < template.length; index++) {
115
+ const character = template[index];
116
+ if (character === "{") {
117
+ if (state === 0) {
118
+ state = 1;
119
+ }
120
+ else if (state === 1) {
121
+ state = 0;
122
+ }
123
+ else {
124
+ return [];
125
+ }
126
+ }
127
+ else if (character === "}") {
128
+ if (state === 0) {
129
+ state = 3;
130
+ }
131
+ else if (state === 3) {
132
+ state = 0;
133
+ }
134
+ else if (state === 2) {
135
+ matches.push({
136
+ name: template.substring(parameterStart + 1, index),
137
+ start: parameterStart,
138
+ end: index,
139
+ });
140
+ state = 0;
141
+ }
142
+ else {
143
+ return [];
144
+ }
145
+ }
146
+ else if (state === 1) {
147
+ parameterStart = index - 1;
148
+ state = 2;
149
+ }
150
+ else if (state === 3) {
151
+ return [];
152
+ }
105
153
  }
106
- return matches;
154
+ return state === 0 ? matches : [];
107
155
  }
108
156
  }
109
157
  let _Registered = false;
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphConsoleLogBlock.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphContext } from \"../../flowGraphContext\";\r\nimport { type FlowGraphDataConnection } from \"../../flowGraphDataConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../flowGraphExecutionBlockWithOutSignal\";\r\nimport { RichTypeAny, RichTypeString } from \"../../flowGraphRichTypes.pure\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../flowGraphBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { FlowGraphBlockNames } from \"../flowGraphBlockNames\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\n\r\n/**\r\n * Configuration for the console log block.\r\n */\r\nexport interface IFlowGraphConsoleLogBlockConfiguration extends IFlowGraphBlockConfiguration {\r\n /**\r\n * An optional message template to use for the log message.\r\n * If provided, the template can hold placeholders for the message value.\r\n * For example, if the template is \"The message is: \\{data\\}\", a new data input called \"data\" will be created.\r\n * The value of the message input will be used to replace the placeholder in the template.\r\n */\r\n messageTemplate?: string;\r\n}\r\n\r\n/**\r\n * Block that logs a message to the console.\r\n */\r\nexport class FlowGraphConsoleLogBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * Input connection: The message to log.\r\n * Will be ignored if a message template is provided.\r\n */\r\n public readonly message: FlowGraphDataConnection<any>;\r\n\r\n /**\r\n * Input connection: The log type.\r\n */\r\n public readonly logType: FlowGraphDataConnection<\"log\" | \"warn\" | \"error\">;\r\n\r\n /**\r\n * Creates a new console log block.\r\n * @param config optional configuration\r\n */\r\n public constructor(config?: IFlowGraphConsoleLogBlockConfiguration) {\r\n super(config);\r\n this.message = this.registerDataInput(\"message\", RichTypeAny);\r\n this.logType = this.registerDataInput(\"logType\", RichTypeString, \"log\") as FlowGraphDataConnection<\"log\" | \"warn\" | \"error\">;\r\n if (config?.messageTemplate) {\r\n const matches = this._getTemplateMatches(config.messageTemplate);\r\n for (const match of matches) {\r\n this.registerDataInput(match, RichTypeAny);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _execute(context: FlowGraphContext): void {\r\n const typeValue = this.logType.getValue(context);\r\n const messageValue = this._getMessageValue(context);\r\n if (typeValue === \"warn\") {\r\n Logger.Warn(messageValue);\r\n } else if (typeValue === \"error\") {\r\n Logger.Error(messageValue);\r\n } else {\r\n Logger.Log(messageValue);\r\n }\r\n // activate the output flow block\r\n this.out._activateSignal(context);\r\n }\r\n\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.ConsoleLog;\r\n }\r\n\r\n private _serializeValue(value: any): string {\r\n if (value === null || value === undefined) {\r\n return String(value);\r\n }\r\n if (typeof value === \"object\") {\r\n // Prefer the object's own toString() (e.g. Vector3 → \"{X:1 Y:2 Z:3}\").\r\n // Only fall back to JSON.stringify when toString() is the unhelpful default.\r\n const str = value.toString();\r\n if (str === \"[object Object]\") {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return str;\r\n }\r\n }\r\n return str;\r\n }\r\n return String(value);\r\n }\r\n\r\n private _getMessageValue(context: FlowGraphContext): string {\r\n if (this.config?.messageTemplate) {\r\n let template: string = this.config.messageTemplate;\r\n const matches = this._getTemplateMatches(template);\r\n // If the message input is an object, use its keys as the primary\r\n // source for template placeholders, falling back to named data inputs.\r\n const messageValue = this.message.getValue(context);\r\n const messageObj = messageValue !== null && messageValue !== undefined && typeof messageValue === \"object\" ? messageValue : null;\r\n for (const match of matches) {\r\n let value: any;\r\n if (messageObj !== null && match in messageObj) {\r\n value = messageObj[match];\r\n } else {\r\n value = this.getDataInput(match)?.getValue(context);\r\n }\r\n if (value !== undefined) {\r\n // Escape regex metacharacters in the placeholder name before building the pattern.\r\n const escapedMatch = match.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n template = template.replace(new RegExp(`\\\\{${escapedMatch}\\\\}`, \"g\"), this._serializeValue(value));\r\n }\r\n }\r\n return template;\r\n } else {\r\n // No template — pass the raw value directly so Logger receives the original\r\n // object (e.g. Vector3) rather than a stringified representation.\r\n return this.message.getValue(context);\r\n }\r\n }\r\n\r\n private _getTemplateMatches(template: string): string[] {\r\n const regex = /\\{([^}]+)\\}/g;\r\n const matches: string[] = [];\r\n let match;\r\n while ((match = regex.exec(template)) !== null) {\r\n matches.push(match[1]);\r\n }\r\n return matches;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphConsoleLogBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphConsoleLogBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.ConsoleLog, FlowGraphConsoleLogBlock);\r\n}\r\n"]}
1
+ {"version":3,"file":"flowGraphConsoleLogBlock.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type FlowGraphContext } from \"../../flowGraphContext\";\r\nimport { type FlowGraphDataConnection } from \"../../flowGraphDataConnection.pure\";\r\nimport { FlowGraphExecutionBlockWithOutSignal } from \"../../flowGraphExecutionBlockWithOutSignal\";\r\nimport { RichTypeAny, RichTypeString } from \"../../flowGraphRichTypes.pure\";\r\nimport { type IFlowGraphBlockConfiguration } from \"../../flowGraphBlock\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { FlowGraphBlockNames } from \"../flowGraphBlockNames\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\n\r\n/**\r\n * Configuration for the console log block.\r\n */\r\nexport interface IFlowGraphConsoleLogBlockConfiguration extends IFlowGraphBlockConfiguration {\r\n /**\r\n * An optional message template to use for the log message.\r\n * If provided, the template can hold placeholders for the message value.\r\n * For example, if the template is \"The message is: \\{data\\}\", a new data input called \"data\" will be created.\r\n * The value of the message input will be used to replace the placeholder in the template.\r\n */\r\n messageTemplate?: string;\r\n}\r\n\r\n/**\r\n * Block that logs a message to the console.\r\n */\r\nexport class FlowGraphConsoleLogBlock extends FlowGraphExecutionBlockWithOutSignal {\r\n /**\r\n * Input connection: The message to log.\r\n * Will be ignored if a message template is provided.\r\n */\r\n public readonly message: FlowGraphDataConnection<any>;\r\n\r\n /**\r\n * Input connection: The log type.\r\n */\r\n public readonly logType: FlowGraphDataConnection<\"log\" | \"warn\" | \"error\">;\r\n\r\n /**\r\n * Creates a new console log block.\r\n * @param config optional configuration\r\n */\r\n public constructor(config?: IFlowGraphConsoleLogBlockConfiguration) {\r\n super(config);\r\n this.message = this.registerDataInput(\"message\", RichTypeAny);\r\n this.logType = this.registerDataInput(\"logType\", RichTypeString, \"log\") as FlowGraphDataConnection<\"log\" | \"warn\" | \"error\">;\r\n if (typeof config?.messageTemplate === \"string\") {\r\n const matches = this._getTemplateMatches(config.messageTemplate);\r\n const registered = new Set<string>();\r\n for (const match of matches) {\r\n if (!registered.has(match.name)) {\r\n registered.add(match.name);\r\n this.registerDataInput(match.name, RichTypeAny);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _execute(context: FlowGraphContext): void {\r\n const typeValue = this.logType.getValue(context);\r\n const messageValue = this._getMessageValue(context);\r\n if (typeValue === \"warn\") {\r\n Logger.Warn(messageValue);\r\n } else if (typeValue === \"error\") {\r\n Logger.Error(messageValue);\r\n } else {\r\n Logger.Log(messageValue);\r\n }\r\n // activate the output flow block\r\n this.out._activateSignal(context);\r\n }\r\n\r\n /**\r\n * @returns class name of the block.\r\n */\r\n public override getClassName(): string {\r\n return FlowGraphBlockNames.ConsoleLog;\r\n }\r\n\r\n private _serializeValue(value: any): string {\r\n if (value === null || value === undefined) {\r\n return String(value);\r\n }\r\n if (typeof value === \"object\") {\r\n // Prefer the object's own toString() (e.g. Vector3 → \"{X:1 Y:2 Z:3}\").\r\n // Only fall back to JSON.stringify when toString() is the unhelpful default.\r\n const str = value.toString();\r\n if (str === \"[object Object]\") {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return str;\r\n }\r\n }\r\n return str;\r\n }\r\n return String(value);\r\n }\r\n\r\n private _getMessageValue(context: FlowGraphContext): string {\r\n if (typeof this.config?.messageTemplate === \"string\") {\r\n let template: string = this.config.messageTemplate;\r\n const matches = this._getTemplateMatches(template);\r\n // If the message input is an object, use its keys as the primary\r\n // source for template placeholders, falling back to named data inputs.\r\n const messageValue = this.message.getValue(context);\r\n const messageObj = messageValue !== null && messageValue !== undefined && typeof messageValue === \"object\" ? messageValue : null;\r\n const replacements = new Map<string, string | undefined>();\r\n for (const match of matches) {\r\n if (replacements.has(match.name)) {\r\n continue;\r\n }\r\n let value: any;\r\n if (messageObj !== null && match.name in messageObj) {\r\n value = messageObj[match.name];\r\n } else {\r\n value = this.getDataInput(match.name)?.getValue(context);\r\n }\r\n replacements.set(match.name, value === undefined ? undefined : this._serializeValue(value).replace(/[{}]/g, \"$&$&\"));\r\n }\r\n for (let index = matches.length - 1; index >= 0; index--) {\r\n const match = matches[index];\r\n const serialized = replacements.get(match.name);\r\n if (serialized !== undefined) {\r\n template = template.substring(0, match.start) + serialized + template.substring(match.end + 1);\r\n }\r\n }\r\n return template.replace(/\\{\\{/g, \"{\").replace(/\\}\\}/g, \"}\");\r\n } else {\r\n // No template — pass the raw value directly so Logger receives the original\r\n // object (e.g. Vector3) rather than a stringified representation.\r\n return this.message.getValue(context);\r\n }\r\n }\r\n\r\n private _getTemplateMatches(template: string): { name: string; start: number; end: number }[] {\r\n let state = 0;\r\n let parameterStart = -1;\r\n const matches: { name: string; start: number; end: number }[] = [];\r\n for (let index = 0; index < template.length; index++) {\r\n const character = template[index];\r\n if (character === \"{\") {\r\n if (state === 0) {\r\n state = 1;\r\n } else if (state === 1) {\r\n state = 0;\r\n } else {\r\n return [];\r\n }\r\n } else if (character === \"}\") {\r\n if (state === 0) {\r\n state = 3;\r\n } else if (state === 3) {\r\n state = 0;\r\n } else if (state === 2) {\r\n matches.push({\r\n name: template.substring(parameterStart + 1, index),\r\n start: parameterStart,\r\n end: index,\r\n });\r\n state = 0;\r\n } else {\r\n return [];\r\n }\r\n } else if (state === 1) {\r\n parameterStart = index - 1;\r\n state = 2;\r\n } else if (state === 3) {\r\n return [];\r\n }\r\n }\r\n return state === 0 ? matches : [];\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for flowGraphConsoleLogBlock.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterFlowGraphConsoleLogBlock(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(FlowGraphBlockNames.ConsoleLog, FlowGraphConsoleLogBlock);\r\n}\r\n"]}
@@ -16,6 +16,8 @@ export interface IFlowGraphSetPropertyBlockConfiguration<O extends FlowGraphAsse
16
16
  * The target asset from which the property will be retrieved
17
17
  */
18
18
  target?: AssetType<O>;
19
+ /** Whether a failed write activates only error, without also activating out. Defaults to false. */
20
+ stopOnError?: boolean;
19
21
  }
20
22
  /**
21
23
  * This block will set a property on a given target asset.
@@ -2,6 +2,7 @@
2
2
  import { FlowGraphExecutionBlockWithOutSignal } from "../../flowGraphExecutionBlockWithOutSignal.js";
3
3
  import { RichTypeAny, RichTypeString } from "../../flowGraphRichTypes.pure.js";
4
4
  import { RegisterClass } from "../../../Misc/typeStore.js";
5
+ import { RemoveFlowGraphAnimationGroupObservers } from "../../flowGraphAnimationHelpers.js";
5
6
  /**
6
7
  * This block will set a property on a given target asset.
7
8
  * The property name can include dots ("."), which will be interpreted as a path to the property.
@@ -30,7 +31,9 @@ export class FlowGraphSetPropertyBlock extends FlowGraphExecutionBlockWithOutSig
30
31
  const target = this.object.getValue(context);
31
32
  const value = this.value.getValue(context);
32
33
  const propertyName = this.propertyName.getValue(context);
33
- this._stopRunningAnimations(context, target, propertyName);
34
+ if (!this.config.stopOnError) {
35
+ this._stopRunningAnimations(context, target, propertyName);
36
+ }
34
37
  const setFunction = this.customSetFunction.getValue(context);
35
38
  if (setFunction) {
36
39
  setFunction(target, propertyName, value, context);
@@ -38,19 +41,27 @@ export class FlowGraphSetPropertyBlock extends FlowGraphExecutionBlockWithOutSig
38
41
  else {
39
42
  this._setPropertyValue(target, propertyName, value);
40
43
  }
44
+ if (this.config.stopOnError) {
45
+ this._stopRunningAnimations(context, target, propertyName);
46
+ }
41
47
  }
42
48
  catch (e) {
43
49
  this._reportError(context, e);
50
+ if (this.config.stopOnError) {
51
+ return;
52
+ }
44
53
  }
45
54
  this.out._activateSignal(context);
46
55
  }
47
56
  _stopRunningAnimations(context, target, propertyName) {
48
57
  const currentlyRunningAnimationGroups = context._getGlobalContextVariable("currentlyRunningAnimationGroups", []);
49
- for (const uniqueId of currentlyRunningAnimationGroups) {
58
+ for (let groupIndex = currentlyRunningAnimationGroups.length - 1; groupIndex >= 0; groupIndex--) {
59
+ const uniqueId = currentlyRunningAnimationGroups[groupIndex];
50
60
  const animationGroup = context.assetsContext.animationGroups.find((animationGroup) => animationGroup.uniqueId === uniqueId);
51
61
  if (animationGroup) {
52
62
  for (const targetedAnimations of animationGroup.targetedAnimations) {
53
63
  if (targetedAnimations.target === target && targetedAnimations.animation.targetProperty === propertyName) {
64
+ RemoveFlowGraphAnimationGroupObservers(context, animationGroup)?._cleanupAfterExternalStop(context, animationGroup);
54
65
  animationGroup.stop(true);
55
66
  animationGroup.dispose();
56
67
  const index = currentlyRunningAnimationGroups.indexOf(uniqueId);
@@ -58,6 +69,7 @@ export class FlowGraphSetPropertyBlock extends FlowGraphExecutionBlockWithOutSig
58
69
  currentlyRunningAnimationGroups.splice(index, 1);
59
70
  context._setGlobalContextVariable("currentlyRunningAnimationGroups", currentlyRunningAnimationGroups);
60
71
  }
72
+ break;
61
73
  }
62
74
  }
63
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flowGraphSetPropertyBlock.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type AssetType, type FlowGraphAssetType } from \"core/FlowGraph/flowGraphAssetsContext\";\nimport { type FlowGraphContext } from \"core/FlowGraph/flowGraphContext\";\nimport { type FlowGraphDataConnection } from \"core/FlowGraph/flowGraphDataConnection.pure\";\nimport { FlowGraphExecutionBlockWithOutSignal } from \"core/FlowGraph/flowGraphExecutionBlockWithOutSignal\";\nimport { RichTypeAny, RichTypeString } from \"core/FlowGraph/flowGraphRichTypes.pure\";\nimport { type FlowGraphSignalConnection } from \"core/FlowGraph/flowGraphSignalConnection.pure\";\nimport { FlowGraphBlockNames } from \"../flowGraphBlockNames\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\n\n/**\n * Configuration for the FlowGraphSetPropertyBlock\n */\nexport interface IFlowGraphSetPropertyBlockConfiguration<O extends FlowGraphAssetType> {\n /**\n * The name of the property that will be set\n */\n propertyName?: string;\n\n /**\n * The target asset from which the property will be retrieved\n */\n target?: AssetType<O>;\n}\n\n/**\n * This block will set a property on a given target asset.\n * The property name can include dots (\".\"), which will be interpreted as a path to the property.\n * The target asset is an input and can be changed at any time.\n * The value of the property is an input and can be changed at any time.\n *\n * For example, with an input of a mesh asset, the property name \"position.x\" will set the x component of the position of the mesh.\n *\n * Note that it is recommended to input the object on which you are working on (i.e. a material) than providing a mesh and then getting the material from it.\n */\nexport class FlowGraphSetPropertyBlock<P extends any, O extends FlowGraphAssetType> extends FlowGraphExecutionBlockWithOutSignal {\n /**\n * Input connection: The value to set on the property.\n */\n public readonly value: FlowGraphDataConnection<P>;\n\n /**\n * Input connection: The target asset from which the property will be retrieved\n */\n public readonly object: FlowGraphDataConnection<AssetType<O>>;\n\n /**\n * Input connection: The name of the property that will be set\n */\n public readonly propertyName: FlowGraphDataConnection<string>;\n\n /**\n * Input connection: A function that can be used to set the value of the property.\n * If set it will be used instead of the default set function.\n */\n public readonly customSetFunction: FlowGraphDataConnection<(target: AssetType<O>, propertyName: string, value: P, context: FlowGraphContext) => void>;\n\n constructor(\n /**\n * the configuration of the block\n */\n public override config: IFlowGraphSetPropertyBlockConfiguration<O>\n ) {\n super(config);\n this.object = this.registerDataInput(\"object\", RichTypeAny, config.target);\n this.value = this.registerDataInput(\"value\", RichTypeAny);\n this.propertyName = this.registerDataInput(\"propertyName\", RichTypeString, config.propertyName);\n this.customSetFunction = this.registerDataInput(\"customSetFunction\", RichTypeAny);\n }\n public override _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void {\n try {\n const target = this.object.getValue(context);\n const value = this.value.getValue(context);\n const propertyName = this.propertyName.getValue(context);\n\n this._stopRunningAnimations(context, target, propertyName);\n\n const setFunction = this.customSetFunction.getValue(context);\n if (setFunction) {\n setFunction(target, propertyName, value, context);\n } else {\n this._setPropertyValue(target, propertyName, value);\n }\n } catch (e) {\n this._reportError(context, e);\n }\n this.out._activateSignal(context);\n }\n\n private _stopRunningAnimations(context: FlowGraphContext, target: any, propertyName: string) {\n const currentlyRunningAnimationGroups = context._getGlobalContextVariable(\"currentlyRunningAnimationGroups\", []) as number[];\n for (const uniqueId of currentlyRunningAnimationGroups) {\n const animationGroup = context.assetsContext.animationGroups.find((animationGroup) => animationGroup.uniqueId === uniqueId);\n if (animationGroup) {\n for (const targetedAnimations of animationGroup.targetedAnimations) {\n if (targetedAnimations.target === target && targetedAnimations.animation.targetProperty === propertyName) {\n animationGroup.stop(true);\n animationGroup.dispose();\n\n const index = currentlyRunningAnimationGroups.indexOf(uniqueId);\n if (index !== -1) {\n currentlyRunningAnimationGroups.splice(index, 1);\n context._setGlobalContextVariable(\"currentlyRunningAnimationGroups\", currentlyRunningAnimationGroups);\n }\n }\n }\n }\n }\n }\n\n private _setPropertyValue(target: AssetType<O>, propertyName: string, value: P): void {\n const path = propertyName.split(\".\");\n let obj = target as any;\n for (let i = 0; i < path.length - 1; i++) {\n const prop = path[i];\n if (obj[prop] === undefined) {\n obj[prop] = {};\n }\n obj = obj[prop];\n }\n obj[path[path.length - 1]] = value;\n }\n\n public override getClassName(): string {\n return FlowGraphBlockNames.SetProperty;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for flowGraphSetPropertyBlock.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFlowGraphSetPropertyBlock(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(FlowGraphBlockNames.SetProperty, FlowGraphSetPropertyBlock);\n}\n"]}
1
+ {"version":3,"file":"flowGraphSetPropertyBlock.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { type AssetType, type FlowGraphAssetType } from \"core/FlowGraph/flowGraphAssetsContext\";\nimport { type FlowGraphContext } from \"core/FlowGraph/flowGraphContext\";\nimport { type FlowGraphDataConnection } from \"core/FlowGraph/flowGraphDataConnection.pure\";\nimport { FlowGraphExecutionBlockWithOutSignal } from \"core/FlowGraph/flowGraphExecutionBlockWithOutSignal\";\nimport { RichTypeAny, RichTypeString } from \"core/FlowGraph/flowGraphRichTypes.pure\";\nimport { type FlowGraphSignalConnection } from \"core/FlowGraph/flowGraphSignalConnection.pure\";\nimport { FlowGraphBlockNames } from \"../flowGraphBlockNames\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { RemoveFlowGraphAnimationGroupObservers } from \"../../flowGraphAnimationHelpers\";\n\n/**\n * Configuration for the FlowGraphSetPropertyBlock\n */\nexport interface IFlowGraphSetPropertyBlockConfiguration<O extends FlowGraphAssetType> {\n /**\n * The name of the property that will be set\n */\n propertyName?: string;\n\n /**\n * The target asset from which the property will be retrieved\n */\n target?: AssetType<O>;\n\n /** Whether a failed write activates only error, without also activating out. Defaults to false. */\n stopOnError?: boolean;\n}\n\n/**\n * This block will set a property on a given target asset.\n * The property name can include dots (\".\"), which will be interpreted as a path to the property.\n * The target asset is an input and can be changed at any time.\n * The value of the property is an input and can be changed at any time.\n *\n * For example, with an input of a mesh asset, the property name \"position.x\" will set the x component of the position of the mesh.\n *\n * Note that it is recommended to input the object on which you are working on (i.e. a material) than providing a mesh and then getting the material from it.\n */\nexport class FlowGraphSetPropertyBlock<P extends any, O extends FlowGraphAssetType> extends FlowGraphExecutionBlockWithOutSignal {\n /**\n * Input connection: The value to set on the property.\n */\n public readonly value: FlowGraphDataConnection<P>;\n\n /**\n * Input connection: The target asset from which the property will be retrieved\n */\n public readonly object: FlowGraphDataConnection<AssetType<O>>;\n\n /**\n * Input connection: The name of the property that will be set\n */\n public readonly propertyName: FlowGraphDataConnection<string>;\n\n /**\n * Input connection: A function that can be used to set the value of the property.\n * If set it will be used instead of the default set function.\n */\n public readonly customSetFunction: FlowGraphDataConnection<(target: AssetType<O>, propertyName: string, value: P, context: FlowGraphContext) => void>;\n\n constructor(\n /**\n * the configuration of the block\n */\n public override config: IFlowGraphSetPropertyBlockConfiguration<O>\n ) {\n super(config);\n this.object = this.registerDataInput(\"object\", RichTypeAny, config.target);\n this.value = this.registerDataInput(\"value\", RichTypeAny);\n this.propertyName = this.registerDataInput(\"propertyName\", RichTypeString, config.propertyName);\n this.customSetFunction = this.registerDataInput(\"customSetFunction\", RichTypeAny);\n }\n public override _execute(context: FlowGraphContext, _callingSignal: FlowGraphSignalConnection): void {\n try {\n const target = this.object.getValue(context);\n const value = this.value.getValue(context);\n const propertyName = this.propertyName.getValue(context);\n\n if (!this.config.stopOnError) {\n this._stopRunningAnimations(context, target, propertyName);\n }\n\n const setFunction = this.customSetFunction.getValue(context);\n if (setFunction) {\n setFunction(target, propertyName, value, context);\n } else {\n this._setPropertyValue(target, propertyName, value);\n }\n if (this.config.stopOnError) {\n this._stopRunningAnimations(context, target, propertyName);\n }\n } catch (e) {\n this._reportError(context, e);\n if (this.config.stopOnError) {\n return;\n }\n }\n this.out._activateSignal(context);\n }\n\n private _stopRunningAnimations(context: FlowGraphContext, target: any, propertyName: string) {\n const currentlyRunningAnimationGroups = context._getGlobalContextVariable(\"currentlyRunningAnimationGroups\", []) as number[];\n for (let groupIndex = currentlyRunningAnimationGroups.length - 1; groupIndex >= 0; groupIndex--) {\n const uniqueId = currentlyRunningAnimationGroups[groupIndex];\n const animationGroup = context.assetsContext.animationGroups.find((animationGroup) => animationGroup.uniqueId === uniqueId);\n if (animationGroup) {\n for (const targetedAnimations of animationGroup.targetedAnimations) {\n if (targetedAnimations.target === target && targetedAnimations.animation.targetProperty === propertyName) {\n RemoveFlowGraphAnimationGroupObservers(context, animationGroup)?._cleanupAfterExternalStop(context, animationGroup);\n animationGroup.stop(true);\n animationGroup.dispose();\n\n const index = currentlyRunningAnimationGroups.indexOf(uniqueId);\n if (index !== -1) {\n currentlyRunningAnimationGroups.splice(index, 1);\n context._setGlobalContextVariable(\"currentlyRunningAnimationGroups\", currentlyRunningAnimationGroups);\n }\n break;\n }\n }\n }\n }\n }\n\n private _setPropertyValue(target: AssetType<O>, propertyName: string, value: P): void {\n const path = propertyName.split(\".\");\n let obj = target as any;\n for (let i = 0; i < path.length - 1; i++) {\n const prop = path[i];\n if (obj[prop] === undefined) {\n obj[prop] = {};\n }\n obj = obj[prop];\n }\n obj[path[path.length - 1]] = value;\n }\n\n public override getClassName(): string {\n return FlowGraphBlockNames.SetProperty;\n }\n}\n\nlet _Registered = false;\n/**\n * Register side effects for flowGraphSetPropertyBlock.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterFlowGraphSetPropertyBlock(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n RegisterClass(FlowGraphBlockNames.SetProperty, FlowGraphSetPropertyBlock);\n}\n"]}
@@ -12,9 +12,13 @@ export interface IFlowGraphSetVariableBlockConfiguration extends IFlowGraphBlock
12
12
  */
13
13
  variable?: string;
14
14
  /**
15
- * The name of the variables to set.
15
+ * The names of the variables to set.
16
16
  */
17
17
  variables?: string[];
18
+ /** Whether all input values are evaluated before any variable is written. Defaults to false. */
19
+ evaluateInputsBeforeWrite?: boolean;
20
+ /** Whether writes cancel animations targeting the user-variable dictionary without firing done. Defaults to false. */
21
+ cancelVariableAnimations?: boolean;
18
22
  }
19
23
  /**
20
24
  * This block will set a variable on the context.
@@ -2,6 +2,7 @@
2
2
  import { FlowGraphExecutionBlockWithOutSignal } from "../../flowGraphExecutionBlockWithOutSignal.js";
3
3
  import { RichTypeAny } from "../../flowGraphRichTypes.pure.js";
4
4
  import { RegisterClass } from "../../../Misc/typeStore.js";
5
+ import { RemoveFlowGraphAnimationGroupObservers } from "../../flowGraphAnimationHelpers.js";
5
6
  /**
6
7
  * This block will set a variable on the context.
7
8
  */
@@ -24,16 +25,24 @@ export class FlowGraphSetVariableBlock extends FlowGraphExecutionBlockWithOutSig
24
25
  }
25
26
  _execute(context, _callingSignal) {
26
27
  if (this.config?.variables) {
27
- for (const variable of this.config.variables) {
28
- this._saveVariable(context, variable);
28
+ const variables = this.config.variables;
29
+ let values;
30
+ if (this.config.evaluateInputsBeforeWrite) {
31
+ values = [];
32
+ for (const variable of variables) {
33
+ values.push(this.getDataInput(variable)?.getValue(context));
34
+ }
35
+ }
36
+ for (let i = 0; i < variables.length; i++) {
37
+ this._saveVariable(context, variables[i], values?.[i], values ? undefined : variables[i]);
29
38
  }
30
39
  }
31
40
  else {
32
- this._saveVariable(context, this.config?.variable, "value");
41
+ this._saveVariable(context, this.config?.variable, undefined, "value");
33
42
  }
34
43
  this.out._activateSignal(context);
35
44
  }
36
- _saveVariable(context, variableName, inputName) {
45
+ _saveVariable(context, variableName, value, inputName) {
37
46
  // check if there is an animation(group) running on this variable. If there is, stop the animation - a value was force-set.
38
47
  const currentlyRunningAnimationGroups = context._getGlobalContextVariable("currentlyRunningAnimationGroups", []);
39
48
  for (const animationUniqueId of currentlyRunningAnimationGroups) {
@@ -42,11 +51,18 @@ export class FlowGraphSetVariableBlock extends FlowGraphExecutionBlockWithOutSig
42
51
  // check if there is a target animation that has the target set to be the context
43
52
  for (const targetAnimation of animationGroup.targetedAnimations) {
44
53
  // check if the target property is the variable we are setting
45
- if (targetAnimation.target === context) {
54
+ if (targetAnimation.target === context || (this.config?.cancelVariableAnimations && targetAnimation.target === context.userVariables)) {
46
55
  // check the variable name
47
56
  if (targetAnimation.animation.targetProperty === variableName) {
48
57
  // stop the animation
49
- animationGroup.stop();
58
+ if (this.config?.cancelVariableAnimations) {
59
+ RemoveFlowGraphAnimationGroupObservers(context, animationGroup)?._cleanupAfterExternalStop(context, animationGroup);
60
+ animationGroup.stop(true);
61
+ animationGroup.dispose();
62
+ }
63
+ else {
64
+ animationGroup.stop();
65
+ }
50
66
  // remove the animation from the currently running animations
51
67
  const index = currentlyRunningAnimationGroups.indexOf(animationUniqueId);
52
68
  if (index > -1) {
@@ -59,8 +75,7 @@ export class FlowGraphSetVariableBlock extends FlowGraphExecutionBlockWithOutSig
59
75
  }
60
76
  }
61
77
  }
62
- const value = this.getDataInput(inputName || variableName)?.getValue(context);
63
- context.setVariable(variableName, value);
78
+ context.setVariable(variableName, inputName === undefined ? value : this.getDataInput(inputName)?.getValue(context));
64
79
  }
65
80
  getClassName() {
66
81
  return "FlowGraphSetVariableBlock" /* FlowGraphBlockNames.SetVariable */;