@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
@@ -3,42 +3,14 @@ import { AttributeType } from './Constants.js';
3
3
 
4
4
  import { DynamicDrawUsage } from '../../constants.js';
5
5
 
6
+ let _generation = 0;
7
+
6
8
  /**
7
9
  * This renderer module manages geometry attributes.
8
10
  *
9
11
  * @private
10
12
  * @augments DataMap
11
13
  */
12
- /**
13
- * The attribute components of the renderers alive, held weakly. An attribute's dispose listener is
14
- * this one shared function, which holds no renderer: a module-level geometry or attribute never
15
- * keeps a disposed renderer from being collected, and attributes dropped without `dispose()` cost
16
- * nothing to track.
17
- *
18
- * @private
19
- * @type {Set<WeakRef<Attributes>>}
20
- */
21
- const _instances = new Set();
22
-
23
- /**
24
- * Frees an attribute's GPU buffer in every renderer that holds one when `dispose()` is called on it.
25
- *
26
- * @private
27
- * @param {Object} event - The dispose event.
28
- */
29
- function onAttributeDispose( event ) {
30
-
31
- for ( const ref of _instances ) {
32
-
33
- const attributes = ref.deref();
34
-
35
- if ( attributes === undefined ) _instances.delete( ref );
36
- else attributes.delete( event.target );
37
-
38
- }
39
-
40
- }
41
-
42
14
  class Attributes extends DataMap {
43
15
 
44
16
  /**
@@ -65,14 +37,39 @@ class Attributes extends DataMap {
65
37
  */
66
38
  this.info = info;
67
39
 
68
- _instances.add( this._ref = new WeakRef( this ) );
40
+ /**
41
+ * Stores weak references to the buffer attributes with attached
42
+ * `dispose` event listeners.
43
+ *
44
+ * @private
45
+ * @type {Set<WeakRef<BufferAttribute>>}
46
+ */
47
+ this._tracked = new Set();
48
+
49
+ /**
50
+ * Removes weak references from `_tracked` when their attribute
51
+ * has been garbage collected without an explicit `dispose()`.
52
+ *
53
+ * @private
54
+ * @type {FinalizationRegistry}
55
+ */
56
+ this._registry = new FinalizationRegistry( ( ref ) => this._tracked.delete( ref ) );
57
+
58
+ /**
59
+ * Incremented whenever the buffer of an attribute is destroyed. Render objects
60
+ * only have to verify their attributes if this version has changed.
61
+ *
62
+ * @type {number}
63
+ * @default 0
64
+ */
65
+ this.disposeVersion = 0;
69
66
 
70
67
  }
71
68
 
72
69
  /**
73
70
  * Deletes the data for the given attribute.
74
71
  *
75
- * @param {BufferAttribute} attribute - The attribute.
72
+ * @param {BufferAttribute|InterleavedBuffer} attribute - The attribute.
76
73
  * @return {?Object} The deleted attribute data.
77
74
  */
