super-three 0.171.0 → 0.173.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/build/three.cjs +594 -427
  4. package/build/three.core.js +515 -81
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +79 -350
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +20 -7
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +29362 -3427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +29361 -3427
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -5
  15. package/examples/jsm/animation/CCDIKSolver.js +9 -7
  16. package/examples/jsm/capabilities/WebGPU.js +1 -1
  17. package/examples/jsm/controls/ArcballControls.js +48 -37
  18. package/examples/jsm/controls/OrbitControls.js +5 -4
  19. package/examples/jsm/csm/CSMShadowNode.js +16 -11
  20. package/examples/jsm/curves/NURBSCurve.js +1 -1
  21. package/examples/jsm/curves/NURBSUtils.js +3 -0
  22. package/examples/jsm/effects/OutlineEffect.js +1 -1
  23. package/examples/jsm/exporters/GLTFExporter.js +34 -29
  24. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  25. package/examples/jsm/exporters/PLYExporter.js +2 -2
  26. package/examples/jsm/geometries/TextGeometry.js +1 -12
  27. package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
  28. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  29. package/examples/jsm/interactive/InteractiveGroup.js +108 -51
  30. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  31. package/examples/jsm/lights/LightProbeGenerator.js +3 -3
  32. package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
  33. package/examples/jsm/loaders/3MFLoader.js +6 -3
  34. package/examples/jsm/loaders/BVHLoader.js +1 -1
  35. package/examples/jsm/loaders/ColladaLoader.js +5 -5
  36. package/examples/jsm/loaders/DDSLoader.js +42 -0
  37. package/examples/jsm/loaders/GCodeLoader.js +4 -2
  38. package/examples/jsm/loaders/GLTFLoader.js +22 -4
  39. package/examples/jsm/loaders/KTX2Loader.js +6 -1
  40. package/examples/jsm/loaders/KTXLoader.js +4 -4
  41. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  42. package/examples/jsm/loaders/LottieLoader.js +1 -1
  43. package/examples/jsm/loaders/MTLLoader.js +1 -0
  44. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  45. package/examples/jsm/loaders/PLYLoader.js +7 -7
  46. package/examples/jsm/loaders/PVRLoader.js +1 -1
  47. package/examples/jsm/loaders/SVGLoader.js +2 -2
  48. package/examples/jsm/loaders/TDSLoader.js +1 -2
  49. package/examples/jsm/loaders/VRMLLoader.js +7 -7
  50. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  51. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
  52. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  53. package/examples/jsm/math/ConvexHull.js +1 -1
  54. package/examples/jsm/math/OBB.js +17 -0
  55. package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
  56. package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
  57. package/examples/jsm/misc/ProgressiveLightMapGPU.js +14 -13
  58. package/examples/jsm/misc/Volume.js +27 -17
  59. package/examples/jsm/misc/VolumeSlice.js +7 -5
  60. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  61. package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
  62. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  63. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  64. package/examples/jsm/objects/Sky.js +2 -2
  65. package/examples/jsm/objects/SkyMesh.js +3 -3
  66. package/examples/jsm/objects/Water2.js +1 -1
  67. package/examples/jsm/objects/Water2Mesh.js +2 -2
  68. package/examples/jsm/objects/WaterMesh.js +29 -24
  69. package/examples/jsm/physics/JoltPhysics.js +7 -7
  70. package/examples/jsm/physics/RapierPhysics.js +4 -4
  71. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  72. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  73. package/examples/jsm/postprocessing/OutlinePass.js +4 -4
  74. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  75. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  76. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  77. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  78. package/examples/jsm/postprocessing/SSRPass.js +2 -4
  79. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  80. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  81. package/examples/jsm/shaders/BokehShader2.js +1 -1
  82. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  83. package/examples/jsm/shaders/OutputShader.js +5 -1
  84. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  85. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  86. package/examples/jsm/transpiler/TSLEncoder.js +2 -0
  87. package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
  88. package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
  89. package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
  90. package/examples/jsm/tsl/display/BleachBypass.js +10 -0
  91. package/examples/jsm/tsl/display/BloomNode.js +233 -26
  92. package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
  93. package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
  94. package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
  95. package/examples/jsm/tsl/display/FXAANode.js +52 -3
  96. package/examples/jsm/tsl/display/FilmNode.js +47 -1
  97. package/examples/jsm/tsl/display/GTAONode.js +210 -14
  98. package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
  99. package/examples/jsm/tsl/display/LensflareNode.js +131 -13
  100. package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
  101. package/examples/jsm/tsl/display/MotionBlur.js +12 -2
  102. package/examples/jsm/tsl/display/OutlineNode.js +343 -26
  103. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
  104. package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
  105. package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
  106. package/examples/jsm/tsl/display/SMAANode.js +187 -46
  107. package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
  108. package/examples/jsm/tsl/display/SSRNode.js +194 -21
  109. package/examples/jsm/tsl/display/Sepia.js +9 -0
  110. package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
  111. package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
  112. package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
  113. package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
  114. package/examples/jsm/tsl/display/TransitionNode.js +71 -6
  115. package/examples/jsm/tsl/display/hashBlur.js +14 -3
  116. package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
  117. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  118. package/examples/jsm/utils/CameraUtils.js +4 -1
  119. package/examples/jsm/utils/GeometryUtils.js +22 -19
  120. package/examples/jsm/utils/SceneUtils.js +2 -2
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  122. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  123. package/package.json +8 -3
  124. package/src/Three.Core.js +4 -0
  125. package/src/Three.Legacy.js +0 -21
  126. package/src/Three.TSL.js +18 -5
  127. package/src/Three.WebGPU.Nodes.js +2 -2
  128. package/src/Three.WebGPU.js +2 -2
  129. package/src/animation/PropertyBinding.js +2 -2
  130. package/src/cameras/ArrayCamera.js +1 -0
  131. package/src/cameras/PerspectiveCamera.js +18 -2
  132. package/src/constants.js +6 -1
  133. package/src/core/BufferAttribute.js +4 -0
  134. package/src/core/EventDispatcher.js +8 -6
  135. package/src/core/RenderTarget.js +18 -0
  136. package/src/core/RenderTarget3D.js +22 -0
  137. package/src/core/RenderTargetArray.js +22 -0
  138. package/src/extras/Earcut.js +1 -1
  139. package/src/extras/ImageUtils.js +1 -11
  140. package/src/extras/PMREMGenerator.js +20 -0
  141. package/src/extras/TextureUtils.js +6 -0
  142. package/src/helpers/CameraHelper.js +16 -13
  143. package/src/loaders/nodes/NodeLoader.js +59 -0
  144. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  145. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  146. package/src/materials/nodes/Line2NodeMaterial.js +128 -34
  147. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  148. package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
  149. package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
  150. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  151. package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
  152. package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
  153. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  154. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
  155. package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
  156. package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
  157. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  158. package/src/materials/nodes/NodeMaterial.js +476 -23
  159. package/src/materials/nodes/NodeMaterials.js +0 -1
  160. package/src/materials/nodes/PointsNodeMaterial.js +121 -10
  161. package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
  162. package/src/materials/nodes/SpriteNodeMaterial.js +78 -20
  163. package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
  164. package/src/materials/nodes/manager/NodeMaterialObserver.js +95 -0
  165. package/src/nodes/Nodes.js +5 -6
  166. package/src/nodes/TSL.js +6 -3
  167. package/src/nodes/accessors/AccessorsUtils.js +27 -0
  168. package/src/nodes/accessors/Arrays.js +47 -6
  169. package/src/nodes/accessors/BatchNode.js +42 -6
  170. package/src/nodes/accessors/Bitangent.js +37 -0
  171. package/src/nodes/accessors/BufferAttributeNode.js +178 -5
  172. package/src/nodes/accessors/BufferNode.js +63 -0
  173. package/src/nodes/accessors/BuiltinNode.js +38 -0
  174. package/src/nodes/accessors/Camera.js +113 -3
  175. package/src/nodes/accessors/ClippingNode.js +71 -2
  176. package/src/nodes/accessors/CubeTextureNode.js +64 -0
  177. package/src/nodes/accessors/InstanceNode.js +85 -2
  178. package/src/nodes/accessors/InstancedMeshNode.js +28 -3
  179. package/src/nodes/accessors/Lights.js +50 -1
  180. package/src/nodes/accessors/MaterialNode.js +306 -12
  181. package/src/nodes/accessors/MaterialProperties.js +7 -0
  182. package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
  183. package/src/nodes/accessors/ModelNode.js +100 -5
  184. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
  185. package/src/nodes/accessors/MorphNode.js +48 -4
  186. package/src/nodes/accessors/Normal.js +65 -5
  187. package/src/nodes/accessors/Object3DNode.js +101 -1
  188. package/src/nodes/accessors/PointUVNode.js +26 -0
  189. package/src/nodes/accessors/Position.js +56 -7
  190. package/src/nodes/accessors/ReferenceBaseNode.js +186 -0
  191. package/src/nodes/accessors/ReferenceNode.js +201 -2
  192. package/src/nodes/accessors/ReflectVector.js +24 -0
  193. package/src/nodes/accessors/RendererReferenceNode.js +46 -1
  194. package/src/nodes/accessors/SceneNode.js +54 -0
  195. package/src/nodes/accessors/SkinningNode.js +127 -1
  196. package/src/nodes/accessors/StorageBufferNode.js +209 -8
  197. package/src/nodes/accessors/StorageTextureNode.js +118 -0
  198. package/src/nodes/accessors/Tangent.js +38 -2
  199. package/src/nodes/accessors/Texture3DNode.js +91 -7
  200. package/src/nodes/accessors/TextureBicubic.js +12 -2
  201. package/src/nodes/accessors/TextureNode.js +316 -10
  202. package/src/nodes/accessors/TextureSizeNode.js +42 -0
  203. package/src/nodes/accessors/UV.js +10 -1
  204. package/src/nodes/accessors/UniformArrayNode.js +231 -25
  205. package/src/nodes/accessors/UserDataNode.js +46 -0
  206. package/src/nodes/accessors/VelocityNode.js +80 -0
  207. package/src/nodes/accessors/VertexColorNode.js +39 -2
  208. package/src/nodes/code/CodeNode.js +95 -1
  209. package/src/nodes/code/ExpressionNode.js +28 -0
  210. package/src/nodes/code/FunctionCallNode.js +37 -0
  211. package/src/nodes/code/FunctionNode.js +45 -0
  212. package/src/nodes/code/ScriptableNode.js +223 -1
  213. package/src/nodes/code/ScriptableValueNode.js +85 -1
  214. package/src/nodes/core/ArrayNode.js +125 -0
  215. package/src/nodes/core/AssignNode.js +48 -2
  216. package/src/nodes/core/AttributeNode.js +43 -0
  217. package/src/nodes/core/BypassNode.js +47 -2
  218. package/src/nodes/core/CacheNode.js +53 -2
  219. package/src/nodes/core/ConstNode.js +32 -0
  220. package/src/nodes/core/ContextNode.js +65 -0
  221. package/src/nodes/core/IndexNode.js +68 -7
  222. package/src/nodes/core/InputNode.js +48 -0
  223. package/src/nodes/core/LightingModel.js +60 -0
  224. package/src/nodes/core/MRTNode.js +66 -0
  225. package/src/nodes/core/Node.js +350 -12
  226. package/src/nodes/core/NodeAttribute.js +38 -0
  227. package/src/nodes/core/NodeBuilder.js +1166 -26
  228. package/src/nodes/core/NodeCache.js +41 -2
  229. package/src/nodes/core/NodeCode.js +31 -0
  230. package/src/nodes/core/NodeFrame.js +123 -2
  231. package/src/nodes/core/NodeFunction.js +46 -0
  232. package/src/nodes/core/NodeFunctionInput.js +44 -0
  233. package/src/nodes/core/NodeParser.js +11 -0
  234. package/src/nodes/core/NodeUniform.js +52 -0
  235. package/src/nodes/core/NodeUtils.js +152 -1
  236. package/src/nodes/core/NodeVar.js +47 -1
  237. package/src/nodes/core/NodeVarying.js +28 -0
  238. package/src/nodes/core/OutputStructNode.js +51 -10
  239. package/src/nodes/core/ParameterNode.js +28 -0
  240. package/src/nodes/core/PropertyNode.js +232 -0
  241. package/src/nodes/core/StackNode.js +98 -1
  242. package/src/nodes/core/StructNode.js +121 -0
  243. package/src/nodes/core/StructType.js +13 -0
  244. package/src/nodes/core/StructTypeNode.js +105 -6
  245. package/src/nodes/core/TempNode.js +31 -5
  246. package/src/nodes/core/UniformGroupNode.js +82 -7
  247. package/src/nodes/core/UniformNode.js +66 -0
  248. package/src/nodes/core/VarNode.js +146 -7
  249. package/src/nodes/core/VaryingNode.js +100 -3
  250. package/src/nodes/core/constants.js +36 -0
  251. package/src/nodes/display/BlendModes.js +88 -1
  252. package/src/nodes/display/BumpMapNode.js +37 -0
  253. package/src/nodes/display/ColorAdjustment.js +53 -11
  254. package/src/nodes/display/ColorSpaceFunctions.js +16 -0
  255. package/src/nodes/display/ColorSpaceNode.js +82 -0
  256. package/src/nodes/display/FrontFacingNode.js +29 -0
  257. package/src/nodes/display/NormalMapNode.js +43 -0
  258. package/src/nodes/display/PassNode.js +300 -7
  259. package/src/nodes/display/PosterizeNode.js +33 -0
  260. package/src/nodes/display/RenderOutputNode.js +66 -1
  261. package/src/nodes/display/ScreenNode.js +96 -0
  262. package/src/nodes/display/ToneMappingFunctions.js +58 -10
  263. package/src/nodes/display/ToneMappingNode.js +55 -2
  264. package/src/nodes/display/ToonOutlinePassNode.js +73 -0
  265. package/src/nodes/display/ViewportDepthNode.js +122 -8
  266. package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
  267. package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
  268. package/src/nodes/display/ViewportTextureNode.js +57 -0
  269. package/src/nodes/fog/Fog.js +110 -0
  270. package/src/nodes/functions/BasicLightingModel.js +24 -0
  271. package/src/nodes/functions/PhongLightingModel.js +34 -2
  272. package/src/nodes/functions/PhysicalLightingModel.js +167 -8
  273. package/src/nodes/functions/ShadowMaskModel.js +23 -0
  274. package/src/nodes/functions/ToonLightingModel.js +20 -0
  275. package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
  276. package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
  277. package/src/nodes/geometry/RangeNode.js +54 -2
  278. package/src/nodes/gpgpu/AtomicFunctionNode.js +174 -2
  279. package/src/nodes/gpgpu/BarrierNode.js +47 -0
  280. package/src/nodes/gpgpu/ComputeBuiltinNode.js +134 -0
  281. package/src/nodes/gpgpu/ComputeNode.js +106 -2
  282. package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
  283. package/src/nodes/lighting/AONode.js +18 -0
  284. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  285. package/src/nodes/lighting/AnalyticLightNode.js +97 -2
  286. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  287. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  288. package/src/nodes/lighting/DirectionalLightNode.js +10 -0
  289. package/src/nodes/lighting/EnvironmentNode.js +18 -0
  290. package/src/nodes/lighting/HemisphereLightNode.js +31 -0
  291. package/src/nodes/lighting/IESSpotLightNode.js +11 -0
  292. package/src/nodes/lighting/IrradianceNode.js +17 -0
  293. package/src/nodes/lighting/LightProbeNode.js +20 -0
  294. package/src/nodes/lighting/LightUtils.js +12 -0
  295. package/src/nodes/lighting/LightingContextNode.js +48 -0
  296. package/src/nodes/lighting/LightingNode.js +15 -6
  297. package/src/nodes/lighting/LightsNode.js +132 -1
  298. package/src/nodes/lighting/PointLightNode.js +32 -1
  299. package/src/nodes/lighting/PointShadowNode.js +54 -1
  300. package/src/nodes/lighting/RectAreaLightNode.js +44 -6
  301. package/src/nodes/lighting/ShadowBaseNode.js +93 -0
  302. package/src/nodes/lighting/ShadowNode.js +241 -35
  303. package/src/nodes/lighting/SpotLightNode.js +43 -0
  304. package/src/nodes/math/ConditionalNode.js +78 -4
  305. package/src/nodes/math/Hash.js +9 -0
  306. package/src/nodes/math/MathNode.js +627 -11
  307. package/src/nodes/math/MathUtils.js +45 -1
  308. package/src/nodes/math/OperatorNode.js +329 -18
  309. package/src/nodes/math/TriNoise3D.js +18 -7
  310. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  311. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  312. package/src/nodes/pmrem/PMREMNode.js +133 -0
  313. package/src/nodes/pmrem/PMREMUtils.js +2 -2
  314. package/src/nodes/procedural/Checker.js +9 -0
  315. package/src/nodes/shapes/Shapes.js +33 -0
  316. package/src/nodes/tsl/TSLBase.js +3 -2
  317. package/src/nodes/tsl/TSLCore.js +22 -2
  318. package/src/nodes/utils/ArrayElementNode.js +39 -3
  319. package/src/nodes/utils/ConvertNode.js +31 -0
  320. package/src/nodes/utils/CubeMapNode.js +78 -0
  321. package/src/nodes/utils/Discard.js +16 -0
  322. package/src/nodes/utils/EquirectUVNode.js +31 -1
  323. package/src/nodes/utils/FlipNode.js +38 -0
  324. package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
  325. package/src/nodes/utils/JoinNode.js +25 -0
  326. package/src/nodes/utils/LoopNode.js +82 -2
  327. package/src/nodes/utils/MatcapUVNode.js +17 -0
  328. package/src/nodes/utils/MaxMipLevelNode.js +49 -0
  329. package/src/nodes/utils/MemberNode.js +68 -0
  330. package/src/nodes/utils/Oscillators.js +33 -0
  331. package/src/nodes/utils/Packing.js +17 -0
  332. package/src/nodes/utils/PostProcessingUtils.js +28 -23
  333. package/src/nodes/utils/RTTNode.js +123 -2
  334. package/src/nodes/utils/ReflectorNode.js +174 -4
  335. package/src/nodes/utils/RemapNode.js +79 -0
  336. package/src/nodes/utils/RotateNode.js +41 -0
  337. package/src/nodes/utils/SetNode.js +44 -1
  338. package/src/nodes/utils/SplitNode.js +55 -3
  339. package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
  340. package/src/nodes/utils/SpriteUtils.js +17 -0
  341. package/src/nodes/utils/StorageArrayElementNode.js +54 -0
  342. package/src/nodes/utils/Timer.js +40 -0
  343. package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
  344. package/src/nodes/utils/UVUtils.js +20 -0
  345. package/src/nodes/utils/ViewportUtils.js +13 -0
  346. package/src/objects/BatchedMesh.js +2 -3
  347. package/src/objects/ClippingGroup.js +49 -0
  348. package/src/objects/Line.js +6 -6
  349. package/src/renderers/WebGLRenderer.js +30 -4
  350. package/src/renderers/common/Animation.js +85 -0
  351. package/src/renderers/common/Attributes.js +36 -0
  352. package/src/renderers/common/Backend.js +502 -44
  353. package/src/renderers/common/Background.js +48 -1
  354. package/src/renderers/common/BindGroup.js +43 -0
  355. package/src/renderers/common/Binding.js +35 -0
  356. package/src/renderers/common/Bindings.js +93 -1
  357. package/src/renderers/common/Buffer.js +49 -0
  358. package/src/renderers/common/BufferUtils.js +27 -0
  359. package/src/renderers/common/BundleGroup.js +57 -0
  360. package/src/renderers/common/ChainMap.js +45 -6
  361. package/src/renderers/common/ClippingContext.js +108 -15
  362. package/src/renderers/common/Color4.js +40 -0
  363. package/src/renderers/common/ComputePipeline.js +24 -0
  364. package/src/renderers/common/CubeRenderTarget.js +13 -0
  365. package/src/renderers/common/DataMap.js +37 -1
  366. package/src/renderers/common/Geometries.js +91 -14
  367. package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
  368. package/src/renderers/common/Info.js +78 -35
  369. package/src/renderers/common/Lighting.js +34 -6
  370. package/src/renderers/common/Pipeline.js +22 -0
  371. package/src/renderers/common/Pipelines.js +148 -5
  372. package/src/renderers/common/PostProcessing.js +99 -11
  373. package/src/renderers/common/ProgrammableStage.js +60 -2
  374. package/src/renderers/common/QuadMesh.js +54 -5
  375. package/src/renderers/common/RenderBundle.js +14 -8
  376. package/src/renderers/common/RenderBundles.js +39 -10
  377. package/src/renderers/common/RenderContext.js +201 -2
  378. package/src/renderers/common/RenderContexts.js +59 -6
  379. package/src/renderers/common/RenderList.js +178 -0
  380. package/src/renderers/common/RenderLists.js +40 -3
  381. package/src/renderers/common/RenderObject.js +400 -17
  382. package/src/renderers/common/RenderObjects.js +103 -7
  383. package/src/renderers/common/RenderPipeline.js +24 -0
  384. package/src/renderers/common/Renderer.js +1170 -86
  385. package/src/renderers/common/RendererUtils.js +193 -0
  386. package/src/renderers/common/SampledTexture.js +120 -0
  387. package/src/renderers/common/Sampler.js +30 -0
  388. package/src/renderers/common/StorageBuffer.js +24 -0
  389. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  390. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  391. package/src/renderers/common/StorageTexture.js +38 -0
  392. package/src/renderers/common/Textures.js +97 -7
  393. package/src/renderers/common/TimestampQueryPool.js +39 -0
  394. package/src/renderers/common/Uniform.js +225 -3
  395. package/src/renderers/common/UniformBuffer.js +19 -0
  396. package/src/renderers/common/UniformsGroup.js +141 -2
  397. package/src/renderers/common/XRManager.js +1193 -0
  398. package/src/renderers/common/XRRenderTarget.js +74 -0
  399. package/src/renderers/common/extras/PMREMGenerator.js +76 -10
  400. package/src/renderers/common/nodes/NodeBuilderState.js +99 -5
  401. package/src/renderers/common/nodes/NodeLibrary.js +89 -0
  402. package/src/renderers/common/nodes/NodeSampledTexture.js +90 -2
  403. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  404. package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
  405. package/src/renderers/common/nodes/NodeUniform.js +243 -2
  406. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  407. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  408. package/src/renderers/common/nodes/Nodes.js +352 -78
  409. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  410. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  411. package/src/renderers/webgl/WebGLBackground.js +4 -0
  412. package/src/renderers/webgl-fallback/WebGLBackend.js +819 -116
  413. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -18
  414. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +58 -1
  415. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  416. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  417. package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
  418. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +168 -22
  419. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
  420. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
  421. package/src/renderers/webgpu/WebGPUBackend.js +578 -164
  422. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +36 -0
  423. package/src/renderers/webgpu/WebGPURenderer.js +36 -0
  424. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
  425. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
  426. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +674 -52
  427. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
  428. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  429. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +95 -14
  430. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +94 -1
  431. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
  432. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
  433. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +262 -18
  434. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
  435. package/src/renderers/webgpu/utils/WebGPUUtils.js +116 -4
  436. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  437. package/src/renderers/webxr/WebXRManager.js +19 -2
  438. package/src/textures/Data3DTexture.js +2 -2
  439. package/src/textures/Texture.js +4 -0
  440. package/src/textures/VideoFrameTexture.js +35 -0
  441. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
  442. package/examples/jsm/animation/MMDPhysics.js +0 -1408
  443. package/examples/jsm/exporters/MMDExporter.js +0 -223
  444. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
  445. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  446. package/examples/jsm/loaders/MMDLoader.js +0 -2298
  447. package/examples/jsm/objects/InstancedPoints.js +0 -19
  448. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  449. package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
  450. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
  451. package/src/nodes/core/UniformGroup.js +0 -13
  452. package/src/nodes/fog/FogExp2Node.js +0 -35
  453. package/src/nodes/fog/FogNode.js +0 -50
  454. package/src/nodes/fog/FogRangeNode.js +0 -36
  455. package/src/renderers/common/PostProcessingUtils.js +0 -86
