@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -1,21 +1,23 @@
1
1
 
2
2
  import { vec3, mat4, Fn } from '../tsl/TSLBase.js';
3
- import { OnAfterObjectUpdate, OnBeforeObjectUpdate } from '../utils/EventNode.js';
3
+ import { OnAfterObjectUpdate } from '../utils/EventNode.js';
4
4
  import { normalLocal, transformNormal } from './Normal.js';
5
5
  import { positionLocal, positionPrevious } from './Position.js';
6
6
  import { varyingProperty } from '../core/PropertyNode.js';
7
7
  import { instancedBufferAttribute, instancedDynamicBufferAttribute } from './BufferAttributeNode.js';
8
+ import ReferenceAttributeNode, { referenceAttribute } from './ReferenceAttributeNode.js';
8
9
  import { buffer } from './BufferNode.js';
9
10
  import { storage } from './StorageBufferNode.js';
10
11
  import { instanceIndex } from '../core/IndexNode.js';
11
12
 
12
- import { InstancedInterleavedBuffer } from '../../core/InstancedInterleavedBuffer.js';
13
- import { InstancedBufferAttribute } from '../../core/InstancedBufferAttribute.js';
13
+ import { InterleavedBufferAttribute } from '../../core/InterleavedBufferAttribute.js';
14
14
  import { DynamicDrawUsage } from '../../constants.js';
15
15
 
16
- const _matrixBuffers = /*@__PURE__*/ new WeakMap();
17
- const _colorBuffers = /*@__PURE__*/ new WeakMap();
18
16
  const _previousInstanceMatrices = /*@__PURE__*/ new WeakMap();
17
+ const _previousMatrices = /*@__PURE__*/ new WeakMap();
18
+
19
+ // The default limit of vertex buffers in WebGPU.
20
+ const MAX_VERTEX_BUFFERS = 8;
19
21
 
