@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -8,7 +8,7 @@ import ParameterNode from './ParameterNode.js';
8
8
  import StructType from './StructType.js';
9
9
  import FunctionNode from '../code/FunctionNode.js';
10
10
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
11
- import { getTypeFromLength } from './NodeUtils.js';
11
+ import { getDataFromObject, getTypeFromLength, hashString } from './NodeUtils.js';
12
12
  import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js';
13
13
 
14
14
  import {
@@ -20,7 +20,6 @@ import { stack } from './StackNode.js';
20
20
  import { getCurrentStack, setCurrentStack } from '../tsl/TSLBase.js';
21
21
 
22
22
  import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
23
- import ChainMap from '../../renderers/common/ChainMap.js';
24
23
 
25
24
  import BindGroup from '../../renderers/common/BindGroup.js';
26
25
 
@@ -35,7 +34,9 @@ import { warn, error } from '../../utils.js';
35
34
 
36
35
  let _id = 0;
37
36
 
38
- const rendererCache = new WeakMap();
37
+ const _bindingGroupsCache = new WeakMap();
38
+
39
+ const sharedNodeData = new WeakMap();
39
40
 
40
41
  const typeFromArray = new Map( [
41
42
  [ Int8Array, 'int' ],
@@ -138,7 +139,10 @@ class NodeBuilder {
138
139
  this.nodes = [];
139
140
 
140
141
  /**
141
- * A list of all sequential nodes.
142
+ * A list of all nodes the builder is processing in sequential order.
143
+ *
144
+ * This is used to determine the update order of nodes, which is important for
145
+ * {@link NodeUpdateType#UPDATE_BEFORE} and {@link NodeUpdateType#UPDATE_AFTER}.
142
146
  *
143
147
  * @type {Array<Node>}
144
148
  */
@@ -466,36 +470,26 @@ class NodeBuilder {
466
470
  }
467
471
 
468
472
  /**
469
- * Whether the material is opaque or not.
473
+ * Whether the material is using flat shading or not.
470
474
  *
471
- * @return {boolean} Whether the material is opaque or not.
475
+ * @returns {boolean} Whether the material is using flat shading or not.
472
476
  */
473
- isOpaque() {
477
+ isFlatShading() {
474
478
 
475
- const material = this.material;
476
-
477
- return material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;
479
+ return this.material.flatShading === true || this.geometry.hasAttribute( 'normal' ) === false;
478
480
 
479
481
  }
480
482
 
481
483
  /**
482
- * Returns the bind groups of the current renderer.
484
+ * Whether the material is opaque or not.
483
485
  *
484
- * @return {ChainMap} The cache.
486
+ * @return {boolean} Whether the material is opaque or not.
485
487
  */
486
- getBindGroupsCache() {
487
-
488
- let bindGroupsCache = rendererCache.get( this.renderer );
489
-
490
- if ( bindGroupsCache === undefined ) {
491
-
492
- bindGroupsCache = new ChainMap();
493
-
494
- rendererCache.set( this.renderer, bindGroupsCache );
488
+ isOpaque() {
495
489
 
496
- }
490
+ const material = this.material;
497
491
 
498
- return bindGroupsCache;
492
+ return material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;
499
493
 
500
494
  }
501
495
 
@@ -559,19 +553,21 @@ class NodeBuilder {
559
553
  */
560
554
  _getBindGroup( groupName, bindings ) {
561
555
 
562
- const bindGroupsCache = this.getBindGroupsCache();
556
+ const groupNode = bindings[ 0 ].groupNode;
563
557
 
564
- //
558
+ let sharedGroup = groupNode.shared;
565
559
 
566
- const bindingsArray = [];
560
+ if ( sharedGroup ) {
561
+
562
+ for ( let i = 1; i < bindings.length; i ++ ) {
567
563
 
568
- let sharedGroup = true;
564
+ if ( groupNode !== bindings[ i ].groupNode ) {
569
565
 
570
- for ( const binding of bindings ) {
566
+ sharedGroup = false;
571
567
 
572
- bindingsArray.push( binding );
568
+ }
573
569
 
574
- sharedGroup = sharedGroup && binding.groupNode.shared !== true;
570
+ }
575
571
 
576
572
  }
577
573
 
@@ -581,19 +577,59 @@ class NodeBuilder {
581
577
 
582
578
  if ( sharedGroup ) {
583
579
 
584
- bindGroup = bindGroupsCache.get( bindingsArray );
580
+ let cacheKeyString = '';
581
+
582
+ for ( const binding of bindings ) {
583
+
584
+ if ( binding.isNodeUniformsGroup ) {
585
+
586
+ binding.uniforms.sort( ( a, b ) => a.nodeUniform.node.id - b.nodeUniform.node.id );
587
+
588
+ for ( const uniform of binding.uniforms ) {
589
+
590
+ cacheKeyString += uniform.nodeUniform.node.id;
591
+
592
+ }
593
+
594
+ } else {
595
+
596
+ cacheKeyString += binding.nodeUniform.id;
597
+
598
+ }
599
+
600
+ }
601
+
602
+ // TODO: Remove this hack ._currentRenderContext
603
+
604
+ const currentContext = this.renderer._currentRenderContext || this.renderer; // use renderer as fallback until we have a compute context
605
+
606
+ let bindingGroupsCache = _bindingGroupsCache.get( currentContext );
607
+
608
+ if ( bindingGroupsCache === undefined ) {
609
+
610
+ bindingGroupsCache = new Map();
611
+
612
+ _bindingGroupsCache.set( currentContext, bindingGroupsCache );
613
+
614
+ }
615
+
616
+ //
617
+
618
+ const cacheKey = hashString( cacheKeyString );
619
+
620
+ bindGroup = bindingGroupsCache.get( cacheKey );
585
621
 
586
622
  if ( bindGroup === undefined ) {
587
623
 
588
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
624
+ bindGroup = new BindGroup( groupName, bindings, this.bindingsIndexes[ groupName ].group );
589
625
 
590
- bindGroupsCache.set( bindingsArray, bindGroup );
626
+ bindingGroupsCache.set( cacheKey, bindGroup );
591
627
 
592
628
  }
593
629
 
594
630
  } else {
595
631
 
596
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
632
+ bindGroup = new BindGroup( groupName, bindings, this.bindingsIndexes[ groupName ].group );
597
633
 
598
634
  }
599
635
 
@@ -651,7 +687,16 @@ class NodeBuilder {
651
687
  const uniforms = bindings[ shaderStage ][ groupName ];
652
688
 
653
689
  const groupUniforms = groups[ groupName ] || ( groups[ groupName ] = [] );
654
- groupUniforms.push( ...uniforms );
690
+
691
+ for ( const uniform of uniforms ) {
692
+
693
+ if ( groupUniforms.includes( uniform ) === false ) {
694
+
695
+ groupUniforms.push( uniform );
696
+
697
+ }
698
+
699
+ }
655
700
 
656
701
  }
657
702
 
@@ -736,9 +781,16 @@ class NodeBuilder {
736
781
  */
737
782
  addSequentialNode( node ) {
738
783
 
739
- if ( this.sequentialNodes.includes( node ) === false ) {
784
+ const updateBeforeType = node.getUpdateBeforeType();
785
+ const updateAfterType = node.getUpdateAfterType();
786
+
787
+ if ( updateBeforeType !== NodeUpdateType.NONE || updateAfterType !== NodeUpdateType.NONE ) {
788
+
789
+ if ( this.sequentialNodes.includes( node ) === false ) {
740
790
 
741
- this.sequentialNodes.push( node );
791
+ this.sequentialNodes.push( node );
792
+
793
+ }
742
794
 
743
795
  }
744
796
 
@@ -807,6 +859,17 @@ class NodeBuilder {
807
859
 
808
860
  }
809
861
 
862
+ /**
863
+ * Returns the maximum number of bytes available for uniform buffers.
864
+ *
865
+ * @return {number} The maximum number of bytes available for uniform buffers.
866
+ */
867
+ getUniformBufferLimit() {
868
+
869
+ return 16384;
870
+
871
+ }
872
+
810
873
  /**
811
874
  * Adds the given node to the internal node chain.
812
875
  * This is used to check recursive calls in node-graph.
@@ -951,8 +1014,13 @@ class NodeBuilder {
951
1014
  const context = { ...this.context };
952
1015
 
953
1016
  delete context.material;
1017
+ delete context.getUV;
1018
+ delete context.getOutput;
1019
+ delete context.getTextureLevel;
1020
+ delete context.getAO;
1021
+ delete context.getShadow;
954
1022
 
955
- return this.context;
1023
+ return context;
956
1024
 
957
1025
  }
958
1026
 
@@ -1224,9 +1292,9 @@ class NodeBuilder {
1224
1292
  if ( type === 'float' || type === 'int' || type === 'uint' ) value = 0;
1225
1293
  else if ( type === 'bool' ) value = false;
1226
1294
  else if ( type === 'color' ) value = new Color();
1227
- else if ( type === 'vec2' ) value = new Vector2();
1228
- else if ( type === 'vec3' ) value = new Vector3();
1229
- else if ( type === 'vec4' ) value = new Vector4();
1295
+ else if ( type === 'vec2' || type === 'uvec2' || type === 'ivec2' ) value = new Vector2();
1296
+ else if ( type === 'vec3' || type === 'uvec3' || type === 'ivec3' ) value = new Vector3();
1297
+ else if ( type === 'vec4' || type === 'uvec4' || type === 'ivec4' ) value = new Vector4();
1230
1298
 
1231
1299
  }
1232
1300
 
@@ -1777,7 +1845,7 @@ class NodeBuilder {
1777
1845
  */
1778
1846
  getBufferAttributeFromNode( node, type ) {
1779
1847
 
1780
- const nodeData = this.getDataFromNode( node );
1848
+ const nodeData = this.getDataFromNode( node, 'vertex' );
1781
1849
 
1782
1850
  let bufferAttribute = nodeData.bufferAttribute;
1783
1851
 
@@ -2909,9 +2977,9 @@ class NodeBuilder {
2909
2977
 
2910
2978
  this.setBuildStage( buildStage );
2911
2979
 
2912
- if ( this.context.vertex && this.context.vertex.isNode ) {
2980
+ if ( this.context.position && this.context.position.isNode ) {
2913
2981
 
2914
- this.flowNodeFromShaderStage( 'vertex', this.context.vertex );
2982
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
2915
2983
 
2916
2984
  }
2917
2985
 
@@ -2951,6 +3019,26 @@ class NodeBuilder {
2951
3019
 
2952
3020
  }
2953
3021
 
3022
+ /**
3023
+ * Returns shared data object for the given node.
3024
+ *
3025
+ * @param {Node} node - The node to get shared data from.
3026
+ * @return {Object} The shared data.
3027
+ */
3028
+ getSharedDataFromNode( node ) {
3029
+
3030
+ let data = sharedNodeData.get( node );
3031
+
3032
+ if ( data === undefined ) {
3033
+
3034
+ data = {};
3035
+
3036
+ }
3037
+
3038
+ return data;
3039
+
3040
+ }
3041
+
2954
3042
  /**
2955
3043
  * Returns a uniform representation which is later used for UBO generation and rendering.
2956
3044
  *
@@ -2960,16 +3048,31 @@ class NodeBuilder {
2960
3048
  */
2961
3049
  getNodeUniform( uniformNode, type ) {
2962
3050
 
2963
- if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode );
2964
- if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) return new Vector2NodeUniform( uniformNode );
2965
- if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode );
2966
- if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode );
2967
- if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
2968
- if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode );
2969
- if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
2970
- if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
3051
+ const nodeData = this.getSharedDataFromNode( uniformNode );
3052
+
3053
+ let node = nodeData.cache;
3054
+
3055
+ if ( node === undefined ) {
3056
+
3057
+ if ( type === 'float' || type === 'int' || type === 'uint' ) node = new NumberNodeUniform( uniformNode );
3058
+ else if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) node = new Vector2NodeUniform( uniformNode );
3059
+ else if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) node = new Vector3NodeUniform( uniformNode );
3060
+ else if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) node = new Vector4NodeUniform( uniformNode );
3061
+ else if ( type === 'color' ) node = new ColorNodeUniform( uniformNode );
3062
+ else if ( type === 'mat2' ) node = new Matrix2NodeUniform( uniformNode );
3063
+ else if ( type === 'mat3' ) node = new Matrix3NodeUniform( uniformNode );
3064
+ else if ( type === 'mat4' ) node = new Matrix4NodeUniform( uniformNode );
3065
+ else {
3066
+
3067
+ throw new Error( `Uniform "${ type }" not implemented.` );
3068
+
3069
+ }
3070
+
3071
+ nodeData.cache = node;
3072
+
3073
+ }
2971
3074
 
2972
- throw new Error( `Uniform "${type}" not declared.` );
3075
+ return node;
2973
3076
 
2974
3077
  }
2975
3078
 
@@ -3076,6 +3179,20 @@ class NodeBuilder {
3076
3179
 
3077
3180
  }
3078
3181
 
3182
+ /**
3183
+ * Returns `true` if data from the previous frame are required. Relevant
3184
+ * when computing motion vectors with {@link VelocityNode}.
3185
+ *
3186
+ * @return {boolean} Whether data from the previous frame are required or not.
3187
+ */
3188
+ needsPreviousData() {
3189
+
3190
+ const mrt = this.renderer.getMRT();
3191
+
3192
+ return ( mrt && mrt.has( 'velocity' ) ) || getDataFromObject( this.object ).useVelocity === true;
3193
+
3194
+ }
3195
+
3079
3196
  }
3080
3197
 
3081
3198
  export default NodeBuilder;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Custom error class for node-related errors, including stack trace information.
3
+ */
4
+ class NodeError extends Error {
5
+
6
+ constructor( message, stackTrace = null ) {
7
+
8
+ super( message );
9
+
10
+ /**
11
+ * The name of the error.
12
+ *
13
+ * @type {string}
14
+ */
15
+ this.name = 'NodeError';
16
+
17
+ /**
18
+ * The stack trace associated with the error.
19
+ *
20
+ * @type {?StackTrace}
21
+ */
22
+ this.stackTrace = stackTrace;
23
+
24
+ }
25
+
26
+ }
27
+
28
+ export default NodeError;
@@ -155,9 +155,13 @@ class NodeFrame {
155
155
 
156
156
  if ( nodeUpdateBeforeMap.frameId !== this.frameId ) {
157
157
 
158
- if ( node.updateBefore( this ) !== false ) {
158
+ const previousFrameId = nodeUpdateBeforeMap.frameId;
159
159
 
160
- nodeUpdateBeforeMap.frameId = this.frameId;
160
+ nodeUpdateBeforeMap.frameId = this.frameId;
161
+
162
+ if ( node.updateBefore( this ) === false ) {
163
+
164
+ nodeUpdateBeforeMap.frameId = previousFrameId;
161
165
 
162
166
  }
163
167
 
@@ -169,9 +173,13 @@ class NodeFrame {
169
173
 
170
174
  if ( nodeUpdateBeforeMap.renderId !== this.renderId ) {
171
175
 
172
- if ( node.updateBefore( this ) !== false ) {
176
+ const previousRenderId = nodeUpdateBeforeMap.renderId;
177
+
178
+ nodeUpdateBeforeMap.renderId = this.renderId;
179
+
180
+ if ( node.updateBefore( this ) === false ) {
173
181
 
174
- nodeUpdateBeforeMap.renderId = this.renderId;
182
+ nodeUpdateBeforeMap.renderId = previousRenderId;
175
183
 
176
184
  }
177
185
 
@@ -5,7 +5,9 @@ import { Matrix4 } from '../../math/Matrix4.js';
5
5
  import { Vector2 } from '../../math/Vector2.js';
6
6
  import { Vector3 } from '../../math/Vector3.js';
7
7
  import { Vector4 } from '../../math/Vector4.js';
8
+
8
9
  import { error } from '../../utils.js';
10
+ import StackTrace from '../core/StackTrace.js';
9
11
 
10
12
  // cyrb53 (c) 2018 bryc (github.com/bryc). License: Public domain. Attribution appreciated.
11
13
  // A fast and simple 64-bit (or 53-bit) string hash function with decent collision resistance.
@@ -154,7 +156,7 @@ export function getLengthFromType( type ) {
154
156
  if ( /mat3/.test( type ) ) return 9;
155
157
  if ( /mat4/.test( type ) ) return 16;
156
158
 
157
- error( 'TSL: Unsupported type:', type );
159
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
158
160
 
159
161
  }
160
162
 
@@ -176,29 +178,29 @@ export function getMemoryLengthFromType( type ) {
176
178
  if ( /mat3/.test( type ) ) return 12;
177
179
  if ( /mat4/.test( type ) ) return 16;
178
180
 
179
- error( 'TSL: Unsupported type:', type );
181
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
180
182
 
181
183
  }
182
184
 
183
185
  /**
184
- * Returns the byte boundary for the given data type.
186
+ * Returns the alignment requirement for the given data type.
185
187
  *
186
188
  * @private
187
189
  * @method
188
190
  * @param {string} type - The data type.
189
- * @return {number} The byte boundary.
191
+ * @return {number} The alignment requirement in bytes.
190
192
  */
191
- export function getByteBoundaryFromType( type ) {
193
+ export function getAlignmentFromType( type ) {
192
194
 
193
195
  if ( /float|int|uint/.test( type ) ) return 4;
194
196
  if ( /vec2/.test( type ) ) return 8;
195
197
  if ( /vec3/.test( type ) ) return 16;
196
198
  if ( /vec4/.test( type ) ) return 16;
197
199
  if ( /mat2/.test( type ) ) return 8;
198
- if ( /mat3/.test( type ) ) return 48;
199
- if ( /mat4/.test( type ) ) return 64;
200
+ if ( /mat3/.test( type ) ) return 16;
201
+ if ( /mat4/.test( type ) ) return 16;
200
202
 
201
- error( 'TSL: Unsupported type:', type );
203
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
202
204
 
203
205
  }
204
206
 
@@ -42,11 +42,17 @@ class OutputStructNode extends Node {
42
42
 
43
43
  }
44
44
 
45
- getNodeType( builder ) {
45
+ getNodeType( /*builder*/ ) {
46
46
 
47
- const properties = builder.getNodeProperties( this );
47
+ return 'OutputType';
48
48
 
49
- if ( properties.membersLayout === undefined ) {
49
+ }
50
+
51
+ generate( builder ) {
52
+
53
+ const nodeData = builder.getDataFromNode( this );
54
+
55
+ if ( nodeData.membersLayout === undefined ) {
50
56
 
51
57
  const members = this.members;
52
58
  const membersLayout = [];
@@ -60,16 +66,12 @@ class OutputStructNode extends Node {
60
66
 
61
67
  }
62
68
 
63
- properties.membersLayout = membersLayout;
64
- properties.structType = builder.getOutputStructTypeFromNode( this, properties.membersLayout );
69
+ nodeData.membersLayout = membersLayout;
70
+ nodeData.structType = builder.getOutputStructTypeFromNode( this, nodeData.membersLayout );
65
71
 
66
72
  }
67
73
 
68
- return properties.structType.name;
69
-
70
- }
71
-
72
- generate( builder ) {
74
+ //
73
75
 
74
76
  const propertyName = builder.getOutputStructName();
75
77
  const members = this.members;
@@ -1,5 +1,5 @@
1
- import { nodeObject } from '../tsl/TSLBase.js';
2
1
  import { error } from '../../utils.js';
2
+ import StackTrace from '../core/StackTrace.js';
3
3
  import PropertyNode from './PropertyNode.js';
4
4
 
5
5
  /**
@@ -56,7 +56,7 @@ class ParameterNode extends PropertyNode {
56
56
 
57
57
  } else {
58
58
 
59
- error( `TSL: Member "${ name }" not found in struct "${ type }".` );
59
+ error( `TSL: Member "${ name }" not found in struct "${ type }".`, new StackTrace() );
60
60
 
61
61
  memberType = 'float';
62
62
 
@@ -91,4 +91,4 @@ export default ParameterNode;
91
91
  * @param {?string} name - The name of the parameter in the shader.
92
92
  * @returns {ParameterNode}
93
93
  */
94
- export const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) );
94
+ export const parameter = ( type, name ) => new ParameterNode( type, name );
@@ -1,5 +1,5 @@
1
1
  import Node from './Node.js';
2
- import { nodeImmutable, nodeObject } from '../tsl/TSLCore.js';
2
+ import { nodeImmutable } from '../tsl/TSLCore.js';
3
3
  import { hashString } from './NodeUtils.js';
4
4
 
5
5
  /**
@@ -113,7 +113,7 @@ export default PropertyNode;
113
113
  * @param {?string} [name=null] - The name of the property in the shader.
114
114
  * @returns {PropertyNode}
115
115
  */
116
- export const property = ( type, name ) => nodeObject( new PropertyNode( type, name ) );
116
+ export const property = ( type, name ) => new PropertyNode( type, name );
117
117
 
118
118
  /**
119
119
  * TSL function for creating a varying property node.
@@ -124,7 +124,7 @@ export const property = ( type, name ) => nodeObject( new PropertyNode( type, na
124
124
  * @param {?string} [name=null] - The name of the varying in the shader.
125
125
  * @returns {PropertyNode}
126
126
  */
127
- export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( type, name, true ) );
127
+ export const varyingProperty = ( type, name ) => new PropertyNode( type, name, true );
128
128
 
129
129
  /**
130
130
  * TSL object that represents the shader variable `DiffuseColor`.
@@ -134,6 +134,14 @@ export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( t
134
134
  */
135
135
  export const diffuseColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' );
136
136
 
137
+ /**
138
+ * TSL object that represents the shader variable `DiffuseContribution`.
139
+ *
140
+ * @tsl
141
+ * @type {PropertyNode<vec3>}
142
+ */
143
+ export const diffuseContribution = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'DiffuseContribution' );
144
+
137
145
  /**
138
146
  * TSL object that represents the shader variable `EmissiveColor`.
139
147
  *
@@ -254,6 +262,14 @@ export const anisotropyB = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'A
254
262
  */
255
263
  export const specularColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColor' );
256
264
 
265
+ /**
266
+ * TSL object that represents the shader variable `SpecularColorBlended`.
267
+ *
268
+ * @tsl
269
+ * @type {PropertyNode<color>}
270
+ */
271
+ export const specularColorBlended = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColorBlended' );
272
+
257
273
  /**
258
274
  * TSL object that represents the shader variable `SpecularF90`.
259
275
  *