@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
@@ -60,6 +60,12 @@ class LoopNode extends Node {
60
60
 
61
61
  }
62
62
 
63
+ isCacheable( /*builder*/ ) {
64
+
65
+ return false;
66
+
67
+ }
68
+
63
69
  /**
64
70
  * Returns a loop variable name based on an index. The pattern is
65
71
  * `0` = `i`, `1`= `j`, `2`= `k` and so on.
@@ -105,7 +111,7 @@ class LoopNode extends Node {
105
111
 
106
112
  const fnCall = params[ params.length - 1 ]( inputs );
107
113
 
108
- properties.returnsNode = fnCall.context( { nodeLoop: fnCall } );
114
+ properties.returnsNode = fnCall.context( { nodeLoop: this, nodeBlock: builder.createBlock() } );
109
115
  properties.stackNode = stack;
110
116
 
111
117
  const baseParam = params[ 0 ];
@@ -114,7 +120,7 @@ class LoopNode extends Node {
114
120
 
115
121
  const fnUpdateCall = Fn( baseParam.update )( inputs );
116
122
 
117
- properties.updateNode = fnUpdateCall.context( { nodeLoop: fnUpdateCall } );
123
+ properties.updateNode = fnUpdateCall.context( { nodeLoop: this } );
118
124
 
119
125
  }
120
126
 
@@ -144,13 +150,6 @@ class LoopNode extends Node {
144
150
 
145
151
  this.getProperties( builder );
146
152
 
147
- if ( builder.fnCall ) {
148
-
149
- const shaderNodeData = builder.getDataFromNode( builder.fnCall.shaderNode );
150
- shaderNodeData.hasLoop = true;
151
-
152
- }
153
-
154
153
  }
155
154
 
156
155
  generate( builder ) {
@@ -315,10 +314,16 @@ class LoopNode extends Node {
315
314
 
316
315
  }
317
316
 
317
+ const flowBlock = builder.flowBlock;
318
+
319
+ builder.flowBlock = { parent: flowBlock };
320
+
318
321
  const stackSnippet = stackNode.build( builder, 'void' );
319
322
 
320
323
  properties.returnsNode.build( builder, 'void' );
321
324
 
325
+ builder.flowBlock = flowBlock;
326
+
322
327
  builder.removeFlowTab().addFlowCode( '\n' + builder.tab + stackSnippet );
323
328
 
324
329
  for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
@@ -50,6 +50,24 @@ class MemberNode extends Node {
50
50
 
51
51
  }
52
52
 
53
+ isCacheable( /*builder*/ ) {
54
+
55
+ return false;
56
+
57
+ }
58
+
59
+ /**
60
+ * Returns the scope of the struct so assignments to members
61
+ * mark the underlying value as mutable.
62
+ *
63
+ * @return {Node} The scope of the node.
64
+ */
65
+ getScope() {
66
+
67
+ return this.structNode.getScope();
68
+
69
+ }
70
+
53
71
  hasMember( builder ) {
54
72
 
55
73
  if ( this.structNode.isMemberNode ) {
@@ -4,6 +4,21 @@ import { textureSize } from '../accessors/TextureSizeNode.js';
4
4
  import { textureLoad } from '../accessors/TextureNode.js';
5
5
  import { WebGPUCoordinateSystem } from '../../constants.js';
6
6
 
7
+ /**
8
+ * Returns `true` if the given depth value belongs to the background, i.e. the cleared
9
+ * far plane. Takes the renderer's reversed depth buffer into account.
10
+ *
11
+ * @tsl
12
+ * @function
13
+ * @param {Node<float>} depth - The depth value.
14
+ * @return {Node<bool>} Whether the depth value belongs to the background.
15
+ */
16
+ export const isBackgroundDepth = /*@__PURE__*/ Fn( ( [ depth ], builder ) => {
17
+
18
+ return builder.renderer.reversedDepthBuffer === true ? depth.lessThanEqual( 0.0 ) : depth.greaterThanEqual( 1.0 );
19
+
20
+ } );
21
+
7
22
  /**
8
23
  * Computes a position in view space based on a fragment's screen position expressed as uv coordinates, the fragments
9
24
  * depth value and the camera's inverse projection matrix.
@@ -19,7 +34,7 @@ export const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, proj
19
34
 
20
35
  let clipSpacePosition;
21
36
 
22
- if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
37
+ if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem || builder.renderer.reversedDepthBuffer === true ) {
23
38
 
24
39
  screenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );
25
40
  clipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );
@@ -52,7 +67,7 @@ export const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionM
52
67
  const sampleUv = sampleClipPos.xy.div( sampleClipPos.w ).mul( 0.5 ).add( 0.5 ).toVar();
53
68
  return vec2( sampleUv.x, sampleUv.y.oneMinus() );
54
69
 
55
- } );
70
+ }, { viewPosition: 'vec3', projectionMatrix: 'mat4', return: 'vec2' } );
56
71
 
57
72
  /**
58
73
  * Converts a clip-space position into a screen position expressed as uv coordinates.
@@ -67,13 +82,7 @@ export const getScreenPositionFromClip = /*@__PURE__*/ Fn( ( [ clipPosition ] )
67
82
  const screen = clipPosition.xy.div( clipPosition.w ).mul( 0.5 ).add( 0.5 ).toVar();
68
83
  return vec2( screen.x, screen.y.oneMinus() );
69
84
 
70
- } ).setLayout( {
71
- name: 'getScreenPositionFromClip',
72
- type: 'vec2',
73
- inputs: [
74
- { name: 'clipPosition', type: 'vec4' }
75
- ]
76
- } );
85
+ }, { clipPosition: 'vec4', return: 'vec2' } );
77
86
 