78
75
  delete( attribute ) {
@@ -81,7 +78,16 @@ class Attributes extends DataMap {
81
78
 
82
79
  if ( attributeData !== null ) {
83
80
 
84
- if ( attributeData.listening === true ) attribute.removeEventListener( 'dispose', onAttributeDispose );
81
+ this.disposeVersion ++;
82
+
83
+ if ( attribute.isBufferAttribute === true ) {
84
+
85
+ attribute.removeEventListener( 'dispose', attributeData.onDispose );
86
+
87
+ this._tracked.delete( attributeData.ref );
88
+ this._registry.unregister( attributeData.ref );
89
+
90
+ }
85
91
 
86
92
  this.backend.destroyAttribute( attribute );
87
93
 
@@ -97,7 +103,7 @@ class Attributes extends DataMap {
97
103
  * Updates the given attribute. This method creates attribute buffers
98
104
  * for new attributes and updates data for existing ones.
99
105
  *
100
- * @param {BufferAttribute} attribute - The attribute to update.
106
+ * @param {BufferAttribute|InterleavedBuffer} attribute - The attribute to update.
101
107
  * @param {number} type - The attribute type.
102
108
  */
103
109
  update( attribute, type ) {
@@ -128,29 +134,39 @@ class Attributes extends DataMap {
128
134
 
129
135
  }
130
136
 
131
- data.version = this._getBufferAttribute( attribute ).version;
137
+ data.version = attribute.version;
138
+ data.generation = _generation ++;
132
139
 
133
- // `BufferAttribute.dispose()` frees the buffer (interleaved attributes have no dispose())
140
+ // interleaved buffer attributes are not event dispatchers
134
141
 
135
142
  if ( attribute.isBufferAttribute === true ) {
136
143
 
137
- attribute.addEventListener( 'dispose', onAttributeDispose );
138
- data.listening = true;
144
+ data.onDispose = () => {
145
+
146
+ this.delete( attribute );
147
+
148
+ };
149
+
150
+ attribute.addEventListener( 'dispose', data.onDispose );
151
+
152
+ // see #31798 why tracking separate remove listeners is required right now
153
+ data.ref = new WeakRef( attribute );
154
+
155
+ this._tracked.add( data.ref );
156
+ this._registry.register( attribute, data.ref, data.ref );
139
157
 
140
158
  }
141
159
 
142
160
  } else {
143
161
 
144
- const bufferAttribute = this._getBufferAttribute( attribute );
145
-
146
162
  // Sent when its version moves (`needsUpdate`), as WebGLRenderer does, whatever its usage: a
147
163
  // dynamic buffer went up whole every frame. Only a buffer made around a plain array, which
148
164
  // has no version its owner can move, still goes up every frame when dynamic.
149
- if ( data.version < bufferAttribute.version || ( bufferAttribute.usage === DynamicDrawUsage && bufferAttribute.uploadEveryFrame === true ) ) {
165
+ if ( data.version < attribute.version || ( attribute.usage === DynamicDrawUsage && attribute.uploadEveryFrame === true ) ) {
150
166
 
151
167
  this.backend.updateAttribute( attribute );
152
168
 
153
- data.version = bufferAttribute.version;
169
+ data.version = attribute.version;
154
170
 
155
171
  }
156
172
 
@@ -158,27 +174,21 @@ class Attributes extends DataMap {
158
174
 
159
175
  }
160
176
 
161
- /**
162
- * Stops freeing buffers on `BufferAttribute.dispose()`, when the renderer is disposed.
163
- */
164
177
  dispose() {
165
178
 
166
- _instances.delete( this._ref );
179
+ for ( const ref of this._tracked ) {
167
180
 
168
- }
181
+ const attribute = ref.deref();
169
182
 
170
- /**
171
- * Utility method for handling interleaved buffer attributes correctly.
172
- * To process them, their `InterleavedBuffer` is returned.
173
- *
174
- * @param {BufferAttribute} attribute - The attribute.
175
- * @return {BufferAttribute|InterleavedBuffer}
176
- */
177
- _getBufferAttribute( attribute ) {
183
+ if ( attribute === undefined || this.has( attribute ) === false ) continue;
184
+
185
+ this.delete( attribute );
186
+
187
+ }
178
188
 
179
- if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
189
+ this._tracked.clear();
180
190
 
181
- return attribute;
191
+ super.dispose();
182
192
 
183
193
  }
184
194
 
@@ -163,6 +163,14 @@ class Backend {
163
163
  */
164
164
  draw( /*renderObject, info*/ ) { }
165
165
 
166
+ /**
167
+ * Deletes the vertex state for the given render object.
168
+ *
169
+ * @abstract
170
+ * @param {RenderObject} renderObject - The render object.
171
+ */
172
+ deleteVertexState( /*renderObject*/ ) { }
173
+
166
174
  // compute node
167
175
 
168
176
  /**
@@ -247,6 +255,14 @@ class Backend {
247
255
  */
248
256
  createComputePipeline( /*computePipeline, bindings, promises*/ ) { }
249
257
 
258
+ /**
259
+ * Destroys the given pipeline.
260
+ *
261
+ * @abstract
262
+ * @param {Pipeline} pipeline - The pipeline.
263
+ */
264
+ destroyPipeline( /*pipeline*/ ) { }
265
+
250
266
  // cache key
251
267
 
252
268
  /**
@@ -406,6 +422,14 @@ class Backend {
406
422
  */
407
423
  createStorageAttribute( /*attribute*/ ) { }
408
424
 
425
+ /**
426
+ * Creates the GPU buffer of an indirect storage attribute.
427
+ *
428
+ * @abstract
429
+ * @param {BufferAttribute} attribute - The buffer attribute.
430
+ */
431
+ createIndirectStorageAttribute( /*attribute*/ ) { }
432
+
409
433
  /**
410
434
  * Creates a uniform buffer.
411
435
  *
@@ -438,6 +462,21 @@ class Backend {
438
462
  */
439
463
  destroyAttribute( /*attribute*/ ) { }
440
464
 
465
+ /**
466
+ * Utility method for handling interleaved buffer attributes correctly.
467
+ * To process them, their `InterleavedBuffer` is returned.
468
+ *
469
+ * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute.
470
+ * @return {BufferAttribute|InterleavedBuffer}
471
+ */
472
+ getBufferAttribute( attribute ) {
473
+
474
+ if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;
475
+
476
+ return attribute;
477
+
478
+ }
479
+
441
480
  // canvas
442
481
 
443
482
  /**
@@ -464,6 +503,14 @@ class Backend {
464
503
  */
465
504
  updateViewport( /*renderContext*/ ) {}
466
505
 
506
+ /**
507
+ * Frees the GPU resources of the given canvas target.
508
+ *
509
+ * @abstract
510
+ * @param {CanvasTarget} canvasTarget - The canvas target.
511
+ */
512
+ destroyCanvasTarget( /*canvasTarget*/ ) {}
513
+
467
514
  // utils
468
515
 
469
516
  /**
@@ -595,6 +642,31 @@ class Backend {
595
642
  */
596
643
  isOccluded( /*renderContext, object*/ ) {}
597
644
 
645
+ /**
646
+ * Returns the occlusion query data of the given render context for its current camera.
647
+ *
648
+ * @param {RenderContext} renderContext - The render context.
649
+ * @return {Object} The occlusion query data.
650
+ */
651
+ getOcclusionData( renderContext ) {
652
+
653
+ const renderContextData = this.get( renderContext );
654
+
655
+ if ( renderContextData.occlusionData === undefined ) renderContextData.occlusionData = new WeakMap();
656
+
657
+ let occlusionData = renderContextData.occlusionData.get( renderContext.camera );
658
+
659
+ if ( occlusionData === undefined ) {
660
+
661
+ occlusionData = {};
662
+ renderContextData.occlusionData.set( renderContext.camera, occlusionData );
663
+
664
+ }
665
+
666
+ return occlusionData;
667
+
668
+ }
669
+
598
670
  /**
599
671
  * Resolves the time stamp for the given render context and type.
600
672
  *
@@ -633,10 +705,13 @@ class Backend {
633
705
  * a storage buffer attribute from the GPU to the CPU.
634
706
  *
635
707
  * @async
636
- * @param {StorageBufferAttribute} attribute - The storage buffer attribute.
637
- * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
708
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read from.
709
+ * @param {?(ReadbackBuffer|ArrayBuffer)} [target=null] - The readback buffer or array buffer that receives the data. If `null`, a new array buffer is returned.
710
+ * @param {number} [offset=0] - The byte offset to start reading from. Must be a multiple of 4.
711
+ * @param {number} [count=-1] - The number of bytes to read. Must be a multiple of 4, or `-1` to read to the end of the buffer.
712
+ * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
638
713
  */
639
- async getArrayBufferAsync( /* attribute */ ) {}
714
+ async getArrayBufferAsync( /* attribute, target, offset, count */ ) {}
640
715
 
641
716
  /**
642
717
  * Checks if the given feature is supported by the backend.
@@ -40,6 +40,17 @@ class BindGroup {
40
40
 
41
41
  }
42
42
 
43
+ /**
44
+ * Returns a new bind group with the same name and clones of the bindings.
45
+ *
46
+ * @return {BindGroup} A clone of this bind group.
47
+ */
48
+ clone() {
49
+
50
+ return new BindGroup( this.name, this.bindings.map( ( binding ) => binding.clone() ) );
51
+
52
+ }
53
+
43
54
  }
44
55
 
45
56
  export default BindGroup;
@@ -44,17 +44,6 @@ class Binding {
44
44
 
45
45
  }
46
46
 
47
- /**
48
- * The shader stages in which the binding's resource is visible.
49
- *
50
- * @return {number} The visibility bitmask.
51
- */
52
- getVisibility() {
53
-
54
- return this.visibility;
55
-
56
- }
57
-
58
47
  /**
59
48
  * Clones the binding.
60
49
  *
@@ -1,5 +1,8 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import { AttributeType } from './Constants.js';
3
+ import { hashString } from '../../nodes/core/NodeUtils.js';
4
+
5
+ const _cacheKeyIds = [];
3
6
 
4
7
  /**
5
8
  * This renderer module manages the bindings of the renderer.
@@ -65,6 +68,14 @@ class Bindings extends DataMap {
65
68
  */
66
69
  this.info = info;
67
70
 
71
+ /**
72
+ * Shared bind groups per render context.
73
+ *
74
+ * @private
75
+ * @type {WeakMap<RenderContext|Renderer,Map<number,BindGroup>>}
76
+ */
77
+ this._sharedBindGroups = new WeakMap();
78
+
68
79
  this.pipelines.bindings = this; // assign bindings to pipelines
69
80
 
70
81
  }
@@ -127,6 +138,82 @@ class Bindings extends DataMap {
127
138
 
128
139
  }
129
140
 
141
+ /**
142
+ * Returns the shared bind group of the given render context that corresponds to the given bind group.
143
+ *
144
+ * @param {BindGroup} bindGroup - The bind group.
145
+ * @param {?RenderContext} [renderContext=null] - The render context. If not set, the current render context is used.
146
+ * @return {BindGroup} The shared bind group.
147
+ */
148
+ getSharedBindGroup( bindGroup, renderContext = null ) {
149
+
150
+ if ( renderContext === null ) {
151
+
152
+ const renderer = this.backend.renderer;
153
+ renderContext = renderer._currentRenderContext || renderer; // use renderer as fallback until we have a compute context
154
+
155
+ }
156
+
157
+ // build cache key
158
+
159
+ let cacheKeyString = '';
160
+
161
+ for ( const binding of bindGroup.bindings ) {
162
+
163
+ if ( binding.isNodeUniformsGroup ) {
164
+
165
+ binding.uniforms.sort( ( a, b ) => a.nodeUniform.node.id - b.nodeUniform.node.id );
166
+
167
+ for ( const uniform of binding.uniforms ) {
168
+
169
+ cacheKeyString += uniform.nodeUniform.node.id + ',';
170
+
171
+ }
172
+
173
+ } else {
174
+
175
+ cacheKeyString += binding.nodeUniform.id + ',';
176
+
177
+ }
178
+
179
+ }
180
+
181
+ const cacheKey = hashString( cacheKeyString );
182
+
183
+ // lookup bind group cache
184
+
185
+ let bindGroupsCache = this._sharedBindGroups.get( renderContext );
186
+
187
+ if ( bindGroupsCache === undefined ) {
188
+
189
+ bindGroupsCache = new Map();
190
+
191
+ this._sharedBindGroups.set( renderContext, bindGroupsCache );
192
+
193
+ }
194
+
195
+ // lookup bind group
196
+
197
+ let sharedBindGroup = bindGroupsCache.get( cacheKey );
198
+
199
+ if ( sharedBindGroup === undefined ) {
200
+
201
+ // make sure shared bindings are cloned per render context
202
+
203
+ sharedBindGroup = this.has( bindGroup ) ? bindGroup.clone() : bindGroup;
204
+
205
+ bindGroupsCache.set( cacheKey, sharedBindGroup );
206
+
207
+ const groupData = this.get( sharedBindGroup );
208
+ groupData.renderContext = renderContext;
209
+ groupData.cacheKey = cacheKey;
210
+
211
+ }
212
+
213
+ return sharedBindGroup;
214
+
215
+ }
216
+
130
217
  /**
131
218
  * Updates the bindings for the given compute node.
132
219
  *
@@ -243,11 +330,11 @@ class Bindings extends DataMap {
243
330
 
244
331
  } else if ( binding.isSampledTexture ) {
245
332
 
246
- this.textures.updateTexture( binding.texture );
333
+ binding.generation = this.textures.updateTexture( binding.texture );
247
334
 
248
335
  } else if ( binding.isSampler ) {
249
336
 
250
- this.textures.updateSampler( binding );
337
+ binding.samplerKey = this.textures.updateSampler( binding );
251
338
 
252
339
  } else if ( binding.isStorageBuffer ) {
253
340
 
@@ -323,6 +410,13 @@ class Bindings extends DataMap {
323
410
 
324
411
  }
325
412
 
413
+ if ( groupData.cacheKey !== undefined ) {
414
+
415
+ const bindGroupsCache = this._sharedBindGroups.get( groupData.renderContext );
416
+ bindGroupsCache.delete( groupData.cacheKey );
417
+
418
+ }
419
+
326
420
  this.backend.deleteBindGroupData( bindGroup );
327
421
  this.delete( bindGroup );
328
422
 
@@ -385,7 +479,7 @@ class Bindings extends DataMap {
385
479
 
386
480
  let needsBindingsUpdate = false;
387
481
  let cacheBindings = true;
388
- let cacheKey = '';
482
+ let cacheKeyLength = 0;
389
483
  let version = 0;
390
484
 
391
485
  // iterate over all bindings and check if buffer updates or a new binding group is required
@@ -410,15 +504,23 @@ class Bindings extends DataMap {
410
504
 
411
505
  this.attributes.update( attribute, attributeType );
412
506
 
413
- if ( bindingData.attribute !== attribute ) {
507
+ // generation: a new buffer is created if the attribute has been disposed while in use
508
+
509
+ const generation = this.attributes.get( attribute ).generation;
510
+
511
+ if ( bindingData.attribute !== attribute || bindingData.generation !== generation ) {
414
512
 
415
513
  bindingData.attribute = attribute;
514
+ bindingData.generation = generation;
416
515
 
417
516
  needsBindingsUpdate = true;
418
517
 
419
518
  }
420
519
 
421
- cacheKey += attribute.id + ',';
520
+ // the generation is part of the version so a re-created buffer replaces the cached bind group
521
+
522
+ _cacheKeyIds[ cacheKeyLength ++ ] = attribute.id;
523
+ version += generation;
422
524
 
423
525
  }
424
526
 
@@ -445,13 +547,13 @@ class Bindings extends DataMap {
445
547
 
446
548
  // version: update the texture data or create a new one
447
549
 
448
- this.textures.updateTexture( texture );
550
+ const generation = this.textures.updateTexture( texture );
449
551
 
450
552
  // generation: update the bindings if the binding refers to a different texture object
451
553
 
452
- if ( binding.generation !== texturesTextureData.generation ) {
554
+ if ( binding.generation !== generation ) {
453
555
 
454
- binding.generation = texturesTextureData.generation;
556
+ binding.generation = generation;
455
557
 
456
558
  needsBindingsUpdate = true;
457
559
 
@@ -471,7 +573,7 @@ class Bindings extends DataMap {
471
573
 
472
574
  } else {
473
575
 
474
- cacheKey += texture.id + ',';
576
+ _cacheKeyIds[ cacheKeyLength ++ ] = texture.id;
475
577
  version += texture.version;
476
578
 
477
579
  }
@@ -524,7 +626,11 @@ class Bindings extends DataMap {
524
626
 
525
627
  if ( needsBindingsUpdate === true ) {
526
628
 
527
- this.backend.updateBindings( bindGroup, bindings, cacheBindings ? cacheKey : '', version );
629
+ _cacheKeyIds.length = cacheKeyLength;
630
+
631
+ const cacheKey = cacheBindings ? _cacheKeyIds.join( ',' ) : '';
632
+
633
+ this.backend.updateBindings( bindGroup, bindings, cacheKey, version );
528
634
 
529
635
  }
530
636
 
@@ -94,7 +94,7 @@ class Buffer extends Binding {
94
94
  */
95
95
  get byteLength() {
96
96
 
97
- return getFloatLength( this._buffer.byteLength );
97
+ return getFloatLength( this.buffer.byteLength );
98
98
 
99
99
  }
100
100
 
@@ -156,7 +156,18 @@ class ClippingContext {
156
156
 
157
157
  this.shadowPass = ( scene.overrideMaterial !== null && scene.overrideMaterial.isShadowPassMaterial );
158
158
 
159
- this.viewMatrix.copy( camera.matrixWorldInverse );
159
+ if ( camera.isArrayCamera === true ) {
160
+
161
+ // ArrayCamera sub-cameras share the planes, so keep them in world space.
162
+
163
+ this.viewMatrix.identity();
164
+
165
+ } else {
166
+
167
+ this.viewMatrix.copy( camera.matrixWorldInverse );
168
+
169
+ }
170
+
160
171
  this.viewNormalMatrix.getNormalMatrix( this.viewMatrix );
161
172
 
162
173
  }
@@ -13,8 +13,10 @@ class ComputePipeline extends Pipeline {
13
13
  *
14
14
  * @param {string} cacheKey - The pipeline's cache key.
15
15
  * @param {ProgrammableStage} computeProgram - The pipeline's compute shader.
16
+ * @param {?Array<Object>} [transforms=null] - The transforms (only relevant for WebGL 2 which uses Transform Feedback).
17
+ * @param {?Array<Object>} [attributes=null] - The attributes (only relevant for WebGL 2 which uses Transform Feedback).
16
18
  */
17
- constructor( cacheKey, computeProgram ) {
19
+ constructor( cacheKey, computeProgram, transforms = null, attributes = null ) {
18
20
 
19
21
  super( cacheKey );
20
22
 
@@ -25,6 +27,20 @@ class ComputePipeline extends Pipeline {
25
27
  */
26
28
  this.computeProgram = computeProgram;
27
29
 
30
+ /**
31
+ * The transforms (only relevant for WebGL 2 which uses Transform Feedback).
32
+ *
33
+ * @type {?Array<Object>}
34
+ */
35
+ this.transforms = transforms;
36
+
37
+ /**
38
+ * The attributes (only relevant for WebGL 2 which uses Transform Feedback).
39
+ *
40
+ * @type {?Array<Object>}
41
+ */
42
+ this.attributes = attributes;
43
+
28
44
  /**
29
45
  * This flag can be used for type testing.
30
46
  *
@@ -8,6 +8,7 @@ import RenderPipeline from './RenderPipeline.js';
8
8
  * material shaders. This avoids the intermediate framebuffer and output pass
9
9
  * used by {@link Renderer}, but changes blending and is not compatible with
10
10
  * materials that sample the framebuffer, such as transmissive materials.
11
+ * With the WebGL backend, `antialias` has no effect.
11
12
  *
12
13
  * ```js
13
14
  * const renderPipeline = new DirectRenderPipeline( renderer );
@@ -219,9 +220,12 @@ class DirectRenderPipeline extends RenderPipeline {
219
220
 
220
221
  output.assign( materialOutputNode );
221
222
 
222
- return outputColorTransform === true ?
223
- renderOutput( pipelineOutputNode, toneMapping, outputColorSpace ) :
224
- pipelineOutputNode;
223
+ if ( outputColorTransform === false ) return pipelineOutputNode;
224
+
225
+ const renderOutputNode = renderOutput( pipelineOutputNode, toneMapping, outputColorSpace );
226
+ renderOutputNode.premultipliedAlpha = builder.material.premultipliedAlpha;
227
+
228
+ return renderOutputNode;
225
229
 
226
230
  }
227
231
  } );