20
22
  /**
21
23
  * The most instance matrices may take in a uniform buffer, in bytes: WebGPU's default limit (64 KB,
@@ -31,84 +33,6 @@ function instanceUniformLimit( builder ) {
31
33
 
32
34
  }
33
35
 
34
- /**
35
- * What of each instance buffer's source is on the GPU: the source version it was last synced from,
36
- * and how many of its values are current there.
37
- *
38
- * @type {WeakMap<Object, {version: number, end: number}>}
39
- */
40
- const _uploaded = /*@__PURE__*/ new WeakMap();
41
-
42
- /**
43
- * Brings the GPU copy of an instance attribute (`target`) up to date with `source`, the instanced
44
- * mesh's own attribute. A change with no update ranges sends only the instances the mesh draws
45
- * (`count`), not the whole capacity: a culler that refills a prefix every frame sends that prefix.
46
- * The rest follows when the mesh comes to draw more of them.
47
- *
48
- * @param {BufferAttribute|InterleavedBuffer} target - What the GPU reads.
49
- * @param {BufferAttribute} source - The mesh's attribute.
50
- * @param {?Object3D} mesh - The instanced mesh, if it is one.
51
- */
52
- function syncInstances( target, source, mesh ) {
53
-
54
- const length = source.array.length;
55
- const drawn = mesh !== null && mesh.isInstancedMesh === true ? Math.min( mesh.count, source.count ) * source.itemSize : length;
56
-
57
- let uploaded = _uploaded.get( target );
58
-
59
- if ( uploaded === undefined ) {
60
-
61
- // The first upload of a buffer sends all of it.
62
- uploaded = { version: target.version, end: length };
63
- _uploaded.set( target, uploaded );
64
-
65
- }
66
-
67
- if ( uploaded.version !== source.version ) {
68
-
69
- target.clearUpdateRanges();
70
-
71
- if ( drawn === 0 && source.updateRanges.length === 0 ) {
72
-
73
- // Nothing drawn: nothing to send until there is (no update ranges would mean all of it).
74
- uploaded.version = source.version;
75
- uploaded.end = 0;
76
- return;
77
-
78
- }
79
-
80
- if ( source.updateRanges.length > 0 ) {
81
-
82
- target.updateRanges.push( ...source.updateRanges );
83
-
84
- } else if ( drawn < length ) {
85
-
86
- target.addUpdateRange( 0, drawn );
87
- uploaded.end = drawn;
88
-
89
- } else {
90
-
91
- uploaded.end = length;
92
-
93
- }
94
-
95
- source.clearUpdateRanges(); // the source is never uploaded directly: clear to avoid update range accumulation
96
-
97
- uploaded.version = source.version;
98
- target.version ++; // only ever up, so the upload can't be skipped by a version that matches by chance
99
-
100
- } else if ( uploaded.end < drawn ) {
101
-
102
- // Drawing more than was sent: send the rest, as it stands now.
103
- target.clearUpdateRanges();
104
- target.addUpdateRange( uploaded.end, drawn - uploaded.end );
105
- uploaded.end = drawn;
106
- target.version ++;
107
-
108
- }
109
-
110
- }
111
-
112
36
  /**
113
37
  * Creates the appropriate node for instanced matrix transformations.
114
38
  * Depending on buffer limits and storage capability, returns either a storage, buffer, or instanced interleaved attribute node.
@@ -142,23 +66,11 @@ function createInstanceMatrixNode( builder, instanceMatrix ) {
142
66
 
143
67
  } else {
144
68
 
145
- let interleaved = _matrixBuffers.get( instanceMatrix );
146
-
147
- if ( ! interleaved ) {
148
-
149
- interleaved = new InstancedInterleavedBuffer( instanceMatrix.array, 16, 1 );
150
- _matrixBuffers.set( instanceMatrix, interleaved );
151
-
152
- }
69
+ // the columns view the matrices, so both share the same GPU buffer which is freed via instanceMatrix.dispose()
153
70
 
154
71
  const bufferFn = instanceMatrix.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
155
72
 
156
- const instanceBuffers = [
157
- bufferFn( interleaved, 'vec4', 16, 0 ),
158
- bufferFn( interleaved, 'vec4', 16, 4 ),
159
- bufferFn( interleaved, 'vec4', 16, 8 ),
160
- bufferFn( interleaved, 'vec4', 16, 12 )
161
- ];
73
+ const instanceBuffers = [ 0, 4, 8, 12 ].map( ( offset ) => bufferFn( new InterleavedBufferAttribute( instanceMatrix, 4, offset ) ) );
162
74
 
163
75
  instanceMatrixNode = mat4( ...instanceBuffers );
164
76
 
@@ -194,6 +106,8 @@ function getPreviousInstance( instancedMesh, instanceMatrix, builder ) {
194
106
 
195
107
  _previousInstanceMatrices.set( instancedMesh, data );
196
108
 
109
+ instancedMesh.addEventListener( 'dispose', onPreviousInstanceDispose );
110
+
197
111
  }
198
112
 
199
113
  return data.node;
@@ -201,128 +115,218 @@ function getPreviousInstance( instancedMesh, instanceMatrix, builder ) {
201
115
  }
202
116
 
203
117
  /**
204
- * TSL object representing a varying property for the instanced color vector.
118
+ * Frees the GPU buffer of the previous frame instance matrices when the mesh is disposed.
119
+ * The matrices are kept since the node refers to them, rendering the mesh again re-creates the buffer.
205
120
  *
206
- * @type {VaryingNode<vec3>}
121
+ * @param {Object} event - The dispose event.
207
122
  */
208
- export const instanceColor = /*@__PURE__*/ varyingProperty( 'vec3', 'vInstanceColor' );
123
+ function onPreviousInstanceDispose( { target: object } ) {
124
+
125
+ _previousInstanceMatrices.get( object ).previousInstanceMatrix.dispose();
126
+
127
+ }
209
128
 
210
129
  /**
211
- * TSL function representing the standard instancing vertex shader setup.
212
- * Transforms positionLocal and normalLocal, and assigns varying color in-place.
130
+ * Returns the instance matrices of the previous frame of the given mesh, for motion vectors.
213
131
  *
214
- * @tsl
215
- * @function
216
- * @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} matrices - The instanced transformation matrices.
217
- * @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} [colors=null] - The optional instanced colors.
132
+ * @param {InstancedMesh} object - The instanced mesh.
133
+ * @returns {InstancedBufferAttribute} The matrices of the previous frame.
218
134
  */