@@ -1,4 +1,4 @@
1
- import { hashString } from '../../nodes/core/NodeUtils.js';
1
+ import { hash, hashString } from '../../nodes/core/NodeUtils.js';
2
2
 
3
3
  let _id = 0;
4
4
 
@@ -36,49 +36,264 @@ function getKeys( obj ) {
36
36
 
37
37
  }
38
38
 
39
- export default class RenderObject {
40
-
39
+ /**
40
+ * A render object is the renderer's representation of single entity that gets drawn
41
+ * with a draw command. There is no unique mapping of render objects to 3D objects in the
42
+ * scene since render objects also depend from the used material, the current render context
43
+ * and the current scene's lighting.
44
+ *
45
+ * In general, the basic process of the renderer is:
46
+ *
47
+ * - Analyze the 3D objects in the scene and generate render lists containing render items.
48
+ * - Process the render lists by calling one or more render commands for each render item.
49
+ * - For each render command, request a render object and perform the draw.
50
+ *
51
+ * The module provides an interface to get data required for the draw command like the actual
52
+ * draw parameters or vertex buffers. It also holds a series of caching related methods since
53
+ * creating render objects should only be done when necessary.
54
+ *
55
+ * @private
56
+ */
57
+ class RenderObject {
58
+
59
+ /**
60
+ * Constructs a new render object.
61
+ *
62
+ * @param {Nodes} nodes - Renderer component for managing nodes related logic.
63
+ * @param {Geometries} geometries - Renderer component for managing geometries.
64
+ * @param {Renderer} renderer - The renderer.
65
+ * @param {Object3D} object - The 3D object.
66
+ * @param {Material} material - The 3D object's material.
67
+ * @param {Scene} scene - The scene the 3D object belongs to.
68
+ * @param {Camera} camera - The camera the object should be rendered with.
69
+ * @param {LightsNode} lightsNode - The lights node.
70
+ * @param {RenderContext} renderContext - The render context.
71
+ * @param {ClippingContext} clippingContext - The clipping context.
72
+ */
41
73
  constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext ) {
42
74
 
75
+ this.id = _id ++;
76
+
77
+ /**
78
+ * Renderer component for managing nodes related logic.
79
+ *
80
+ * @type {Nodes}
81
+ * @private
82
+ */
43
83
  this._nodes = nodes;
44
- this._geometries = geometries;
45
84
 
46
- this.id = _id ++;
85
+ /**
86
+ * Renderer component for managing geometries.
87
+ *
88
+ * @type {Geometries}
89
+ * @private
90
+ */
91
+ this._geometries = geometries;
47
92
 
93
+ /**
94
+ * The renderer.
95
+ *
96
+ * @type {Renderer}
97
+ */
48
98
  this.renderer = renderer;
99
+
100
+ /**
101
+ * The 3D object.
102
+ *
103
+ * @type {Object3D}
104
+ */
49
105
  this.object = object;
106
+
107
+ /**
108
+ * The 3D object's material.
109
+ *
110
+ * @type {Material}
111
+ */
50
112
  this.material = material;
113
+
114
+ /**
115
+ * The scene the 3D object belongs to.
116
+ *
117
+ * @type {Scene}
118
+ */
51
119
  this.scene = scene;
120
+
121
+ /**
122
+ * The camera the 3D object should be rendered with.
123
+ *
124
+ * @type {Camera}
125
+ */
52
126
  this.camera = camera;
127
+
128
+ /**
129
+ * The lights node.
130
+ *
131
+ * @type {LightsNode}
132
+ */
53
133
  this.lightsNode = lightsNode;
134
+
135
+ /**
136
+ * The render context.
137
+ *
138
+ * @type {RenderContext}
139
+ */
54
140
  this.context = renderContext;
55
141
 
142
+ /**
143
+ * The 3D object's geometry.
144
+ *
145
+ * @type {BufferGeometry}
146
+ */
56
147
  this.geometry = object.geometry;
148
+
149
+ /**
150
+ * The render object's version.
151
+ *
152
+ * @type {Number}
153
+ */
57
154
  this.version = material.version;
58
155
 
156
+ /**
157
+ * The draw range of the geometry.
158
+ *
159
+ * @type {Object?}
160
+ * @default null
161
+ */
59
162
  this.drawRange = null;
60
163
 
164
+ /**
165
+ * An array holding the buffer attributes
166
+ * of the render object. This entails attribute
167
+ * definitions on geometry and node level.
168
+ *
169
+ * @type {Array<BufferAttribute>?}
170
+ * @default null
171
+ */
61
172
  this.attributes = null;
173
+
174
+ /**
175
+ * A reference to a render pipeline the render
176
+ * object is processed with.
177
+ *
178
+ * @type {RenderPipeline}
179
+ * @default null
180
+ */
62
181
  this.pipeline = null;
182
+
183
+ /**
184
+ * Only relevant for objects using
185
+ * multiple materials. This represents a group entry
186
+ * from the respective `BufferGeometry`.
187
+ *
188
+ * @type {{start: Number, count: Number}?}
189
+ * @default null
190
+ */
191
+ this.group = null;
192
+
193
+ /**
194
+ * An array holding the vertex buffers which can
195
+ * be buffer attributes but also interleaved buffers.
196
+ *
197
+ * @type {Array<BufferAttribute|InterleavedBuffer>?}
198
+ * @default null
199
+ */
63
200
  this.vertexBuffers = null;
201
+
202
+ /**
203
+ * The parameters for the draw command.
204
+ *
205
+ * @type {Object?}
206
+ * @default null
207
+ */
64
208
  this.drawParams = null;
65
209
 
210
+ /**
211
+ * If this render object is used inside a render bundle,
212
+ * this property points to the respective bundle group.
213
+ *
214
+ * @type {BundleGroup?}
215
+ * @default null
216
+ */
66
217
  this.bundle = null;
67
218
 
219
+ /**
220
+ * The clipping context.
221
+ *
222
+ * @type {ClippingContext}
223
+ */
68
224
  this.clippingContext = clippingContext;
225
+
226
+ /**
227
+ * The clipping context's cache key.
228
+ *
229
+ * @type {String}
230
+ */
69
231
  this.clippingContextCacheKey = clippingContext !== null ? clippingContext.cacheKey : '';
70
232
 
233
+ /**
234
+ * The initial node cache key.
235
+ *
236
+ * @type {Number}
237
+ */
71
238
  this.initialNodesCacheKey = this.getDynamicCacheKey();
239
+
240
+ /**
241
+ * The initial cache key.
242
+ *
243
+ * @type {Number}
244
+ */
72
245
  this.initialCacheKey = this.getCacheKey();
73
246
 
247
+ /**
248
+ * The node builder state.
249
+ *
250
+ * @type {NodeBuilderState?}
251
+ * @private
252
+ * @default null
253
+ */
74
254
  this._nodeBuilderState = null;
255
+
256
+ /**
257
+ * An array of bindings.
258
+ *
259
+ * @type {Array<BindGroup>?}
260
+ * @private
261
+ * @default null
262
+ */
75
263
  this._bindings = null;
264
+
265
+ /**
266
+ * Reference to the node material observer.
267
+ *
268
+ * @type {NodeMaterialObserver?}
269
+ * @private
270
+ * @default null
271
+ */
76
272
  this._monitor = null;
77
273
 
274
+ /**
275
+ * An event listener which is defined by `RenderObjects`. It performs
276
+ * clean up tasks when `dispose()` on this render object.
277
+ *
278
+ * @method
279
+ */
78
280
  this.onDispose = null;
79
281
 
282
+ /**
283
+ * This flag can be used for type testing.
284
+ *
285
+ * @type {Boolean}
286
+ * @readonly
287
+ * @default true
288
+ */
80
289
  this.isRenderObject = true;
81
290
 
291
+ /**
292
+ * An event listener which is executed when `dispose()` is called on
293
+ * the render object's material.
294
+ *
295
+ * @method
296
+ */
82
297
  this.onMaterialDispose = () => {
83
298
 
84
299
  this.dispose();
@@ -89,12 +304,23 @@ export default class RenderObject {
89
304
 
90
305
  }
91
306
 
92
- updateClipping( parent ) {
307
+ /**
308
+ * Updates the clipping context.
309
+ *
310
+ * @param {ClippingContext} context - The clipping context to set.
311
+ */
312
+ updateClipping( context ) {
93
313
 
94
- this.clippingContext = parent;
314
+ this.clippingContext = context;
95
315
 
96
316
  }
97
317
 
318
+ /**
319
+ * Whether the clipping requires an update or not.
320
+ *
321
+ * @type {Boolean}
322
+ * @readonly
323
+ */
98
324
  get clippingNeedsUpdate() {
99
325
 
100
326
  if ( this.clippingContext === null || this.clippingContext.cacheKey === this.clippingContextCacheKey ) return false;
@@ -105,48 +331,110 @@ export default class RenderObject {
105
331
 
106
332
  }
107
333
 
334
+ /**
335
+ * The number of clipping planes defined in context of hardware clipping.
336
+ *
337
+ * @type {Number}
338
+ * @readonly
339
+ */
108
340
  get hardwareClippingPlanes() {
109
341
 
110
342
  return this.material.hardwareClipping === true ? this.clippingContext.unionClippingCount : 0;
111
343
 
112
344
  }
113
345
 
346
+ /**
347
+ * Returns the node builder state of this render object.
348
+ *
349
+ * @return {NodeBuilderState} The node builder state.
350
+ */
114
351
  getNodeBuilderState() {
115
352
 
116
353
  return this._nodeBuilderState || ( this._nodeBuilderState = this._nodes.getForRender( this ) );
117
354
 
118
355
  }
119
356
 
357
+ /**
358
+ * Returns the node material observer of this render object.
359
+ *
360
+ * @return {NodeMaterialObserver} The node material observer.
361
+ */
120
362
  getMonitor() {
121
363
 
122
- return this._monitor || ( this._monitor = this.getNodeBuilderState().monitor );
364
+ return this._monitor || ( this._monitor = this.getNodeBuilderState().observer );
123
365
 
124
366
  }
125
367
 
368
+ /**
369
+ * Returns an array of bind groups of this render object.
370
+ *
371
+ * @return {Array<BindGroup>} The bindings.
372
+ */
126
373
  getBindings() {
127
374
 
128
375
  return this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings() );
129
376
 
130
377
  }
131
378
 
379
+ /**
380
+ * Returns a binding group by group name of this render object.
381
+ *
382
+ * @param {String} name - The name of the binding group.
383
+ * @return {BindGroup?} The bindings.
384
+ */
385
+ getBindingGroup( name ) {
386
+
387
+ for ( const bindingGroup of this.getBindings() ) {
388
+
389
+ if ( bindingGroup.name === name ) {
390
+
391
+ return bindingGroup;
392
+
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+
399
+ /**
400
+ * Returns the index of the render object's geometry.
401
+ *
402
+ * @return {BufferAttribute?} The index. Returns `null` for non-indexed geometries.
403
+ */
132
404
  getIndex() {
133
405
 
134
406
  return this._geometries.getIndex( this );
135
407
 
136
408
  }
137
409
 
410
+ /**
411
+ * Returns the indirect buffer attribute.
412
+ *
413
+ * @return {BufferAttribute?} The indirect attribute. `null` if no indirect drawing is used.
414
+ */
138
415
  getIndirect() {
139
416
 
140
417
  return this._geometries.getIndirect( this );
141
418
 
142
419
  }
143
420
 
421
+ /**
422
+ * Returns an array that acts as a key for identifying the render object in a chain map.
423
+ *
424
+ * @return {Array<Object>} An array with object references.
425
+ */
144
426
  getChainArray() {
145
427
 
146
428
  return [ this.object, this.material, this.context, this.lightsNode ];
147
429
 
148
430
  }
149
431
 
432
+ /**
433
+ * This method is used when the geometry of a 3D object has been exchanged and the
434
+ * respective render object now requires an update.
435
+ *
436
+ * @param {BufferGeometry} geometry - The geometry to set.
437
+ */
150
438
  setGeometry( geometry ) {
151
439
 
152
440
  this.geometry = geometry;
@@ -154,6 +442,12 @@ export default class RenderObject {
154
442
 
155
443
  }
156
444
 
445
+ /**
446
+ * Returns the buffer attributes of the render object. The returned array holds
447
+ * attribute definitions on geometry and node level.
448
+ *
449
+ * @return {Array<BufferAttribute>} An array with buffer attributes.
450
+ */
157
451
  getAttributes() {
158
452
 
159
453
  if ( this.attributes !== null ) return this.attributes;
@@ -184,6 +478,11 @@ export default class RenderObject {
184
478
 
185
479
  }
186
480
 
481
+ /**
482
+ * Returns the vertex buffers of the render object.
483
+ *
484
+ * @return {Array<BufferAttribute|InterleavedBuffer>} An array with buffer attribute or interleaved buffers.
485
+ */
187
486
  getVertexBuffers() {
188
487
 
189
488
  if ( this.vertexBuffers === null ) this.getAttributes();
@@ -192,6 +491,11 @@ export default class RenderObject {
192
491
 
193
492
  }
194
493
 
494
+ /**
495
+ * Returns the draw parameters for the render object.
496
+ *
497
+ * @return {{vertexCount: Number, firstVertex: Number, instanceCount: Number, firstInstance: Number}} The draw parameters.
498
+ */
195
499
  getDrawParameters() {
196
500
 
197
501
  const { object, material, geometry, group, drawRange } = this;
@@ -258,6 +562,13 @@ export default class RenderObject {
258
562
 
259
563
  }
260
564
 
565
+ /**
566
+ * Returns the render object's geometry cache key.
567
+ *
568
+ * The geometry cache key is part of the material cache key.
569
+ *
570
+ * @return {String} The geometry cache key.
571
+ */
261
572
  getGeometryCacheKey() {
262
573
 
263
574
  const { geometry } = this;
@@ -277,6 +588,26 @@ export default class RenderObject {
277
588
 
278
589
  }
279
590
 
591
+ // structural equality isn't sufficient for morph targets since the
592
+ // data are maintained in textures. only if the targets are all equal
593
+ // the texture and thus the instance of `MorphNode` can be shared.
594
+
595
+ for ( const name of Object.keys( geometry.morphAttributes ).sort() ) {
596
+
597
+ const targets = geometry.morphAttributes[ name ];
598
+
599
+ cacheKey += 'morph-' + name + ',';
600
+
601
+ for ( let i = 0, l = targets.length; i < l; i ++ ) {
602
+
603
+ const attribute = targets[ i ];
604
+
605
+ cacheKey += attribute.id + ',';
606
+
607
+ }
608
+
609
+ }
610
+
280
611
  if ( geometry.index ) {
281
612
 
282
613
  cacheKey += 'index,';
@@ -287,6 +618,13 @@ export default class RenderObject {
287
618
 
288
619
  }
289
620
 
621
+ /**
622
+ * Returns the render object's material cache key.
623
+ *
624
+ * The material cache key is part of the render object cache key.
625
+ *
626
+ * @return {Number} The material cache key.
627
+ */
290
628
  getMaterialCacheKey() {
291
629
 
292
630
  const { object, material } = this;
@@ -353,12 +691,6 @@ export default class RenderObject {
353
691
 
354
692
  }
355
693
 
356
- if ( object.morphTargetInfluences ) {
357
-
358
- cacheKey += object.morphTargetInfluences.length + ',';
359
-
360
- }
361
-
362
694
  if ( object.isBatchedMesh ) {
363
695
 
364
696
  cacheKey += object._matricesTexture.uuid + ',';
@@ -385,27 +717,68 @@ export default class RenderObject {
385
717
 
386
718
  }
387
719
 
720
+ /**
721
+ * Whether the geometry requires an update or not.
722
+ *
723
+ * @type {Boolean}
724
+ * @readonly
725
+ */
388
726
  get needsGeometryUpdate() {
389
727
 
390
728
  return this.geometry.id !== this.object.geometry.id;
391
729
 
392
730
  }
393
731
 
732
+ /**
733
+ * Whether the render object requires an update or not.
734
+ *
735
+ * Note: There are two distinct places where render objects are checked for an update.
736
+ *
737
+ * 1. In `RenderObjects.get()` which is executed when the render object is request. This
738
+ * method checks the `needsUpdate` flag and recreates the render object if necessary.
739
+ * 2. In `Renderer._renderObjectDirect()` right after getting the render object via
740
+ * `RenderObjects.get()`. The render object's NodeMaterialObserver is then used to detect
741
+ * a need for a refresh due to material, geometry or object related value changes.
742
+ *
743
+ * TODO: Investigate if it's possible to merge both steps so there is only a single place
744
+ * that performs the 'needsUpdate' check.
745
+ *
746
+ * @type {Boolean}
747
+ * @readonly
748
+ */
394
749
  get needsUpdate() {
395
750
 
396
751
  return /*this.object.static !== true &&*/ ( this.initialNodesCacheKey !== this.getDynamicCacheKey() || this.clippingNeedsUpdate );
397
752
 
398
753
  }
399
754
 
755
+ /**
756
+ * Returns the dynamic cache key which represents a key that is computed per draw command.
757
+ *
758
+ * @return {Number} The cache key.
759
+ */
400
760
  getDynamicCacheKey() {
401
761
 
402
- // Environment Nodes Cache Key
762
+ let cacheKey = 0;
403
763
 
404
- let cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
764
+ // `Nodes.getCacheKey()` returns an environment cache key which is not relevant when
765
+ // the renderer is inside a shadow pass.
766
+
767
+ if ( this.material.isShadowPassMaterial !== true ) {
768
+
769
+ cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
770
+
771
+ }
772
+
773
+ if ( this.camera.isArrayCamera ) {
774
+
775
+ cacheKey = hash( cacheKey, this.camera.cameras.length );
776
+
777
+ }
405
778
 
406
779
  if ( this.object.receiveShadow ) {
407
780
 
408
- cacheKey += 1;
781
+ cacheKey = hash( cacheKey, 1 );
409
782
 
410
783
  }
411
784
 
@@ -413,12 +786,20 @@ export default class RenderObject {
413
786
 
414
787
  }
415
788
 
789
+ /**
790
+ * Returns the render object's cache key.
791
+ *
792
+ * @return {Number} The cache key.
793
+ */
416
794
  getCacheKey() {
417
795
 
418
796
  return this.getMaterialCacheKey() + this.getDynamicCacheKey();
419
797
 
420
798
  }
421
799
 
800
+ /**
801
+ * Frees internal resources.
802
+ */
422
803
  dispose() {
423
804
 
424
805
  this.material.removeEventListener( 'dispose', this.onMaterialDispose );
@@ -428,3 +809,5 @@ export default class RenderObject {
428
809
  }
429
810
 
430
811
  }
812
+
813
+ export default RenderObject;