78
87
  /**
79
88
  * Computes a normal vector based on depth data. Can be used as a fallback when no normal render
@@ -135,13 +144,7 @@ export const interleavedGradientNoise = /*@__PURE__*/ Fn( ( [ position ] ) => {
135
144
 
136
145
  return fract( float( 52.9829189 ).mul( fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ) );
137
146
 
138
- } ).setLayout( {
139
- name: 'interleavedGradientNoise',
140
- type: 'float',
141
- inputs: [
142
- { name: 'position', type: 'vec2' }
143
- ]
144
- } );
147
+ }, { position: 'vec2', return: 'float' } );
145
148
 
146
149
  /**
147
150
  * Vogel disk sampling for uniform circular distribution.
@@ -164,12 +167,4 @@ export const vogelDiskSample = /*@__PURE__*/ Fn( ( [ sampleIndex, samplesCount,
164
167
  const theta = float( sampleIndex ).mul( goldenAngle ).add( phi );
165
168
  return vec2( cos( theta ), sin( theta ) ).mul( r );
166
169
 
167
- } ).setLayout( {
168
- name: 'vogelDiskSample',
169
- type: 'vec2',
170
- inputs: [
171
- { name: 'sampleIndex', type: 'int' },
172
- { name: 'samplesCount', type: 'int' },
173
- { name: 'phi', type: 'float' }
174
- ]
175
- } );
170
+ }, { sampleIndex: 'int', samplesCount: 'int', phi: 'float', return: 'vec2' } );
@@ -296,6 +296,8 @@ class RTTNode extends TextureNode {
296
296
 
297
297
  resetRendererState( renderer, this._rendererState );
298
298
 
299
+ renderer.setClearColor( this._rendererState.clearColor, this._rendererState.clearAlpha ); // keep clear color/alpha
300
+
299
301
  renderer.setRenderTarget( this.renderTarget );
300
302
 
301
303
  this._quadMesh.render( renderer );
@@ -337,6 +337,12 @@ class ReflectorBaseNode extends Node {
337
337
 
338
338
  }
339
339
 
340
+ isCacheable( /*builder*/ ) {
341
+
342
+ return false;
343
+
344
+ }
345
+
340
346
  /**
341
347
  * Updates the resolution of the internal render target.
342
348
  *
@@ -436,6 +442,19 @@ class ReflectorBaseNode extends Node {
436
442
 
437
443
  }
438
444
 
445
+ /**
446
+ * Uses the virtual camera of the current camera as the update reference so
447
+ * the reflection is updated for each camera that renders the reflector.
448
+ *
449
+ * @param {(NodeFrame|NodeBuilder)} state - The current state.
450
+ * @return {Camera} The virtual camera.
451
+ */
452
+ updateReference( state ) {
453
+
454
+ return this.getVirtualCamera( state.camera );
455
+
456
+ }
457
+
439
458
  updateBefore( frame ) {
440
459
 
441
460
  if ( this.bounces === false && _inReflector ) return false;
@@ -511,6 +530,11 @@ class ReflectorBaseNode extends Node {
511
530
  virtualCamera.updateMatrixWorld();
512
531
  virtualCamera.projectionMatrix.copy( camera.projectionMatrix );
513
532
 
533
+ // The reflection is mirrored horizontally, so the view offset must be mirrored as well.
534
+
535
+ virtualCamera.projectionMatrix.elements[ 8 ] *= - 1;
536
+ virtualCamera.projectionMatrix.elements[ 12 ] *= - 1;
537
+
514
538
  // Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html
515
539
  // Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
516
540
  _reflectorPlane.setFromNormalAndCoplanarPoint( _normal, _reflectorWorldPosition );
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { nodeProxy, vec4, mat2, mat4 } from '../tsl/TSLBase.js';
3
3
  import { cos, sin } from '../math/MathNode.js';
4
4
  import { hashString } from '../core/NodeUtils.js';
@@ -6,9 +6,9 @@ import { hashString } from '../core/NodeUtils.js';
6
6
  /**
7
7
  * Applies a rotation to the given position node.
8
8
  *
9
- * @augments TempNode
9
+ * @augments Node
10
10
  */
11
- class RotateNode extends TempNode {
11
+ class RotateNode extends Node {
12
12
 
13
13
  static get type() {
14
14
 
@@ -53,6 +53,12 @@ class SampleNode extends Node {
53
53
 
54
54
  }
55
55
 
56
+ isCacheable( /*builder*/ ) {
57
+
58
+ return false;
59
+
60
+ }
61
+
56
62
  /**
57
63
  * Sets up the node by sampling with the default UV accessor.
58
64
  *
@@ -1,4 +1,4 @@
1
- import TempNode from '../core/TempNode.js';
1
+ import Node from '../core/Node.js';
2
2
  import { vectorComponents } from '../core/constants.js';
3
3
 
4
4
  /**
@@ -10,9 +10,9 @@ import { vectorComponents } from '../core/constants.js';
10
10
  * materialLine.colorNode = color( 0, 0, 0 ).setR( float( 1 ) );
11
11
  * ```
12
12
  *
13
- * @augments TempNode
13
+ * @augments Node
14
14
  */
15
- class SetNode extends TempNode {
15
+ class SetNode extends Node {
16
16
 
17
17
  static get type() {
18
18
 
@@ -57,6 +57,12 @@ class SplitNode extends Node {
57
57
 
58
58
  }
59
59
 
60
+ isCacheable( /*builder*/ ) {
61
+
62
+ return false;
63
+
64
+ }
65
+
60
66
  /**
61
67
  * Returns the vector length which is computed based on the requested components.
62
68
  *
@@ -43,7 +43,7 @@ export const rotateUV = /*@__PURE__*/ Fn( ( [ uv, rotation, center = vec2( 0.5 )
43
43
 
44
44
  return rotate( uv.sub( center ), rotation ).add( center );
45
45
 
46
- } );
46
+ }, { uv: 'vec2', rotation: 'float', center: 'vec2', return: 'vec2' } );
47
47
 
48
48
  /**
49
49
  * Applies a spherical warping effect to the given uv coordinates.
@@ -64,4 +64,4 @@ export const spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5
64
64
 
65
65
  return uv.add( delta.mul( deltaOffset ) );
66
66
 
67
- } );
67
+ }, { uv: 'vec2', strength: 'float', center: 'vec2', return: 'vec2' } );
@@ -84,6 +84,7 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray();
84
84
  const _box = /*@__PURE__*/ new Box3();
85
85
  const _sphere = /*@__PURE__*/ new Sphere();
86
86
  const _vector = /*@__PURE__*/ new Vector3();
87
+ const _cameraPosition = /*@__PURE__*/ new Vector3();
87
88
  const _forward = /*@__PURE__*/ new Vector3();
88
89
  const _temp = /*@__PURE__*/ new Vector3();
89
90
  const _renderList = /*@__PURE__*/ new MultiDrawRenderList();
@@ -177,6 +178,10 @@ function copyArrayContents( src, target ) {
177
178
  * scene.add( batchedMesh );
178
179
  * ```
179
180
  *
181
+ * The first geometry added defines the layout of the batch. All subsequent geometries must
182
+ * match its index usage and provide its attributes with the same itemSize and normalized
183
+ * values. Additional attributes are ignored.
184
+ *
180
185
  * @augments Mesh
181
186
  */
182
187
  class BatchedMesh extends Mesh {
@@ -274,11 +279,20 @@ class BatchedMesh extends Mesh {
274
279
  this._multiDrawCount = 0;
275
280
  this._multiDrawBytesPerElement = 1;
276
281
 
282
+ // buffers for instanced draws, consecutive draws with the same range are merged
283
+ this._mergedDrawCounts = new Int32Array( maxInstanceCount );
284
+ this._mergedDrawStarts = new Int32Array( maxInstanceCount );
285
+ this._mergedDrawInstanceCounts = new Int32Array( maxInstanceCount );
286
+ this._mergedDrawCount = 0;
287
+
277
288
  // Local matrix per geometry by using data texture
278
289
  this._matricesTexture = null;
279
290
  this._indirectTexture = null;
280
291
  this._colorsTexture = null;
281
292
 
293
+ // previous frame matrices for motion vectors, created by the renderer
294
+ this._previousMatricesTexture = null;
295
+
282
296
  this._initMatricesTexture();
283
297
  this._initIndirectTexture();
284
298
 
@@ -437,7 +451,7 @@ class BatchedMesh extends Mesh {
437
451
  const dstAttribute = batchGeometry.getAttribute( attributeName );
438
452
  if ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {
439
453
 
440
- throw new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );
454
+ throw new Error( `THREE.BatchedMesh: Added geometry attribute "${ attributeName }" has an inconsistent itemSize or normalized value.` );
441
455
 
442
456
  }
443
457
 
@@ -494,7 +508,7 @@ class BatchedMesh extends Mesh {
494
508
  /**
495
509
  * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.
496
510
  * Bounding boxes aren't computed by default. They need to be explicitly computed,
497
- * otherwise they are `null`.
511
+ * otherwise they are `null`. Must be recomputed when instances change.
498
512
  */
499
513
  computeBoundingBox() {
500
514
 
@@ -523,8 +537,8 @@ class BatchedMesh extends Mesh {
523
537
 
524
538
  /**
525
539
  * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.
526
- * Bounding spheres aren't computed by default. They need to be explicitly computed,
527
- * otherwise they are `null`.
540
+ * The engine computes the bounding sphere once when it is needed. Must be
541
+ * recomputed when instances change.
528
542
  */
529
543
  computeBoundingSphere() {
530
544
 
@@ -1226,7 +1240,7 @@ class BatchedMesh extends Mesh {
1226
1240
 
1227
1241
  /**
1228
1242
  * Get the range representing the subset of triangles related to the attached geometry,
1229
- * indicating the starting offset and count, or `null` if invalid.
1243
+ * indicating the starting offset and count, or throws an error if invalid.
1230
1244
  *
1231
1245
  * @param {number} geometryId - The id of the geometry to get the range of.
1232
1246
  * @param {Object} [target] - The target object that is used to store the method's result.
@@ -1291,6 +1305,17 @@ class BatchedMesh extends Mesh {
1291
1305
 
1292
1306
  this._multiDrawCounts = multiDrawCounts;
1293
1307
  this._multiDrawStarts = multiDrawStarts;
1308
+
1309
+ const mergedDrawCounts = new Int32Array( maxInstanceCount );
1310
+ const mergedDrawStarts = new Int32Array( maxInstanceCount );
1311
+ const mergedDrawInstanceCounts = new Int32Array( maxInstanceCount );
1312
+ copyArrayContents( this._mergedDrawCounts, mergedDrawCounts );
1313
+ copyArrayContents( this._mergedDrawStarts, mergedDrawStarts );
1314
+ copyArrayContents( this._mergedDrawInstanceCounts, mergedDrawInstanceCounts );
1315
+
1316
+ this._mergedDrawCounts = mergedDrawCounts;
1317
+ this._mergedDrawStarts = mergedDrawStarts;
1318
+ this._mergedDrawInstanceCounts = mergedDrawInstanceCounts;
1294
1319
  this._maxInstanceCount = maxInstanceCount;
1295
1320
 
1296
1321
  // update texture data for instance sampling
@@ -1314,6 +1339,13 @@ class BatchedMesh extends Mesh {
1314
1339
 
1315
1340
  }
1316
1341
 
1342
+ if ( this._previousMatricesTexture !== null ) {
1343
+
1344
+ this._previousMatricesTexture.dispose();
1345
+ this._previousMatricesTexture = null;
1346
+
1347
+ }
1348
+
1317
1349
  }
1318
1350
 
1319
1351
  /**
@@ -1331,7 +1363,7 @@ class BatchedMesh extends Mesh {
1331
1363
  const requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );
1332
1364
  if ( requiredVertexLength > maxVertexCount ) {
1333
1365
 
1334
- throw new Error( `THREE.BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );
1366
+ throw new Error( `THREE.BatchedMesh: Geometry vertex values are being used outside the range ${ maxVertexCount }. Cannot shrink further.` );
1335
1367
 
1336
1368
  }
1337
1369
 
@@ -1379,6 +1411,8 @@ class BatchedMesh extends Mesh {
1379
1411
 
1380
1412
  }
1381
1413
 
1414
+ this._visibilityChanged = true;
1415
+
1382
1416
  }
1383
1417
 
1384
1418
  raycast( raycaster, intersects ) {
@@ -1476,6 +1510,9 @@ class BatchedMesh extends Mesh {
1476
1510
  this._multiDrawCounts = source._multiDrawCounts.slice();
1477
1511
  this._multiDrawStarts = source._multiDrawStarts.slice();
1478
1512
  this._multiDrawBytesPerElement = source._multiDrawBytesPerElement;
1513
+ this._mergedDrawCounts = source._mergedDrawCounts.slice();
1514
+ this._mergedDrawStarts = source._mergedDrawStarts.slice();
1515
+ this._mergedDrawInstanceCounts = source._mergedDrawInstanceCounts.slice();
1479
1516
 
1480
1517
  this._indirectTexture = source._indirectTexture.clone();
1481
1518
  this._indirectTexture.image.data = this._indirectTexture.image.data.slice();
@@ -1483,11 +1520,15 @@ class BatchedMesh extends Mesh {
1483
1520
  this._matricesTexture = source._matricesTexture.clone();
1484
1521
  this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
1485
1522
 
1486
- if ( this._colorsTexture !== null ) {
1523
+ if ( source._colorsTexture !== null ) {
1487
1524
 
1488
1525
  this._colorsTexture = source._colorsTexture.clone();
1489
1526
  this._colorsTexture.image.data = this._colorsTexture.image.data.slice();
1490
1527
 
1528
+ } else {
1529
+
1530
+ this._colorsTexture = null;
1531
+
1491
1532
  }
1492
1533
 
1493
1534
  return this;
@@ -1518,9 +1559,26 @@ class BatchedMesh extends Mesh {
1518
1559
 
1519
1560
  }
1520
1561
 
1562
+ if ( this._previousMatricesTexture !== null ) {
1563
+
1564
+ this._previousMatricesTexture.dispose();
1565
+ this._previousMatricesTexture = null;
1566
+
1567
+ }
1568
+
1521
1569
  }
1522
1570
 
1523
- onBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {
1571
+ /**
1572
+ * Updates the draw parameters for the next draw. Depending on {@link BatchedMesh#perObjectFrustumCulled}
1573
+ * and {@link BatchedMesh#sortObjects}, this includes per-object frustum culling and sorting.
1574
+ *
1575
+ * @private
1576
+ * @param {Camera} camera - The camera of the next draw.
1577
+ * @param {BufferGeometry} geometry - The batch's geometry.
1578
+ * @param {Material} material - The material of the next draw.
1579
+ * @param {('multiDraw'|'merged')} [drawFormat='multiDraw'] - The format of the draw parameters.
1580
+ */
1581
+ _updateDrawParameters( camera, geometry, material, drawFormat = 'multiDraw' ) {
1524
1582
 
1525
1583
  // if visibility has not changed and frustum culling and object sorting is not required
1526
1584
  // then skip iterating over all items
@@ -1550,6 +1608,9 @@ class BatchedMesh extends Mesh {
1550
1608
  const instanceInfo = this._instanceInfo;
1551
1609
  const multiDrawStarts = this._multiDrawStarts;
1552
1610
  const multiDrawCounts = this._multiDrawCounts;
1611
+ const mergedDrawStarts = this._mergedDrawStarts;
1612
+ const mergedDrawCounts = this._mergedDrawCounts;
1613
+ const mergedDrawInstanceCounts = this._mergedDrawInstanceCounts;
1553
1614
  const geometryInfoList = this._geometryInfo;
1554
1615
  const perObjectFrustumCulled = this.perObjectFrustumCulled;
1555
1616
  const indirectTexture = this._indirectTexture;
@@ -1580,11 +1641,12 @@ class BatchedMesh extends Mesh {
1580
1641
  }
1581
1642
 
1582
1643
  let multiDrawCount = 0;
1644
+ let mergedDrawCount = 0;
1583
1645
  if ( this.sortObjects ) {
1584
1646
 
1585
1647
  // get the camera position in the local frame
1586
1648
  _matrix.copy( this.matrixWorld ).invert();
1587
- _vector.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix );
1649
+ _cameraPosition.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix );
1588
1650
  _forward.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix );
1589
1651
 
1590
1652
  for ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {
@@ -1609,7 +1671,7 @@ class BatchedMesh extends Mesh {
1609
1671
 
1610
1672
  // get the distance from camera used for sorting
1611
1673
  const geometryInfo = geometryInfoList[ geometryId ];
1612
- const z = _temp.subVectors( _sphere.center, _vector ).dot( _forward );
1674
+ const z = _temp.subVectors( _sphere.center, _cameraPosition ).dot( _forward );
1613
1675
  _renderList.push( geometryInfo.start, geometryInfo.count, z, i );
1614
1676
 
1615
1677
  }
@@ -1634,8 +1696,31 @@ class BatchedMesh extends Mesh {
1634
1696
  for ( let i = 0, l = list.length; i < l; i ++ ) {
1635
1697
 
1636
1698
  const item = list[ i ];
1637
- multiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement * multiDrawMultiplier;
1638
- multiDrawCounts[ multiDrawCount ] = item.count * multiDrawMultiplier;
1699
+ const start = item.start * bytesPerElement * multiDrawMultiplier;
1700
+ const count = item.count * multiDrawMultiplier;
1701
+
1702
+ if ( drawFormat === 'merged' ) {
1703
+
1704
+ if ( mergedDrawCount > 0 && mergedDrawStarts[ mergedDrawCount - 1 ] === start && mergedDrawCounts[ mergedDrawCount - 1 ] === count ) {
1705
+
1706
+ mergedDrawInstanceCounts[ mergedDrawCount - 1 ] ++;
1707
+
1708
+ } else {
1709
+
1710
+ mergedDrawStarts[ mergedDrawCount ] = start;
1711
+ mergedDrawCounts[ mergedDrawCount ] = count;
1712
+ mergedDrawInstanceCounts[ mergedDrawCount ] = 1;
1713
+ mergedDrawCount ++;
1714
+
1715
+ }
1716
+
1717
+ } else {
1718
+
1719
+ multiDrawStarts[ multiDrawCount ] = start;
1720
+ multiDrawCounts[ multiDrawCount ] = count;
1721
+
1722
+ }
1723
+
1639
1724
  indirectArray[ multiDrawCount ] = item.index;
1640
1725
  multiDrawCount ++;
1641
1726
 
@@ -1665,8 +1750,31 @@ class BatchedMesh extends Mesh {
1665
1750
  if ( ! culled ) {
1666
1751
 
1667
1752
  const geometryInfo = geometryInfoList[ geometryId ];
1668
- multiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement * multiDrawMultiplier;
1669
- multiDrawCounts[ multiDrawCount ] = geometryInfo.count * multiDrawMultiplier;
1753
+ const start = geometryInfo.start * bytesPerElement * multiDrawMultiplier;
1754
+ const count = geometryInfo.count * multiDrawMultiplier;
1755
+
1756
+ if ( drawFormat === 'merged' ) {
1757
+
1758
+ if ( mergedDrawCount > 0 && mergedDrawStarts[ mergedDrawCount - 1 ] === start && mergedDrawCounts[ mergedDrawCount - 1 ] === count ) {
1759
+
1760
+ mergedDrawInstanceCounts[ mergedDrawCount - 1 ] ++;
1761
+
1762
+ } else {
1763
+
1764
+ mergedDrawStarts[ mergedDrawCount ] = start;
1765
+ mergedDrawCounts[ mergedDrawCount ] = count;
1766
+ mergedDrawInstanceCounts[ mergedDrawCount ] = 1;
1767
+ mergedDrawCount ++;
1768
+
1769
+ }
1770
+
1771
+ } else {
1772
+
1773
+ multiDrawStarts[ multiDrawCount ] = start;
1774
+ multiDrawCounts[ multiDrawCount ] = count;
1775
+
1776
+ }
1777
+
1670
1778
  indirectArray[ multiDrawCount ] = i;
1671
1779
  multiDrawCount ++;
1672
1780
 
@@ -1680,14 +1788,37 @@ class BatchedMesh extends Mesh {
1680
1788
 
1681
1789
  indirectTexture.needsUpdate = true;
1682
1790
  this._multiDrawCount = multiDrawCount;
1791
+ this._mergedDrawCount = mergedDrawCount;
1683
1792
  this._multiDrawBytesPerElement = bytesPerElement;
1684
1793
  this._visibilityChanged = false;
1685
1794
 
1686
1795
  }
1687
1796
 
1797
+ onBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {
1798
+
1799
+ if ( renderer.isWebGPURenderer === true ) {
1800
+
1801
+ if ( this._visibilityChanged || this.perObjectFrustumCulled || this.sortObjects ) {
1802
+
1803
+ this._indirectTexture.needsUpdate = true;
1804
+
1805
+ }
1806
+
1807
+ } else {
1808
+
1809
+ this._updateDrawParameters( camera, geometry, material );
1810
+
1811
+ }
1812
+
1813
+ }
1814
+
1688
1815
  onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {
1689
1816
 
1690
- this.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );
1817
+ if ( renderer.isWebGPURenderer !== true ) {
1818
+
1819
+ this._updateDrawParameters( shadowCamera, geometry, depthMaterial );
1820
+
1821
+ }
1691
1822
 
1692
1823
  }
1693
1824
 
@@ -185,13 +185,13 @@ class InstancedMesh extends Mesh {
185
185
 
186
186
  this.instanceMatrix.copy( source.instanceMatrix );
187
187
 
188
- if ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();
189
- if ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();
188
+ this.morphTexture = source.morphTexture !== null ? source.morphTexture.clone() : null;
189
+ this.instanceColor = source.instanceColor !== null ? source.instanceColor.clone() : null;
190
190
 
191
191
  this.count = source.count;
192
192
 
193
- if ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();
194
- if ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();
193
+ this.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;
194
+ this.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;
195
195
 
196
196
  return this;
197
197
 
@@ -397,6 +397,14 @@ class InstancedMesh extends Mesh {
397
397
 
398
398
  super.dispose();
399
399
 
400
+ this.instanceMatrix.dispose();
401
+
402
+ if ( this.instanceColor !== null ) {
403
+
404
+ this.instanceColor.dispose();
405
+
406
+ }
407
+
400
408
  if ( this.morphTexture !== null ) {
401
409
 
402
410
  this.morphTexture.dispose();
@@ -104,6 +104,26 @@ class Line extends Object3D {
104
104
 
105
105
  super.copy( source, recursive );
106
106
 
107
+ if ( source.morphTargetInfluences !== undefined ) {
108
+
109
+ this.morphTargetInfluences = source.morphTargetInfluences.slice();
110
+
111
+ } else {
112
+
113
+ this.morphTargetInfluences = undefined;
114
+
115
+ }
116
+
117
+ if ( source.morphTargetDictionary !== undefined ) {
118
+
119
+ this.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );
120
+
121
+ } else {
122
+
123
+ this.morphTargetDictionary = undefined;
124
+
125
+ }
126
+
107
127
  this.material = Array.isArray( source.material ) ? source.material.slice() : source.material;
108
128
  this.geometry = source.geometry;
109
129