219
- export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder ) => {
135
+ function getPreviousMatrix( object ) {
220
136
 
221
- const isStorageMatrix = matrices.isStorageInstancedBufferAttribute === true;
222
- const isStorageColor = colors && colors.isStorageInstancedBufferAttribute === true;
137
+ const matrices = object.instanceMatrix;
223
138
 
224
- const instanceMatrixNode = createInstanceMatrixNode( builder, matrices );
139
+ let previous = _previousMatrices.get( object );
225
140
 
226
- // interleaved buffer tracking for matrix
227
- let interleavedMatrix = null;
141
+ if ( previous === undefined || previous.count !== matrices.count ) {
228
142
 
229
- if ( ! isStorageMatrix ) {
143
+ if ( previous === undefined ) {
230
144
 
231
- const uniformBufferSize = Math.max( matrices.count, 1 ) * 16 * 4;
145
+ object.addEventListener( 'dispose', onPreviousMatrixDispose );
232
146
 
233
- if ( uniformBufferSize > instanceUniformLimit( builder ) ) {
147
+ } else {
234
148
 
235
- interleavedMatrix = _matrixBuffers.get( matrices );
149
+ previous.dispose();
236
150
 
237
151
  }
238
152
 
153
+ previous = matrices.clone();
154
+
155
+ _previousMatrices.set( object, previous );
156
+
239
157
  }
240
158
 
241
- let instanceColorNode = null;
242
- let interleavedColor = null;
159
+ return previous;
243
160
 
244
- if ( colors ) {
161
+ }
245
162
 
246
- if ( isStorageColor ) {
163
+ /**
164
+ * Disposes the instance matrices of the previous frame when the mesh is disposed.
165
+ *
166
+ * @param {Object} event - The dispose event.
167
+ */
168
+ function onPreviousMatrixDispose( { target: object } ) {
247
169
 
248
- instanceColorNode = storage( colors, 'vec3', Math.max( colors.count, 1 ) ).element( instanceIndex );
170
+ object.removeEventListener( 'dispose', onPreviousMatrixDispose );
249
171
 
250
- } else {
172
+ _previousMatrices.get( object ).dispose();
173
+ _previousMatrices.delete( object );
251
174
 
252
- let bufferAttribute = _colorBuffers.get( colors );
175
+ }
253
176
 
254
- if ( ! bufferAttribute ) {
177
+ /**
178
+ * Binds the instance matrices of the previous frame of the rendered mesh.
179
+ *
180
+ * @private
181
+ * @augments ReferenceAttributeNode
182
+ */
183
+ class PreviousInstanceMatrixNode extends ReferenceAttributeNode {
255
184
 
256
- bufferAttribute = new InstancedBufferAttribute( colors.array, 3 );
257
- _colorBuffers.set( colors, bufferAttribute );
185
+ static get type() {
258
186
 
259
- }
187
+ return 'PreviousInstanceMatrixNode';
260
188
 
261
- interleavedColor = bufferAttribute;
189
+ }
262
190
 
263
- const bufferFn = colors.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
191
+ /**
192
+ * Constructs a new previous instance matrix node.
193
+ */
194
+ constructor() {
264
195
 
265
- instanceColorNode = vec3( bufferFn( bufferAttribute, 'vec3', 3, 0 ) );
196
+ super( 'previousInstanceMatrix', 'mat4' );
266
197
 
267
- }
198
+ }
199
+
200
+ /**
201
+ * Returns the instance matrices of the previous frame of the given mesh.
202
+ *
203
+ * @param {InstancedMesh} object - The instanced mesh.
204
+ * @return {InstancedBufferAttribute} The matrices of the previous frame.
205
+ */
206
+ getValueFromReference( object ) {
207
+
208
+ return getPreviousMatrix( object );
268
209
 
269
210
  }
270
211
 
271
- // Synchronization of dynamic buffer updates per frame.
272
- if ( interleavedMatrix !== null || interleavedColor !== null ) {
212
+ }
273
213
 
274
- const mesh = builder.object || null;
214
+ /**
215
+ * Returns `true` if the build can bind the instance data of the rendered mesh, so it can
216
+ * be shared between instanced meshes.
217
+ *
218
+ * @param {InstancedMesh} object - The instanced mesh.
219
+ * @param {NodeBuilder} builder - The current node builder.
220
+ * @returns {boolean} Whether the build can bind the instance data of the rendered mesh.
221
+ */
222
+ function canReferenceInstanceData( object, builder ) {
275
223
 
276
- // Before each draw, not once a frame: a mesh can draw more instances in the next render of the
277
- // same frame, and those have to be sent first.
278
- OnBeforeObjectUpdate( () => {
224
+ // only render objects bind attributes per object
279
225
 
280
- if ( interleavedMatrix !== null ) syncInstances( interleavedMatrix, matrices, mesh );
226
+ if ( builder.renderer.isRenderer !== true ) return false;
281
227
 
282
- if ( colors && interleavedColor !== null ) syncInstances( interleavedColor, colors, mesh );
228
+ // the instance data take up to three vertex buffers next to the ones of the geometry
283
229
 
284
- } );
230
+ const instanceBuffers = 1 + ( object.instanceColor !== null ? 1 : 0 ) + ( builder.needsPreviousData() ? 1 : 0 );
285
231
 
286
- }
232
+ return Object.keys( object.geometry.attributes ).length + instanceBuffers <= MAX_VERTEX_BUFFERS;
233
+
234
+ }
235
+
236
+ /**
237
+ * Transforms the position, the previous position and the normal with the given instance matrices.
238
+ *
239
+ * @param {NodeBuilder} builder - The current node builder.
240
+ * @param {Node<mat4>} instanceMatrixNode - The instance matrix.
241
+ * @param {?Node<mat4>} previousMatrixNode - The instance matrix of the previous frame, if motion vectors are needed.
242
+ */
243
+ function transformInstance( builder, instanceMatrixNode, previousMatrixNode ) {
287
244
 
288
245
  // POSITION
289
246
 
290
247
  const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
291
248
  positionLocal.assign( instancePosition );
292
249
 
293
- if ( builder.needsPreviousData() ) {
250
+ if ( previousMatrixNode !== null ) {
294
251
 
295
- const instancedMesh = builder.object;
252
+ positionPrevious.assign( previousMatrixNode.mul( positionPrevious ).xyz );
296
253
 
297
- OnAfterObjectUpdate( ( { object } ) => {
254
+ }
298
255
 
299
- const { previousInstanceMatrix } = _previousInstanceMatrices.get( object );
256
+ // NORMAL
300
257
 
301
- previousInstanceMatrix.array.set( matrices.array );
302
- previousInstanceMatrix.version = matrices.version;
258
+ if ( builder.hasGeometryAttribute( 'normal' ) ) {
303
259
 
304
- // handle interleaved path
260
+ const instanceNormal = transformNormal( normalLocal, instanceMatrixNode );
261
+ normalLocal.assign( instanceNormal );
305
262
 
306
- const previousInterleavedMatrix = _matrixBuffers.get( previousInstanceMatrix );
263
+ }
307
264
 
308
- if ( previousInterleavedMatrix !== undefined ) previousInterleavedMatrix.version = matrices.version;
265
+ }
309
266
 
310
- } );
267
+ /**
268
+ * TSL object representing a varying property for the instanced color vector.
269
+ *
270
+ * @type {VaryingNode<vec3>}
271
+ */
272
+ export const instanceColor = /*@__PURE__*/ varyingProperty( 'vec3', 'vInstanceColor' );
273
+
274
+ /**
275
+ * TSL function representing the standard instancing vertex shader setup.
276
+ * Transforms positionLocal and normalLocal, and assigns varying color in-place.
277
+ *
278
+ * @tsl
279
+ * @function
280
+ * @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} matrices - The instanced transformation matrices.
281
+ * @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} [colors=null] - The optional instanced colors.
282
+ */
283
+ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder ) => {
284
+
285
+ const isStorageColor = colors && colors.isStorageInstancedBufferAttribute === true;
286
+
287
+ const instanceMatrixNode = createInstanceMatrixNode( builder, matrices );
288
+
289
+ let instanceColorNode = null;
290
+
291
+ if ( colors ) {
292
+
293
+ if ( isStorageColor ) {
294
+
295
+ instanceColorNode = storage( colors, 'vec3', Math.max( colors.count, 1 ) ).element( instanceIndex );
296
+
297
+ } else {
298
+
299
+ // bound directly, so the GPU buffer is freed via instanceColor.dispose()
300
+
301
+ const bufferFn = colors.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
311
302
 
312
- const previousInstanceMatrixNode = getPreviousInstance( instancedMesh, matrices, builder );
313
- positionPrevious.assign( previousInstanceMatrixNode.mul( positionPrevious ).xyz );
303
+ instanceColorNode = vec3( bufferFn( colors ) );
304
+
305
+ }
314
306
 
315
307
  }
316
308
 
317
- // NORMAL
309
+ let previousInstanceMatrixNode = null;
318
310
 
319
- if ( builder.hasGeometryAttribute( 'normal' ) ) {
311
+ if ( builder.needsPreviousData() ) {
320
312
 
321
- const instanceNormal = transformNormal( normalLocal, instanceMatrixNode );
322
- normalLocal.assign( instanceNormal );
313
+ const instancedMesh = builder.object;
314
+
315
+ OnAfterObjectUpdate( ( { object } ) => {
316
+
317
+ const { previousInstanceMatrix } = _previousInstanceMatrices.get( object );
318
+
319
+ previousInstanceMatrix.array.set( matrices.array );
320
+ previousInstanceMatrix.version = matrices.version;
321
+
322
+ } );
323
+
324
+ previousInstanceMatrixNode = getPreviousInstance( instancedMesh, matrices, builder );
323
325
 
324
326
  }
325
327
 
328
+ transformInstance( builder, instanceMatrixNode, previousInstanceMatrixNode );
329
+
326
330
  // COLOR
327
331
 
328
332
  if ( instanceColorNode !== null ) {
@@ -336,14 +340,48 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
336
340
  /**
337
341
  * TSL wrapper for applying instanced mesh rendering setup.
338
342
  *
343
+ * The instance data of the rendered mesh are bound per object via {@link ReferenceAttributeNode},
344
+ * so instanced meshes share builds.
345
+ *
339
346
  * @tsl
340
347
  * @function
341
348
  * @param {InstancedMesh} instancedMesh - The instanced mesh.
342
349
  */
343
- export const instancedMesh = /*@__PURE__*/ Fn( ( [ instancedMesh ] ) => {
350
+ export const instancedMesh = /*@__PURE__*/ Fn( ( [ instancedMesh ], builder ) => {
351
+
352
+ if ( canReferenceInstanceData( instancedMesh, builder ) ) {
353
+
354
+ let previousInstanceMatrixNode = null;
355
+
356
+ if ( builder.needsPreviousData() ) {
357
+
358
+ OnAfterObjectUpdate( ( { object } ) => {
359
+
360
+ const previous = getPreviousMatrix( object );
361
+
362
+ previous.array.set( object.instanceMatrix.array );
363
+ previous.version = object.instanceMatrix.version;
364
+
365
+ } );
366
+
367
+ previousInstanceMatrixNode = new PreviousInstanceMatrixNode();
344
368
 
345
- const { instanceMatrix, instanceColor } = instancedMesh;
369
+ }
370
+
371
+ transformInstance( builder, referenceAttribute( 'instanceMatrix', 'mat4' ), previousInstanceMatrixNode );
372
+
373
+ if ( instancedMesh.instanceColor !== null ) {
374
+
375
+ instanceColor.assign( referenceAttribute( 'instanceColor', 'vec3' ) );
376
+
377
+ }
346
378
 
347
- instance( instanceMatrix, instanceColor );
379
+ } else {
380
+
381
+ builder.objectSpecific = true;
382
+
383
+ instance( instancedMesh.instanceMatrix, instancedMesh.instanceColor );
384
+
385
+ }
348
386
 
349
387
  }, 'void' );
@@ -1,6 +1,7 @@
1
1
  import { uniform } from '../core/UniformNode.js';
2
2
  import { renderGroup } from '../core/UniformGroupNode.js';
3
3
  import { Vector3 } from '../../math/Vector3.js';
4
+ import { Fn, vec4 } from '../tsl/TSLBase.js';
4
5
  import { cameraViewMatrix } from './Camera.js';
5
6
  import { positionWorld } from './Position.js';
6
7
 
@@ -111,20 +112,32 @@ export function lightTargetPosition( light ) {
111
112
  * @tsl
112
113
  * @function
113
114
  * @param {Light} light - The light source.
114
- * @returns {UniformNode<vec3>} The light's position in view space.
115
+ * @returns {Node<vec3>} The light's position in view space.
115
116
  */
116
117
  export function lightViewPosition( light ) {
117
118
 
118
119
  const data = getLightData( light );
119
120
 
120
- return data.viewPosition || ( data.viewPosition = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => {
121
+ return data.viewPosition || ( data.viewPosition = ( Fn( ( { camera } ) => {
121
122
 
122
- self.value = self.value || new Vector3();
123
- self.value.setFromMatrixPosition( light.matrixWorld );
123
+ // Each sub-camera of an array camera has its own view space.
124
124
 
125
- self.value.applyMatrix4( camera.matrixWorldInverse );
125
+ if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
126
126
 
127
- } ) );
127
+ return cameraViewMatrix.mul( vec4( lightPosition( light ), 1 ) ).xyz;
128
+
129
+ }
130
+
131
+ return data.viewPositionUniform || ( data.viewPositionUniform = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => {
132
+
133
+ self.value = self.value || new Vector3();
134
+ self.value.setFromMatrixPosition( light.matrixWorld );
135
+
136
+ self.value.applyMatrix4( camera.matrixWorldInverse );
137
+
138
+ } ) );
139
+
140
+ } ).once() )() );
128
141
 
129
142
  }
130
143
 
@@ -1,5 +1,4 @@
1
1
  import Node from '../core/Node.js';
2
- import { reference } from './ReferenceNode.js';
3
2
  import { materialReference } from './MaterialReferenceNode.js';
4
3
  import { normalView } from './Normal.js';
5
4
  import { nodeImmutable, float, vec2, vec3, mat2 } from '../tsl/TSLBase.js';
@@ -46,6 +45,12 @@ class MaterialNode extends Node {
46
45
 
47
46
  }
48
47
 
48
+ isCacheable( /*builder*/ ) {
49
+
50
+ return false;
51
+
52
+ }
53
+
49
54
  /**
50
55
  * Returns a cached reference node for the given property and type.
51
56
  *
@@ -201,6 +206,20 @@ class MaterialNode extends Node {
201
206
 
202
207
  }
203
208
 
209
+ } else if ( scope === MaterialNode.DIFFUSE_ROUGHNESS ) {
210
+
211
+ const diffuseRoughnessNode = this.getFloat( scope );
212
+
213
+ if ( material.diffuseRoughnessMap && material.diffuseRoughnessMap.isTexture === true ) {
214
+
215
+ node = diffuseRoughnessNode.mul( this.getTexture( scope ).r );
216
+
217
+ } else {
218
+
219
+ node = diffuseRoughnessNode;
220
+
221
+ }
222
+
204
223
  } else if ( scope === MaterialNode.METALNESS ) {
205
224
 
206
225
  const metalnessNode = this.getFloat( scope );
@@ -273,7 +292,7 @@ class MaterialNode extends Node {
273
292
 
274
293
  if ( material.clearcoatRoughnessMap && material.clearcoatRoughnessMap.isTexture === true ) {
275
294
 
276
- node = clearcoatRoughnessNode.mul( this.getTexture( scope ).r );
295
+ node = clearcoatRoughnessNode.mul( this.getTexture( scope ).g );
277
296
 
278
297
  } else {
279
298
 
@@ -340,11 +359,11 @@ class MaterialNode extends Node {
340
359
 
341
360
  } else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {
342
361
 
343
- const iridescenceThicknessMaximum = reference( '1', 'float', material.iridescenceThicknessRange );
362
+ const iridescenceThicknessMaximum = this.getFloat( 'iridescenceThicknessMaximum' );
344
363
 
345
364
  if ( material.iridescenceThicknessMap ) {
346
365
 
347
- const iridescenceThicknessMinimum = reference( '0', 'float', material.iridescenceThicknessRange );
366
+ const iridescenceThicknessMinimum = this.getFloat( 'iridescenceThicknessMinimum' );
348
367
 
349
368
  node = iridescenceThicknessMaximum.sub( iridescenceThicknessMinimum ).mul( this.getTexture( scope ).g ).add( iridescenceThicknessMinimum );
350
369
 
@@ -438,6 +457,7 @@ MaterialNode.SPECULAR_INTENSITY = 'specularIntensity';
438
457
  MaterialNode.SPECULAR_COLOR = 'specularColor';
439
458
  MaterialNode.REFLECTIVITY = 'reflectivity';
440
459
  MaterialNode.ROUGHNESS = 'roughness';
460
+ MaterialNode.DIFFUSE_ROUGHNESS = 'diffuseRoughness';
441
461
  MaterialNode.METALNESS = 'metalness';
442
462
  MaterialNode.NORMAL = 'normal';
443
463
  MaterialNode.CLEARCOAT = 'clearcoat';
@@ -564,6 +584,15 @@ export const materialReflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, M
564
584
  */
565
585
  export const materialRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
566
586
 
587
+ /**
588
+ * TSL object that represents the diffuse roughness of the current material.
589
+ * The value is composed via `diffuseRoughness` * `diffuseRoughnessMap.r`.
590
+ *
591
+ * @tsl
592
+ * @type {Node<float>}
593
+ */
594
+ export const materialDiffuseRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.DIFFUSE_ROUGHNESS );
595
+
567
596
  /**
568
597
  * TSL object that represents the metalness of the current material.
569
598
  * The value is composed via `metalness` * `metalnessMap.b`.