super-three 0.177.0 → 0.181.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -2,6 +2,7 @@ import { REVISION } from 'three/webgpu';
2
2
  import * as TSL from 'three/tsl';
3
3
 
4
4
  import { VariableDeclaration, Accessor } from './AST.js';
5
+ import { isExpression, isPrimitive } from './TranspilerUtils.js';
5
6
 
6
7
  const opLib = {
7
8
  '=': 'assign',
@@ -47,8 +48,6 @@ const unaryLib = {
47
48
 
48
49
  const textureLookupFunctions = [ 'texture', 'texture2D', 'texture3D', 'textureCube', 'textureLod', 'texelFetch', 'textureGrad' ];
49
50
 
50
- const isPrimitive = ( value ) => /^(true|false|-?(\d|\.\d))/.test( value );
51
-
52
51
  class TSLEncoder {
53
52
 
54
53
  constructor() {
@@ -58,13 +57,9 @@ class TSLEncoder {
58
57
  this.global = new Set();
59
58
  this.overloadings = new Map();
60
59
  this.iife = false;
61
- this.uniqueNames = false;
62
60
  this.reference = false;
63
61
 
64
- this._currentVariable = null;
65
-
66
- this._currentProperties = {};
67
- this._lastStatement = null;
62
+ this.block = null;
68
63
 
69
64
  }
70
65
 
@@ -74,7 +69,7 @@ class TSLEncoder {
74
69
 
75
70
  name = name.split( '.' )[ 0 ];
76
71
 
77
- if ( TSL[ name ] !== undefined && this.global.has( name ) === false && this._currentProperties[ name ] === undefined ) {
72
+ if ( TSL[ name ] !== undefined && this.global.has( name ) === false ) {
78
73
 
79
74
  this.imports.add( name );
80
75
 
@@ -132,29 +127,23 @@ class TSLEncoder {
132
127
 
133
128
  }
134
129
 
135
- emitExpression( node ) {
130
+ emitExpression( node, output = null ) {
136
131
 
137
132
  let code;
138
133
 
139
134
  if ( node.isAccessor ) {
140
135
 
141
- this.addImport( node.property );
142
-
143
- code = node.property;
144
-
145
- } else if ( node.isNumber ) {
146
-
147
- if ( node.type === 'int' || node.type === 'uint' ) {
136
+ if ( node.linker.reference === null ) {
148
137
 
149
- code = node.type + '( ' + node.value + ' )';
138
+ this.addImport( node.property );
150
139
 
151
- this.addImport( node.type );
140
+ }
152
141
 
153
- } else {
142
+ code = node.property;
154
143
 
155
- code = node.value;
144
+ } else if ( node.isNumber ) {
156
145
 
157
- }
146
+ code = node.value;
158
147
 
159
148
  } else if ( node.isString ) {
160
149
 
@@ -164,10 +153,10 @@ class TSLEncoder {
164
153
 
165
154
  const opFn = opLib[ node.type ] || node.type;
166
155
 
167
- const left = this.emitExpression( node.left );
168
- const right = this.emitExpression( node.right );
156
+ const left = this.emitExpression( node.left, output );
157
+ const right = this.emitExpression( node.right, output );
169
158
 
170
- if ( isPrimitive( left ) && isPrimitive( right ) ) {
159
+ if ( node.isNumericExpression ) {
171
160
 
172
161
  return left + ' ' + node.type + ' ' + right;
173
162
 
@@ -253,6 +242,18 @@ class TSLEncoder {
253
242
 
254
243
  code = 'Discard()';
255
244
 
245
+ } else if ( node.isBreak ) {
246
+
247
+ this.addImport( 'Break' );
248
+
249
+ code = 'Break()';
250
+
251
+ } else if ( node.isContinue ) {
252
+
253
+ this.addImport( 'Continue' );
254
+
255
+ code = 'Continue()';
256
+
256
257
  } else if ( node.isAccessorElements ) {
257
258
 
258
259
  code = this.emitExpression( node.object );
@@ -293,6 +294,14 @@ class TSLEncoder {
293
294
 
294
295
  code = this.emitFor( node );
295
296
 
297
+ } else if ( node.isWhile ) {
298
+
299
+ code = this.emitWhile( node );
300
+
301
+ } else if ( node.isSwitch ) {
302
+
303
+ code = this.emitSwitch( node );
304
+
296
305
  } else if ( node.isVariableDeclaration ) {
297
306
 
298
307
  code = this.emitVariables( node );
@@ -313,28 +322,25 @@ class TSLEncoder {
313
322
 
314
323
  code = this.emitConditional( node );
315
324
 
316
- } else if ( node.isUnary && node.expression.isNumber ) {
325
+ } else if ( node.isUnary && node.expression.isNumber && node.type === '-' ) {
317
326
 
318
- code = node.expression.type + '( ' + node.type + ' ' + node.expression.value + ' )';
327
+ code = '- ' + node.expression.value;
319
328
 
320
- this.addImport( node.expression.type );
321
-
322
- } else if ( node.isUnary ) {
329
+ if ( node.expression.type !== 'float' ) {
323
330
 
324
- let type = unaryLib[ node.type ];
331
+ code = node.expression.type + '( ' + code + ' )';
325
332
 
326
- if ( node.type === '++' || node.type === '--' ) {
333
+ this.addImport( node.expression.type );
327
334
 
328
- if ( this._currentVariable === null ) {
335
+ }
329
336
 
330
- // optimize increment/decrement operator
331
- // to avoid creating a new variable
337
+ } else if ( node.isUnary ) {
332
338
 
333
- node.after = false;
339
+ let type = unaryLib[ node.type ];
334
340
 
335
- }
341
+ if ( node.hasAssignment ) {
336
342
 
337
- if ( node.after === false ) {
343
+ if ( node.after === false && ( node.type === '++' || node.type === '--' ) ) {
338
344
 
339
345
  type += 'Before';
340
346
 
@@ -370,23 +376,34 @@ class TSLEncoder {
370
376
 
371
377
  emitBody( body ) {
372
378
 
373
- this.setLastStatement( null );
374
-
375
379
  let code = '';
376
380
 
377
381
  this.tab += '\t';
378
382
 
379
383
  for ( const statement of body ) {
380
384
 
381
- code += this.emitExtraLine( statement );
385
+ code += this.emitExtraLine( statement, body );
386
+
387
+ if ( statement.isComment ) {
388
+
389
+ code += this.emitComment( statement, body );
390
+
391
+ continue;
392
+
393
+ }
394
+
395
+ if ( this.block && this.block.isSwitchCase ) {
396
+
397
+ if ( statement.isBreak ) continue; // skip break statements in switch cases
398
+
399
+ }
400
+
382
401
  code += this.tab + this.emitExpression( statement );
383
402
 
384
403
  if ( code.slice( - 1 ) !== '}' ) code += ';';
385
404
 
386
405
  code += '\n';
387
406
 
388
- this.setLastStatement( statement );
389
-
390
407
  }
391
408
 
392
409
  code = code.slice( 0, - 1 ); // remove the last extra line
@@ -507,6 +524,63 @@ ${ this.tab }} )`;
507
524
 
508
525
  }
509
526
 
527
+
528
+ emitSwitch( switchNode ) {
529
+
530
+ const discriminantString = this.emitExpression( switchNode.discriminant );
531
+
532
+ this.tab += '\t';
533
+
534
+ let switchString = `Switch( ${ discriminantString } )\n${ this.tab }`;
535
+
536
+ const previousBlock = this.block;
537
+
538
+ for ( const switchCase of switchNode.cases ) {
539
+
540
+ this.block = switchCase;
541
+
542
+ let caseBodyString;
543
+
544
+ if ( ! switchCase.isDefault ) {
545
+
546
+ const caseConditions = [ ];
547
+
548
+ for ( const condition of switchCase.conditions ) {
549
+
550
+ caseConditions.push( this.emitExpression( condition ) );
551
+
552
+ }
553
+
554
+ caseBodyString = this.emitBody( switchCase.body );
555
+
556
+ switchString += `.Case( ${ caseConditions.join( ', ' ) }, `;
557
+
558
+ } else {
559
+
560
+ caseBodyString = this.emitBody( switchCase.body );
561
+
562
+ switchString += '.Default( ';
563
+
564
+ }
565
+
566
+ switchString += `() => {
567
+
568
+ ${ caseBodyString }
569
+
570
+ ${ this.tab }} )`;
571
+
572
+ }
573
+
574
+ this.block = previousBlock;
575
+
576
+ this.tab = this.tab.slice( 0, - 1 );
577
+
578
+ this.imports.add( 'Switch' );
579
+
580
+ return switchString;
581
+
582
+ }
583
+
510
584
  emitFor( node ) {
511
585
 
512
586
  const { initialization, condition, afterthought } = node;
@@ -554,38 +628,50 @@ ${ this.tab }} )`;
554
628
 
555
629
  }
556
630
 
557
- emitVariables( node, isRoot = true ) {
631
+ emitWhile( node ) {
558
632
 
559
- const { name, type, value, next } = node;
633
+ const condition = this.emitExpression( node.condition );
634
+
635
+ let whileStr = `Loop( ${ condition }, () => {\n\n`;
636
+
637
+ whileStr += this.emitBody( node.body ) + '\n\n';
638
+
639
+ whileStr += this.tab + '} )';
640
+
641
+ this.imports.add( 'Loop' );
642
+
643
+ return whileStr;
644
+
645
+ }
560
646
 
561
- this._currentVariable = node;
647
+ emitVariables( node, isRoot = true ) {
562
648
 
563
- const valueStr = value ? this.emitExpression( value ) : '';
649
+ const { name, type, value, next } = node;
564
650
 
565
651
  let varStr = isRoot ? 'const ' : '';
566
652
  varStr += name;
567
653
 
568
654
  if ( value ) {
569
655
 
570
- if ( value.isFunctionCall && value.name === type ) {
656
+ let valueStr = this.emitExpression( value );
571
657
 
572
- varStr += ' = ' + valueStr;
658
+ if ( value.isNumericExpression ) {
573
659
 
574
- } else {
660
+ // convert JS primitive to node
575
661
 
576
- varStr += ` = ${ type }( ${ valueStr } )`;
662
+ valueStr = `${ type }( ${ valueStr } )`;
577
663
 
578
- }
664
+ this.addImport( type );
579
665
 
580
- } else {
666
+ }
581
667
 
582
- varStr += ` = ${ type }()`;
668
+ varStr += ' = ' + valueStr;
583
669
 
584
- }
670
+ } else {
585
671
 
586
- if ( node.immutable === false ) {
672
+ varStr += ` = property( '${ type }' )`;
587
673
 
588
- varStr += '.toVar()';
674
+ this.addImport( 'property' );
589
675
 
590
676
  }
591
677
 
@@ -595,9 +681,11 @@ ${ this.tab }} )`;
595
681
 
596
682
  }
597
683
 
598
- this.addImport( type );
684
+ if ( node.needsToVar ) {
685
+
686
+ varStr = varStr + '.toVar()';
599
687
 
600
- this._currentVariable = null;
688
+ }
601
689
 
602
690
  return varStr;
603
691
 
@@ -622,7 +710,7 @@ ${ this.tab }} )`;
622
710
 
623
711
  const prefix = this.iife === false ? 'export ' : '';
624
712
 
625
- return `${ prefix }const ${ name } = /*#__PURE__*/ overloadingFn( [ ${ nodes.map( node => node.name + '_' + nodes.indexOf( node ) ).join( ', ' ) } ] );\n`;
713
+ return `${ prefix }const ${ name } = /*@__PURE__*/ overloadingFn( [ ${ nodes.map( node => node.name + '_' + nodes.indexOf( node ) ).join( ', ' ) } ] );\n`;
626
714
 
627
715
  }
628
716
 
@@ -630,8 +718,6 @@ ${ this.tab }} )`;
630
718
 
631
719
  const { name, type } = node;
632
720
 
633
- this._currentProperties = { name: node };
634
-
635
721
  const params = [];
636
722
  const inputs = [];
637
723
  const mutableParams = [];
@@ -640,11 +726,9 @@ ${ this.tab }} )`;
640
726
 
641
727
  for ( const param of node.params ) {
642
728
 
643
- let str = `{ name: '${ param.name }', type: '${ param.type }'`;
644
-
645
729
  let name = param.name;
646
730
 
647
- if ( param.immutable === false && ( param.qualifier !== 'inout' && param.qualifier !== 'out' ) ) {
731
+ if ( param.linker.assignments.length > 0 ) {
648
732
 
649
733
  name = name + '_immutable';
650
734
 
@@ -660,20 +744,21 @@ ${ this.tab }} )`;
660
744
 
661
745
  }
662
746
 
663
- str += ', qualifier: \'' + param.qualifier + '\'';
664
-
665
747
  }
666
748
 
667
- inputs.push( str + ' }' );
749
+ inputs.push( param.name + ': \'' + param.type + '\'' );
668
750
  params.push( name );
669
751
 
670
- this._currentProperties[ name ] = param;
671
-
672
752
  }
673
753
 
674
754
  for ( const param of mutableParams ) {
675
755
 
676
- node.body.unshift( new VariableDeclaration( param.type, param.name, new Accessor( param.name + '_immutable' ) ) );
756
+ const mutableParam = new VariableDeclaration( param.type, param.name, new Accessor( param.name + '_immutable' ), null, true );
757
+ mutableParam.parent = param.parent; // link to the original node
758
+ mutableParam.linker.assignments.push( mutableParam );
759
+ mutableParam.needsToVar = true; // force var declaration
760
+
761
+ node.body.unshift( mutableParam );
677
762
 
678
763
  }
679
764
 
@@ -705,27 +790,19 @@ ${ this.tab }} )`;
705
790
 
706
791
  const prefix = this.iife === false ? 'export ' : '';
707
792
 
708
- let funcStr = `${ prefix }const ${ fnName } = /*#__PURE__*/ Fn( (${ paramsStr }) => {
793
+ let funcStr = `${ prefix }const ${ fnName } = /*@__PURE__*/ Fn( (${ paramsStr }) => {
709
794
 
710
795
  ${ bodyStr }
711
796
 
712
- ${ this.tab }} )`;
713
-
714
- const layoutInput = inputs.length > 0 ? '\n\t\t' + this.tab + inputs.join( ',\n\t\t' + this.tab ) + '\n\t' + this.tab : '';
797
+ ${ this.tab }}`;
715
798
 
716
799
  if ( node.layout !== false && hasPointer === false ) {
717
800
 
718
- const uniqueName = this.uniqueNames ? fnName + '_' + Math.random().toString( 36 ).slice( 2 ) : fnName;
719
-
720
- funcStr += `.setLayout( {
721
- ${ this.tab }\tname: '${ uniqueName }',
722
- ${ this.tab }\ttype: '${ type }',
723
- ${ this.tab }\tinputs: [${ layoutInput }]
724
- ${ this.tab }} )`;
801
+ funcStr += ', { ' + inputs.join( ', ' ) + ', return: \'' + type + '\' }';
725
802
 
726
803
  }
727
804
 
728
- funcStr += ';\n';
805
+ funcStr += ' );\n';
729
806
 
730
807
  this.imports.add( 'Fn' );
731
808
 
@@ -741,21 +818,42 @@ ${ this.tab }} )`;
741
818
 
742
819
  }
743
820
 
744
- setLastStatement( statement ) {
821
+ emitComment( statement, body ) {
822
+
823
+ const index = body.indexOf( statement );
824
+ const previous = body[ index - 1 ];
825
+ const next = body[ index + 1 ];
826
+
827
+ let output = '';
745
828
 
746
- this._lastStatement = statement;
829
+ if ( previous && isExpression( previous ) ) {
830
+
831
+ output += '\n';
832
+
833
+ }
834
+
835
+ output += this.tab + statement.comment.replace( /\n/g, '\n' + this.tab ) + '\n';
836
+
837
+ if ( next && isExpression( next ) ) {
838
+
839
+ output += '\n';
840
+
841
+ }
842
+
843
+ return output;
747
844
 
748
845
  }
749
846
 
750
- emitExtraLine( statement ) {
847
+ emitExtraLine( statement, body ) {
848
+
849
+ const index = body.indexOf( statement );
850
+ const previous = body[ index - 1 ];
751
851
 
752
- const last = this._lastStatement;
753
- if ( last === null ) return '';
852
+ if ( previous === undefined ) return '';
754
853
 
755
854
  if ( statement.isReturn ) return '\n';
756
855
 
757
- const isExpression = ( st ) => st.isFunctionDeclaration !== true && st.isFor !== true && st.isConditional !== true;
758
- const lastExp = isExpression( last );
856
+ const lastExp = isExpression( previous );
759
857
  const currExp = isExpression( statement );
760
858
 
761
859
  if ( lastExp !== currExp || ( ! lastExp && ! currExp ) ) return '\n';
@@ -790,7 +888,15 @@ ${ this.tab }} )`;
790
888
 
791
889
  for ( const statement of ast.body ) {
792
890
 
793
- code += this.emitExtraLine( statement );
891
+ code += this.emitExtraLine( statement, ast.body );
892
+
893
+ if ( statement.isComment ) {
894
+
895
+ code += this.emitComment( statement, ast.body );
896
+
897
+ continue;
898
+
899
+ }
794
900
 
795
901
  if ( statement.isFunctionDeclaration ) {
796
902
 
@@ -802,8 +908,6 @@ ${ this.tab }} )`;
802
908
 
803
909
  }
804
910
 
805
- this.setLastStatement( statement );
806
-
807
911
  }
808
912
 
809
913
  const imports = [ ...this.imports ];
@@ -1,3 +1,5 @@
1
+ import Linker from './Linker.js';
2
+
1
3
  /**
2
4
  * A class that transpiles shader code from one language into another.
3
5
  *
@@ -32,6 +34,15 @@ class Transpiler {
32
34
  */
33
35
  this.encoder = encoder;
34
36
 
37
+ /**
38
+ * The linker. It processes the AST and resolves
39
+ * variable and function references, ensuring that all
40
+ * dependencies are properly linked.
41
+ *
42
+ * @type {Linker}
43
+ */
44
+ this.linker = new Linker();
45
+
35
46
  }
36
47
 
37
48
  /**
@@ -42,7 +53,12 @@ class Transpiler {
42
53
  */
43
54
  parse( source ) {
44
55
 
45
- return this.encoder.emit( this.decoder.parse( source ) );
56
+ const ast = this.decoder.parse( source );
57
+
58
+ // Process the AST to resolve variable and function references and optimizations.
59
+ this.linker.process( ast );
60
+
61
+ return this.encoder.emit( ast );
46
62
 
47
63
  }
48
64
 
@@ -0,0 +1,29 @@
1
+ export function isExpression( st ) {
2
+
3
+ return st.isFunctionDeclaration !== true && st.isFor !== true && st.isWhile !== true && st.isConditional !== true && st.isSwitch !== true;
4
+
5
+ }
6
+
7
+ export function isPrimitive( value ) {
8
+
9
+ return /^(true|false|-?(\d|\.\d))/.test( value );
10
+
11
+ }
12
+
13
+ export function isType( str ) {
14
+
15
+ return /void|bool|float|u?int|mat[234]|mat[234]x[234]|(u|i|b)?vec[234]/.test( str );
16
+
17
+ }
18
+
19
+ export function toFloatType( type ) {
20
+
21
+ if ( /^(i?int)$/.test( type ) ) return 'float';
22
+
23
+ const vecMatch = /^(i|u)?vec([234])$/.exec( type );
24
+
25
+ if ( vecMatch ) return 'vec' + vecMatch[ 2 ];
26
+
27
+ return type;
28
+
29
+ }