super-three 0.170.1 → 0.172.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 (413) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +157 -49
  3. package/build/three.core.js +104 -42
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +53 -8
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +10 -5
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +21191 -1008
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +21189 -1008
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -5
  14. package/examples/jsm/animation/CCDIKSolver.js +3 -2
  15. package/examples/jsm/controls/ArcballControls.js +28 -19
  16. package/examples/jsm/controls/OrbitControls.js +5 -4
  17. package/examples/jsm/csm/CSMShadowNode.js +16 -11
  18. package/examples/jsm/curves/NURBSCurve.js +1 -1
  19. package/examples/jsm/curves/NURBSUtils.js +3 -0
  20. package/examples/jsm/effects/OutlineEffect.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +11 -7
  22. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  23. package/examples/jsm/exporters/PLYExporter.js +2 -2
  24. package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
  25. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  26. package/examples/jsm/lights/LightProbeGenerator.js +3 -3
  27. package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
  28. package/examples/jsm/loaders/3MFLoader.js +6 -3
  29. package/examples/jsm/loaders/BVHLoader.js +1 -1
  30. package/examples/jsm/loaders/ColladaLoader.js +5 -5
  31. package/examples/jsm/loaders/DDSLoader.js +42 -0
  32. package/examples/jsm/loaders/GCodeLoader.js +1 -1
  33. package/examples/jsm/loaders/GLTFLoader.js +22 -2
  34. package/examples/jsm/loaders/KTX2Loader.js +6 -1
  35. package/examples/jsm/loaders/KTXLoader.js +4 -4
  36. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  37. package/examples/jsm/loaders/LottieLoader.js +1 -1
  38. package/examples/jsm/loaders/MTLLoader.js +1 -0
  39. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  40. package/examples/jsm/loaders/PLYLoader.js +7 -7
  41. package/examples/jsm/loaders/PVRLoader.js +1 -1
  42. package/examples/jsm/loaders/SVGLoader.js +2 -2
  43. package/examples/jsm/loaders/TDSLoader.js +1 -1
  44. package/examples/jsm/loaders/VRMLLoader.js +7 -7
  45. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  46. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
  47. package/examples/jsm/math/ConvexHull.js +1 -1
  48. package/examples/jsm/math/OBB.js +17 -0
  49. package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
  50. package/examples/jsm/misc/Volume.js +20 -12
  51. package/examples/jsm/misc/VolumeSlice.js +2 -2
  52. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  53. package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
  54. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  55. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  56. package/examples/jsm/objects/Sky.js +2 -2
  57. package/examples/jsm/objects/SkyMesh.js +3 -3
  58. package/examples/jsm/objects/Water2.js +1 -1
  59. package/examples/jsm/objects/Water2Mesh.js +2 -2
  60. package/examples/jsm/objects/WaterMesh.js +4 -4
  61. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  62. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  63. package/examples/jsm/postprocessing/OutlinePass.js +4 -4
  64. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  65. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  66. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  67. package/examples/jsm/postprocessing/SSRPass.js +2 -4
  68. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  70. package/examples/jsm/shaders/BokehShader2.js +1 -1
  71. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  72. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  73. package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
  74. package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
  75. package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
  76. package/examples/jsm/tsl/display/BleachBypass.js +10 -0
  77. package/examples/jsm/tsl/display/BloomNode.js +233 -26
  78. package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
  79. package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
  80. package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
  81. package/examples/jsm/tsl/display/FXAANode.js +52 -3
  82. package/examples/jsm/tsl/display/FilmNode.js +47 -1
  83. package/examples/jsm/tsl/display/GTAONode.js +210 -14
  84. package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
  85. package/examples/jsm/tsl/display/LensflareNode.js +131 -13
  86. package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
  87. package/examples/jsm/tsl/display/MotionBlur.js +12 -2
  88. package/examples/jsm/tsl/display/OutlineNode.js +343 -26
  89. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
  90. package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
  91. package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
  92. package/examples/jsm/tsl/display/SMAANode.js +187 -46
  93. package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
  94. package/examples/jsm/tsl/display/SSRNode.js +194 -21
  95. package/examples/jsm/tsl/display/Sepia.js +9 -0
  96. package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
  97. package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
  98. package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
  99. package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
  100. package/examples/jsm/tsl/display/TransitionNode.js +71 -6
  101. package/examples/jsm/tsl/display/hashBlur.js +14 -3
  102. package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
  103. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  104. package/examples/jsm/utils/CameraUtils.js +4 -1
  105. package/examples/jsm/utils/GeometryUtils.js +22 -19
  106. package/examples/jsm/utils/SceneUtils.js +2 -2
  107. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  108. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  109. package/package.json +8 -3
  110. package/src/Three.Core.js +2 -0
  111. package/src/Three.Legacy.js +0 -21
  112. package/src/Three.TSL.js +9 -4
  113. package/src/Three.WebGPU.Nodes.js +2 -2
  114. package/src/Three.WebGPU.js +2 -2
  115. package/src/animation/PropertyBinding.js +2 -2
  116. package/src/cameras/PerspectiveCamera.js +18 -2
  117. package/src/constants.js +1 -1
  118. package/src/core/RenderTarget.js +18 -0
  119. package/src/core/RenderTarget3D.js +22 -0
  120. package/src/core/RenderTargetArray.js +22 -0
  121. package/src/extras/Earcut.js +1 -1
  122. package/src/extras/PMREMGenerator.js +20 -0
  123. package/src/extras/TextureUtils.js +6 -0
  124. package/src/helpers/CameraHelper.js +16 -13
  125. package/src/loaders/nodes/NodeLoader.js +59 -0
  126. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  127. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  128. package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
  129. package/src/materials/nodes/Line2NodeMaterial.js +128 -34
  130. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  131. package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
  132. package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
  133. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  134. package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
  135. package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
  136. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  137. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
  138. package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
  139. package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
  140. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  141. package/src/materials/nodes/NodeMaterial.js +474 -21
  142. package/src/materials/nodes/PointsNodeMaterial.js +22 -13
  143. package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
  144. package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
  145. package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
  146. package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
  147. package/src/nodes/Nodes.js +1 -6
  148. package/src/nodes/TSL.js +2 -3
  149. package/src/nodes/accessors/AccessorsUtils.js +27 -0
  150. package/src/nodes/accessors/Arrays.js +24 -5
  151. package/src/nodes/accessors/BatchNode.js +39 -3
  152. package/src/nodes/accessors/Bitangent.js +37 -0
  153. package/src/nodes/accessors/BufferAttributeNode.js +178 -5
  154. package/src/nodes/accessors/BufferNode.js +63 -0
  155. package/src/nodes/accessors/BuiltinNode.js +38 -0
  156. package/src/nodes/accessors/Camera.js +49 -0
  157. package/src/nodes/accessors/ClippingNode.js +71 -2
  158. package/src/nodes/accessors/CubeTextureNode.js +64 -0
  159. package/src/nodes/accessors/InstanceNode.js +85 -2
  160. package/src/nodes/accessors/InstancedMeshNode.js +28 -3
  161. package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
  162. package/src/nodes/accessors/Lights.js +50 -1
  163. package/src/nodes/accessors/MaterialNode.js +302 -8
  164. package/src/nodes/accessors/MaterialProperties.js +7 -0
  165. package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
  166. package/src/nodes/accessors/ModelNode.js +100 -5
  167. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
  168. package/src/nodes/accessors/MorphNode.js +48 -4
  169. package/src/nodes/accessors/Normal.js +59 -3
  170. package/src/nodes/accessors/Object3DNode.js +102 -1
  171. package/src/nodes/accessors/PointUVNode.js +26 -0
  172. package/src/nodes/accessors/Position.js +53 -4
  173. package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
  174. package/src/nodes/accessors/ReferenceNode.js +202 -2
  175. package/src/nodes/accessors/ReflectVector.js +24 -0
  176. package/src/nodes/accessors/RendererReferenceNode.js +46 -1
  177. package/src/nodes/accessors/SceneNode.js +54 -0
  178. package/src/nodes/accessors/SkinningNode.js +127 -1
  179. package/src/nodes/accessors/StorageBufferNode.js +168 -4
  180. package/src/nodes/accessors/StorageTextureNode.js +118 -0
  181. package/src/nodes/accessors/Tangent.js +36 -0
  182. package/src/nodes/accessors/Texture3DNode.js +89 -5
  183. package/src/nodes/accessors/TextureBicubic.js +12 -2
  184. package/src/nodes/accessors/TextureNode.js +309 -10
  185. package/src/nodes/accessors/TextureSizeNode.js +42 -0
  186. package/src/nodes/accessors/UV.js +10 -1
  187. package/src/nodes/accessors/UniformArrayNode.js +223 -23
  188. package/src/nodes/accessors/UserDataNode.js +46 -0
  189. package/src/nodes/accessors/VelocityNode.js +82 -0
  190. package/src/nodes/accessors/VertexColorNode.js +39 -2
  191. package/src/nodes/code/CodeNode.js +95 -1
  192. package/src/nodes/code/ExpressionNode.js +28 -0
  193. package/src/nodes/code/FunctionCallNode.js +37 -0
  194. package/src/nodes/code/FunctionNode.js +45 -0
  195. package/src/nodes/code/ScriptableNode.js +223 -1
  196. package/src/nodes/code/ScriptableValueNode.js +85 -1
  197. package/src/nodes/core/AssignNode.js +48 -2
  198. package/src/nodes/core/AttributeNode.js +43 -0
  199. package/src/nodes/core/BypassNode.js +47 -2
  200. package/src/nodes/core/CacheNode.js +53 -2
  201. package/src/nodes/core/ConstNode.js +24 -0
  202. package/src/nodes/core/ContextNode.js +65 -0
  203. package/src/nodes/core/IndexNode.js +68 -7
  204. package/src/nodes/core/InputNode.js +48 -0
  205. package/src/nodes/core/LightingModel.js +60 -0
  206. package/src/nodes/core/MRTNode.js +66 -0
  207. package/src/nodes/core/Node.js +337 -12
  208. package/src/nodes/core/NodeAttribute.js +38 -0
  209. package/src/nodes/core/NodeBuilder.js +945 -15
  210. package/src/nodes/core/NodeCache.js +41 -2
  211. package/src/nodes/core/NodeCode.js +31 -0
  212. package/src/nodes/core/NodeFrame.js +123 -2
  213. package/src/nodes/core/NodeFunction.js +46 -0
  214. package/src/nodes/core/NodeFunctionInput.js +44 -0
  215. package/src/nodes/core/NodeParser.js +11 -0
  216. package/src/nodes/core/NodeUniform.js +52 -0
  217. package/src/nodes/core/NodeUtils.js +141 -0
  218. package/src/nodes/core/NodeVar.js +30 -0
  219. package/src/nodes/core/NodeVarying.js +28 -0
  220. package/src/nodes/core/OutputStructNode.js +33 -2
  221. package/src/nodes/core/ParameterNode.js +28 -0
  222. package/src/nodes/core/PropertyNode.js +232 -0
  223. package/src/nodes/core/StackNode.js +78 -0
  224. package/src/nodes/core/StructTypeNode.js +39 -1
  225. package/src/nodes/core/TempNode.js +30 -4
  226. package/src/nodes/core/UniformGroupNode.js +82 -7
  227. package/src/nodes/core/UniformNode.js +66 -0
  228. package/src/nodes/core/VarNode.js +52 -0
  229. package/src/nodes/core/VaryingNode.js +83 -2
  230. package/src/nodes/core/constants.js +36 -0
  231. package/src/nodes/display/BumpMapNode.js +37 -0
  232. package/src/nodes/display/ColorAdjustment.js +53 -11
  233. package/src/nodes/display/ColorSpaceFunctions.js +16 -0
  234. package/src/nodes/display/ColorSpaceNode.js +82 -0
  235. package/src/nodes/display/FrontFacingNode.js +29 -0
  236. package/src/nodes/display/NormalMapNode.js +43 -0
  237. package/src/nodes/display/PassNode.js +298 -7
  238. package/src/nodes/display/PosterizeNode.js +33 -0
  239. package/src/nodes/display/RenderOutputNode.js +66 -1
  240. package/src/nodes/display/ScreenNode.js +87 -0
  241. package/src/nodes/display/ToneMappingFunctions.js +58 -10
  242. package/src/nodes/display/ToneMappingNode.js +55 -2
  243. package/src/nodes/display/ToonOutlinePassNode.js +73 -0
  244. package/src/nodes/display/ViewportDepthNode.js +122 -8
  245. package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
  246. package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
  247. package/src/nodes/display/ViewportTextureNode.js +57 -0
  248. package/src/nodes/fog/Fog.js +93 -0
  249. package/src/nodes/functions/BasicLightingModel.js +24 -0
  250. package/src/nodes/functions/PhongLightingModel.js +34 -2
  251. package/src/nodes/functions/PhysicalLightingModel.js +167 -8
  252. package/src/nodes/functions/ShadowMaskModel.js +23 -0
  253. package/src/nodes/functions/ToonLightingModel.js +20 -0
  254. package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
  255. package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
  256. package/src/nodes/geometry/RangeNode.js +54 -2
  257. package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
  258. package/src/nodes/gpgpu/BarrierNode.js +47 -0
  259. package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
  260. package/src/nodes/gpgpu/ComputeNode.js +106 -2
  261. package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
  262. package/src/nodes/lighting/AONode.js +18 -0
  263. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  264. package/src/nodes/lighting/AnalyticLightNode.js +97 -2
  265. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  266. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  267. package/src/nodes/lighting/DirectionalLightNode.js +10 -0
  268. package/src/nodes/lighting/EnvironmentNode.js +18 -0
  269. package/src/nodes/lighting/HemisphereLightNode.js +31 -0
  270. package/src/nodes/lighting/IESSpotLightNode.js +11 -0
  271. package/src/nodes/lighting/IrradianceNode.js +17 -0
  272. package/src/nodes/lighting/LightProbeNode.js +20 -0
  273. package/src/nodes/lighting/LightUtils.js +12 -0
  274. package/src/nodes/lighting/LightingContextNode.js +48 -0
  275. package/src/nodes/lighting/LightingNode.js +15 -6
  276. package/src/nodes/lighting/LightsNode.js +132 -1
  277. package/src/nodes/lighting/PointLightNode.js +32 -1
  278. package/src/nodes/lighting/PointShadowNode.js +54 -1
  279. package/src/nodes/lighting/RectAreaLightNode.js +44 -6
  280. package/src/nodes/lighting/ShadowBaseNode.js +93 -0
  281. package/src/nodes/lighting/ShadowNode.js +240 -34
  282. package/src/nodes/lighting/SpotLightNode.js +43 -0
  283. package/src/nodes/math/ConditionalNode.js +70 -3
  284. package/src/nodes/math/Hash.js +9 -0
  285. package/src/nodes/math/MathNode.js +614 -11
  286. package/src/nodes/math/MathUtils.js +45 -1
  287. package/src/nodes/math/OperatorNode.js +233 -0
  288. package/src/nodes/math/TriNoise3D.js +18 -7
  289. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  290. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  291. package/src/nodes/pmrem/PMREMNode.js +133 -0
  292. package/src/nodes/pmrem/PMREMUtils.js +1 -1
  293. package/src/nodes/procedural/Checker.js +9 -0
  294. package/src/nodes/tsl/TSLBase.js +2 -2
  295. package/src/nodes/utils/ArrayElementNode.js +38 -2
  296. package/src/nodes/utils/ConvertNode.js +31 -0
  297. package/src/nodes/utils/CubeMapNode.js +78 -0
  298. package/src/nodes/utils/Discard.js +16 -0
  299. package/src/nodes/utils/EquirectUVNode.js +31 -1
  300. package/src/nodes/utils/FlipNode.js +38 -0
  301. package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
  302. package/src/nodes/utils/JoinNode.js +25 -0
  303. package/src/nodes/utils/LoopNode.js +74 -1
  304. package/src/nodes/utils/MatcapUVNode.js +17 -0
  305. package/src/nodes/utils/MaxMipLevelNode.js +49 -0
  306. package/src/nodes/utils/Oscillators.js +33 -0
  307. package/src/nodes/utils/Packing.js +17 -0
  308. package/src/nodes/utils/PostProcessingUtils.js +28 -23
  309. package/src/nodes/utils/RTTNode.js +123 -2
  310. package/src/nodes/utils/ReflectorNode.js +174 -4
  311. package/src/nodes/utils/RemapNode.js +79 -0
  312. package/src/nodes/utils/RotateNode.js +41 -0
  313. package/src/nodes/utils/SetNode.js +44 -1
  314. package/src/nodes/utils/SplitNode.js +55 -3
  315. package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
  316. package/src/nodes/utils/SpriteUtils.js +17 -0
  317. package/src/nodes/utils/StorageArrayElementNode.js +40 -0
  318. package/src/nodes/utils/Timer.js +19 -0
  319. package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
  320. package/src/nodes/utils/UVUtils.js +20 -0
  321. package/src/nodes/utils/ViewportUtils.js +13 -0
  322. package/src/objects/BatchedMesh.js +1 -2
  323. package/src/objects/ClippingGroup.js +49 -0
  324. package/src/renderers/WebGLRenderer.js +23 -4
  325. package/src/renderers/common/Animation.js +63 -0
  326. package/src/renderers/common/Attributes.js +36 -0
  327. package/src/renderers/common/Backend.js +467 -52
  328. package/src/renderers/common/Background.js +34 -1
  329. package/src/renderers/common/BindGroup.js +43 -0
  330. package/src/renderers/common/Binding.js +35 -0
  331. package/src/renderers/common/Bindings.js +93 -1
  332. package/src/renderers/common/Buffer.js +49 -0
  333. package/src/renderers/common/BufferUtils.js +27 -0
  334. package/src/renderers/common/BundleGroup.js +57 -0
  335. package/src/renderers/common/ChainMap.js +38 -1
  336. package/src/renderers/common/ClippingContext.js +107 -14
  337. package/src/renderers/common/Color4.js +36 -0
  338. package/src/renderers/common/ComputePipeline.js +24 -0
  339. package/src/renderers/common/CubeRenderTarget.js +13 -0
  340. package/src/renderers/common/DataMap.js +37 -1
  341. package/src/renderers/common/Geometries.js +98 -0
  342. package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
  343. package/src/renderers/common/Info.js +87 -0
  344. package/src/renderers/common/Lighting.js +26 -0
  345. package/src/renderers/common/Pipeline.js +22 -0
  346. package/src/renderers/common/Pipelines.js +148 -5
  347. package/src/renderers/common/PostProcessing.js +75 -3
  348. package/src/renderers/common/ProgrammableStage.js +60 -2
  349. package/src/renderers/common/QuadMesh.js +54 -5
  350. package/src/renderers/common/RenderBundle.js +14 -8
  351. package/src/renderers/common/RenderBundles.js +33 -10
  352. package/src/renderers/common/RenderContext.js +169 -4
  353. package/src/renderers/common/RenderContexts.js +42 -2
  354. package/src/renderers/common/RenderList.js +178 -0
  355. package/src/renderers/common/RenderLists.js +31 -0
  356. package/src/renderers/common/RenderObject.js +328 -4
  357. package/src/renderers/common/RenderObjects.js +101 -7
  358. package/src/renderers/common/RenderPipeline.js +24 -0
  359. package/src/renderers/common/Renderer.js +1096 -31
  360. package/src/renderers/common/RendererUtils.js +193 -0
  361. package/src/renderers/common/SampledTexture.js +121 -0
  362. package/src/renderers/common/Sampler.js +30 -0
  363. package/src/renderers/common/StorageBuffer.js +24 -0
  364. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  365. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  366. package/src/renderers/common/StorageTexture.js +38 -0
  367. package/src/renderers/common/Textures.js +83 -0
  368. package/src/renderers/common/Uniform.js +188 -2
  369. package/src/renderers/common/UniformBuffer.js +19 -0
  370. package/src/renderers/common/UniformsGroup.js +139 -2
  371. package/src/renderers/common/extras/PMREMGenerator.js +24 -3
  372. package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
  373. package/src/renderers/common/nodes/NodeLibrary.js +89 -0
  374. package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
  375. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  376. package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
  377. package/src/renderers/common/nodes/NodeUniform.js +189 -0
  378. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  379. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  380. package/src/renderers/common/nodes/Nodes.js +327 -60
  381. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  382. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  383. package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
  384. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
  385. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
  386. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
  387. package/src/renderers/webgpu/WebGPUBackend.js +480 -49
  388. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
  389. package/src/renderers/webgpu/WebGPURenderer.js +35 -0
  390. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
  391. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
  392. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
  393. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
  394. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  395. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
  396. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
  397. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
  398. package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
  399. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  400. package/src/renderers/webxr/WebXRManager.js +7 -1
  401. package/src/textures/Data3DTexture.js +2 -2
  402. package/src/textures/Texture.js +4 -0
  403. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
  404. package/examples/jsm/animation/MMDPhysics.js +0 -1408
  405. package/examples/jsm/exporters/MMDExporter.js +0 -223
  406. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  407. package/examples/jsm/loaders/MMDLoader.js +0 -2298
  408. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  409. package/src/nodes/core/UniformGroup.js +0 -13
  410. package/src/nodes/fog/FogExp2Node.js +0 -35
  411. package/src/nodes/fog/FogNode.js +0 -50
  412. package/src/nodes/fog/FogRangeNode.js +0 -36
  413. package/src/renderers/common/PostProcessingUtils.js +0 -86
@@ -11,8 +11,13 @@ import { NodeUpdateType } from '../core/constants.js';
11
11
  const _matrix41 = /*@__PURE__*/ new Matrix4();
12
12
  const _matrix42 = /*@__PURE__*/ new Matrix4();
13
13
 
14
- let ltcLib = null;
14
+ let _ltcLib = null;
15
15
 
16
+ /**
17
+ * Module for representing rect area lights as nodes.
18
+ *
19
+ * @augments AnalyticLightNode
20
+ */
16
21
  class RectAreaLightNode extends AnalyticLightNode {
17
22
 
18
23
  static get type() {
@@ -21,17 +26,45 @@ class RectAreaLightNode extends AnalyticLightNode {
21
26
 
22
27
  }
23
28
 
29
+ /**
30
+ * Constructs a new rect area light node.
31
+ *
32
+ * @param {RectAreaLight?} [light=null] - The rect area light source.
33
+ */
24
34
  constructor( light = null ) {
25
35
 
26
36
  super( light );
27
37
 
38
+ /**
39
+ * Uniform node representing the half height of the are light.
40
+ *
41
+ * @type {UniformNode<vec3>}
42
+ */
28
43
  this.halfHeight = uniform( new Vector3() ).setGroup( renderGroup );
44
+
45
+ /**
46
+ * Uniform node representing the half width of the are light.
47
+ *
48
+ * @type {UniformNode<vec3>}
49
+ */
29
50
  this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup );
30
51
 
52
+ /**
53
+ * The `updateType` is set to `NodeUpdateType.RENDER` since the light
54
+ * relies on `viewMatrix` which might vary per render call.
55
+ *
56
+ * @type {String}
57
+ * @default 'render'
58
+ */
31
59
  this.updateType = NodeUpdateType.RENDER;
32
60
 
33
61
  }
34
62
 
63
+ /**
64
+ * Overwritten to updated rect area light specific uniforms.
65
+ *
66
+ * @param {NodeFrame} frame - A reference to the current node frame.
67
+ */
35
68
  update( frame ) {
36
69
 
37
70
  super.update( frame );
@@ -61,13 +94,13 @@ class RectAreaLightNode extends AnalyticLightNode {
61
94
 
62
95
  if ( builder.isAvailable( 'float32Filterable' ) ) {
63
96
 
64
- ltc_1 = texture( ltcLib.LTC_FLOAT_1 );
65
- ltc_2 = texture( ltcLib.LTC_FLOAT_2 );
97
+ ltc_1 = texture( _ltcLib.LTC_FLOAT_1 );
98
+ ltc_2 = texture( _ltcLib.LTC_FLOAT_2 );
66
99
 
67
100
  } else {
68
101
 
69
- ltc_1 = texture( ltcLib.LTC_HALF_1 );
70
- ltc_2 = texture( ltcLib.LTC_HALF_2 );
102
+ ltc_1 = texture( _ltcLib.LTC_HALF_1 );
103
+ ltc_2 = texture( _ltcLib.LTC_HALF_2 );
71
104
 
72
105
  }
73
106
 
@@ -89,9 +122,14 @@ class RectAreaLightNode extends AnalyticLightNode {
89
122
 
90
123
  }
91
124
 
125
+ /**
126
+ * Used to configure the internal BRDF approximation texture data.
127
+ *
128
+ * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data.
129
+ */
92
130
  static setLTC( ltc ) {
93
131
 
94
- ltcLib = ltc;
132
+ _ltcLib = ltc;
95
133
 
96
134
  }
97
135
 
@@ -0,0 +1,93 @@
1
+ import Node from '../core/Node.js';
2
+ import { NodeUpdateType } from '../core/constants.js';
3
+ import { vec3 } from '../tsl/TSLBase.js';
4
+ import { positionWorld } from '../accessors/Position.js';
5
+
6
+ /** @module ShadowBaseNode **/
7
+
8
+ /**
9
+ * Base class for all shadow nodes.
10
+ *
11
+ * Shadow nodes encapsulate shadow related logic and are always coupled to lighting nodes.
12
+ * Lighting nodes might share the same shadow node type or use specific ones depending on
13
+ * their requirements.
14
+ *
15
+ * @augments Node
16
+ */
17
+ class ShadowBaseNode extends Node {
18
+
19
+ static get type() {
20
+
21
+ return 'ShadowBaseNode';
22
+
23
+ }
24
+
25
+ /**
26
+ * Constructs a new shadow base node.
27
+ *
28
+ * @param {Light} light - The shadow casting light.
29
+ */
30
+ constructor( light ) {
31
+
32
+ super();
33
+
34
+ /**
35
+ * The shadow casting light.
36
+ *
37
+ * @type {Light}
38
+ */
39
+ this.light = light;
40
+
41
+ /**
42
+ * Overwritten since shadows are updated by default per render.
43
+ *
44
+ * @type {String}
45
+ * @default 'render'
46
+ */
47
+ this.updateBeforeType = NodeUpdateType.RENDER;
48
+
49
+ /**
50
+ * This flag can be used for type testing.
51
+ *
52
+ * @type {Boolean}
53
+ * @readonly
54
+ * @default true
55
+ */
56
+ this.isShadowBaseNode = true;
57
+
58
+ }
59
+
60
+ /**
61
+ * Setups the shadow position node which is by default the predefined TSL node object `shadowPositionWorld`.
62
+ *
63
+ * @param {(NodeBuilder|{Material})} object - A configuration object that must at least hold a material reference.
64
+ */
65
+ setupShadowPosition( { material } ) {
66
+
67
+ // Use assign inside an Fn()
68
+
69
+ shadowPositionWorld.assign( material.shadowPositionNode || positionWorld );
70
+
71
+ }
72
+
73
+ /**
74
+ * Can be called when the shadow isn't required anymore. That can happen when
75
+ * a lighting node stops casting shadows by setting {@link Object3D#castShadow}
76
+ * to `false`.
77
+ */
78
+ dispose() {
79
+
80
+ this.updateBeforeType = NodeUpdateType.NONE;
81
+
82
+ }
83
+
84
+ }
85
+
86
+ /**
87
+ * TSL object that represents the vertex position in world space during the shadow pass.
88
+ *
89
+ * @type {Node<vec3>}
90
+ */
91
+ export const shadowPositionWorld = /*@__PURE__*/ vec3().toVar( 'shadowPositionWorld' );
92
+
93
+ export default ShadowBaseNode;
@@ -1,5 +1,4 @@
1
- import Node from '../core/Node.js';
2
- import { NodeUpdateType } from '../core/constants.js';
1
+ import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
3
2
  import { float, vec2, vec3, vec4, If, int, Fn, nodeObject } from '../tsl/TSLBase.js';
4
3
  import { reference } from '../accessors/ReferenceNode.js';
5
4
  import { texture } from '../accessors/TextureNode.js';
@@ -12,15 +11,17 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
12
11
  import QuadMesh from '../../renderers/common/QuadMesh.js';
13
12
  import { Loop } from '../utils/LoopNode.js';
14
13
  import { screenCoordinate } from '../display/ScreenNode.js';
15
- import { HalfFloatType, LessCompare, NoBlending, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js';
14
+ import { HalfFloatType, LessCompare, RGFormat, VSMShadowMap, WebGPUCoordinateSystem } from '../../constants.js';
16
15
  import { renderGroup } from '../core/UniformGroupNode.js';
17
16
  import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
18
17
  import { objectPosition } from '../accessors/Object3DNode.js';
19
18
  import { lightShadowMatrix } from '../accessors/Lights.js';
19
+ import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
20
+ import { getDataFromObject } from '../core/NodeUtils.js';
20
21
 
21
- const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
22
- const shadowWorldPosition = /*@__PURE__*/ vec3().toVar( 'shadowWorldPosition' );
22
+ /** @module ShadowNode **/
23
23
 
24
+ const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
24
25
  const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => {
25
26
 
26
27
  let dist = positionWorld.sub( position ).length();
@@ -56,8 +57,8 @@ const getShadowMaterial = ( light ) => {
56
57
  material.colorNode = vec4( 0, 0, 0, 1 );
57
58
  material.depthNode = depthNode;
58
59
  material.isShadowNodeMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode
59
- material.blending = NoBlending;
60
60
  material.name = 'ShadowMaterial';
61
+ material.fog = false;
61
62
 
62
63
  shadowMaterialLib.set( light, material );
63
64
 
@@ -67,12 +68,32 @@ const getShadowMaterial = ( light ) => {
67
68
 
68
69
  };
69
70
 
71
+ /**
72
+ * A shadow filtering function performing basic filtering. This is in fact an unfiltered version of the shadow map
73
+ * with a binary `[0,1]` result.
74
+ *
75
+ * @method
76
+ * @param {Object} inputs - The input parameter object.
77
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
78
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
79
+ * @return {Node<float>} The filtering result.
80
+ */
70
81
  export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => {
71
82
 
72
83
  return texture( depthTexture, shadowCoord.xy ).compare( shadowCoord.z );
73
84
 
74
85
  } );
75
86
 
87
+ /**
88
+ * A shadow filtering function performing PCF filtering.
89
+ *
90
+ * @method
91
+ * @param {Object} inputs - The input parameter object.
92
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
93
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
94
+ * @param {LightShadow} inputs.shadow - The light shadow.
95
+ * @return {Node<float>} The filtering result.
96
+ */
76
97
  export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow } ) => {
77
98
 
78
99
  const depthCompare = ( uv, compare ) => texture( depthTexture, uv ).compare( compare );
@@ -112,6 +133,16 @@ export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord,
112
133
 
113
134
  } );
114
135
 
136
+ /**
137
+ * A shadow filtering function performing PCF soft filtering.
138
+ *
139
+ * @method
140
+ * @param {Object} inputs - The input parameter object.
141
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
142
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
143
+ * @param {LightShadow} inputs.shadow - The light shadow.
144
+ * @return {Node<float>} The filtering result.
145
+ */
115
146
  export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow } ) => {
116
147
 
117
148
  const depthCompare = ( uv, compare ) => texture( depthTexture, uv ).compare( compare );
@@ -168,13 +199,20 @@ export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoo
168
199
 
169
200
  } );
170
201
 
171
- // VSM
172
-
202
+ /**
203
+ * A shadow filtering function performing VSM filtering.
204
+ *
205
+ * @method
206
+ * @param {Object} inputs - The input parameter object.
207
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
208
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
209
+ * @return {Node<float>} The filtering result.
210
+ */
173
211
  export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => {
174
212
 
175
213
  const occlusion = float( 1 ).toVar();
176
214
 
177
- const distribution = texture( depthTexture ).uv( shadowCoord.xy ).rg;
215
+ const distribution = texture( depthTexture ).sample( shadowCoord.xy ).rg;
178
216
 
179
217
  const hardShadow = step( shadowCoord.z, distribution.x );
180
218
 
@@ -192,6 +230,17 @@ export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord }
192
230
 
193
231
  } );
194
232
 
233
+ /**
234
+ * Represents the shader code for the first VSM render pass.
235
+ *
236
+ * @method
237
+ * @param {Object} inputs - The input parameter object.
238
+ * @param {Node<float>} inputs.samples - The number of samples
239
+ * @param {Node<float>} inputs.radius - The radius.
240
+ * @param {Node<float>} inputs.size - The size.
241
+ * @param {TextureNode} inputs.shadowPass - A reference to the render target's depth data.
242
+ * @return {Node<vec2>} The VSM output.
243
+ */
195
244
  const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass } ) => {
196
245
 
197
246
  const mean = float( 0 ).toVar();
@@ -204,7 +253,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass
204
253
 
205
254
  const uvOffset = uvStart.add( float( i ).mul( uvStride ) );
206
255
 
207
- const depth = shadowPass.uv( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x;
256
+ const depth = shadowPass.sample( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x;
208
257
  mean.addAssign( depth );
209
258
  squaredMean.addAssign( depth.mul( depth ) );
210
259
 
@@ -218,6 +267,17 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass
218
267
 
219
268
  } );
220
269
 
270
+ /**
271
+ * Represents the shader code for the second VSM render pass.
272
+ *
273
+ * @method
274
+ * @param {Object} inputs - The input parameter object.
275
+ * @param {Node<float>} inputs.samples - The number of samples
276
+ * @param {Node<float>} inputs.radius - The radius.
277
+ * @param {Node<float>} inputs.size - The size.
278
+ * @param {TextureNode} inputs.shadowPass - The result of the first VSM render pass.
279
+ * @return {Node<vec2>} The VSM output.
280
+ */
221
281
  const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass } ) => {
222
282
 
223
283
  const mean = float( 0 ).toVar();
@@ -230,7 +290,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas
230
290
 
231
291
  const uvOffset = uvStart.add( float( i ).mul( uvStride ) );
232
292
 
233
- const distribution = shadowPass.uv( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) );
293
+ const distribution = shadowPass.sample( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) );
234
294
  mean.addAssign( distribution.x );
235
295
  squaredMean.addAssign( add( distribution.y.mul( distribution.y ), distribution.x.mul( distribution.x ) ) );
236
296
 
@@ -248,9 +308,15 @@ const _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilt
248
308
 
249
309
  //
250
310
 
311
+ let _rendererState;
251
312
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
252
313
 
253
- class ShadowNode extends Node {
314
+ /**
315
+ * Represents the default shadow implementation for lighting nodes.
316
+ *
317
+ * @augments module:ShadowBaseNode~ShadowBaseNode
318
+ */
319
+ class ShadowNode extends ShadowBaseNode {
254
320
 
255
321
  static get type() {
256
322
 
@@ -258,28 +324,101 @@ class ShadowNode extends Node {
258
324
 
259
325
  }
260
326
 
327
+ /**
328
+ * Constructs a new shadow node.
329
+ *
330
+ * @param {Light} light - The shadow casting light.
331
+ * @param {LightShadow?} [shadow=null] - An optional light shadow.
332
+ */
261
333
  constructor( light, shadow = null ) {
262
334
 
263
- super();
335
+ super( light );
264
336
 
265
- this.light = light;
337
+ /**
338
+ * The light shadow which defines the properties light's
339
+ * shadow.
340
+ *
341
+ * @type {LightShadow?}
342
+ * @default null
343
+ */
266
344
  this.shadow = shadow || light.shadow;
267
345
 
346
+ /**
347
+ * A reference to the shadow map which is a render target.
348
+ *
349
+ * @type {RenderTarget?}
350
+ * @default null
351
+ */
268
352
  this.shadowMap = null;
269
353
 
354
+ /**
355
+ * Only relevant for VSM shadows. Render target for the
356
+ * first VSM render pass.
357
+ *
358
+ * @type {RenderTarget?}
359
+ * @default null
360
+ */
270
361
  this.vsmShadowMapVertical = null;
362
+
363
+ /**
364
+ * Only relevant for VSM shadows. Render target for the
365
+ * second VSM render pass.
366
+ *
367
+ * @type {RenderTarget?}
368
+ * @default null
369
+ */
271
370
  this.vsmShadowMapHorizontal = null;
272
371
 
372
+ /**
373
+ * Only relevant for VSM shadows. Node material which
374
+ * is used to render the first VSM pass.
375
+ *
376
+ * @type {NodeMaterial?}
377
+ * @default null
378
+ */
273
379
  this.vsmMaterialVertical = null;
380
+
381
+ /**
382
+ * Only relevant for VSM shadows. Node material which
383
+ * is used to render the second VSM pass.
384
+ *
385
+ * @type {NodeMaterial?}
386
+ * @default null
387
+ */
274
388
  this.vsmMaterialHorizontal = null;
275
389
 
276
- this.updateBeforeType = NodeUpdateType.RENDER;
390
+ /**
391
+ * A reference to the output node which defines the
392
+ * final result of this shadow node.
393
+ *
394
+ * @type {Node?}
395
+ * @private
396
+ * @default null
397
+ */
277
398
  this._node = null;
278
399
 
400
+ /**
401
+ * This flag can be used for type testing.
402
+ *
403
+ * @type {Boolean}
404
+ * @readonly
405
+ * @default true
406
+ */
279
407
  this.isShadowNode = true;
280
408
 
281
409
  }
282
410
 
411
+ /**
412
+ * Setups the shadow filtering.
413
+ *
414
+ * @param {NodeBuilder} builder - A reference to the current node builder.
415
+ * @param {Object} inputs - A configuration object that defines the shadow filtering.
416
+ * @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.
417
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
418
+ * @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.
419
+ * @param {LightShadow} inputs.shadow - The light shadow.
420
+ * @return {Node<float>} The result node of the shadow filtering.
421
+ */
283
422
  setupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow } ) {
284
423
 
285
424
  const frustumTest = shadowCoord.x.greaterThanEqual( 0 )
@@ -294,6 +433,13 @@ class ShadowNode extends Node {
294
433
 
295
434
  }
296
435
 
436
+ /**
437
+ * Setups the shadow coordinates.
438
+ *
439
+ * @param {NodeBuilder} builder - A reference to the current node builder.
440
+ * @param {Node<vec3>} shadowPosition - A node representing the shadow position.
441
+ * @return {Node<vec3>} The shadow coordinates.
442
+ */
297
443
  setupShadowCoord( builder, shadowPosition ) {
298
444
 
299
445
  const { shadow } = this;
@@ -341,12 +487,24 @@ class ShadowNode extends Node {
341
487
 
342
488
  }
343
489
 
490
+ /**
491
+ * Returns the shadow filtering function for the given shadow type.
492
+ *
493
+ * @param {Number} type - The shadow type.
494
+ * @return {Function} The filtering function.
495
+ */
344
496
  getShadowFilterFn( type ) {
345
497
 
346
498
  return _shadowFilterLib[ type ];
347
499
 
348
500
  }
349
501
 
502
+ /**
503
+ * Setups the shadow output node.
504
+ *
505
+ * @param {NodeBuilder} builder - A reference to the current node builder.
506
+ * @return {Node<vec3>} The shadow output node.
507
+ */
350
508
  setupShadow( builder ) {
351
509
 
352
510
  const { renderer } = builder;
@@ -394,7 +552,7 @@ class ShadowNode extends Node {
394
552
  const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
395
553
  const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
396
554
 
397
- const shadowPosition = lightShadowMatrix( light ).mul( shadowWorldPosition.add( transformedNormalWorld.mul( normalBias ) ) );
555
+ const shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add( transformedNormalWorld.mul( normalBias ) ) );
398
556
  const shadowCoord = this.setupShadowCoord( builder, shadowPosition );
399
557
 
400
558
  //
@@ -421,16 +579,23 @@ class ShadowNode extends Node {
421
579
 
422
580
  }
423
581
 
582
+ /**
583
+ * The implementation performs the setup of the output node. An output is only
584
+ * produces if shadow mapping is globally enabled in the renderer.
585
+ *
586
+ * @param {NodeBuilder} builder - A reference to the current node builder.
587
+ * @return {ShaderCallNodeInternal} The output node.
588
+ */
424
589
  setup( builder ) {
425
590
 
426
591
  if ( builder.renderer.shadowMap.enabled === false ) return;
427
592
 
428
- return Fn( ( { material } ) => {
429
-
430
- shadowWorldPosition.assign( material.shadowPositionNode || positionWorld );
593
+ return Fn( () => {
431
594
 
432
595
  let node = this._node;
433
596
 
597
+ this.setupShadowPosition( builder );
598
+
434
599
  if ( node === null ) {
435
600
 
436
601
  this._node = node = this.setupShadow( builder );
@@ -455,17 +620,32 @@ class ShadowNode extends Node {
455
620
 
456
621
  }
457
622
 
623
+ /**
624
+ * Renders the shadow. The logic of this function could be included
625
+ * into {@link ShadowNode#updateShadow} however more specialized shadow
626
+ * nodes might require a custom shadow map rendering. By having a
627
+ * dedicated method, it's easier to overwrite the default behavior.
628
+ *
629
+ * @param {NodeFrame} frame - A reference to the current node frame.
630
+ */
458
631
  renderShadow( frame ) {
459
632
 
460
- const { shadow, shadowMap } = this;
633
+ const { shadow, shadowMap, light } = this;
461
634
  const { renderer, scene } = frame;
462
635
 
636
+ shadow.updateMatrices( light );
637
+
463
638
  shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height );
464
639
 
465
640
  renderer.render( scene, shadow.camera );
466
641
 
467
642
  }
468
643
 
644
+ /**
645
+ * Updates the shadow.
646
+ *
647
+ * @param {NodeFrame} frame - A reference to the current node frame.
648
+ */
469
649
  updateShadow( frame ) {
470
650
 
471
651
  const { shadowMap, light, shadow } = this;
@@ -476,23 +656,32 @@ class ShadowNode extends Node {
476
656
  const depthVersion = shadowMap.depthTexture.version;
477
657
  this._depthVersionCached = depthVersion;
478
658
 
479
- const currentOverrideMaterial = scene.overrideMaterial;
480
-
481
- scene.overrideMaterial = getShadowMaterial( light );
482
-
483
659
  shadow.camera.layers.mask = camera.layers.mask;
484
660
 
485
- const currentRenderTarget = renderer.getRenderTarget();
486
661
  const currentRenderObjectFunction = renderer.getRenderObjectFunction();
662
+
487
663
  const currentMRT = renderer.getMRT();
664
+ const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
665
+
666
+ _rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
488
667
 
489
- renderer.setMRT( null );
668
+ scene.overrideMaterial = getShadowMaterial( light );
490
669
 
491
- renderer.setRenderObjectFunction( ( object, ...params ) => {
670
+ renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => {
492
671
 
493
672
  if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
494
673
 
495
- renderer.renderObject( object, ...params );
674
+ if ( useVelocity ) {
675
+
676
+ getDataFromObject( object ).useVelocity = true;
677
+
678
+ }
679
+
680
+ object.onBeforeShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group );
681
+
682
+ renderer.renderObject( object, scene, _camera, geometry, material, group, ...params );
683
+
684
+ object.onAfterShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group );
496
685
 
497
686
  }
498
687
 
@@ -512,14 +701,15 @@ class ShadowNode extends Node {
512
701
 
513
702
  }
514
703
 
515
- renderer.setRenderTarget( currentRenderTarget );
516
-
517
- renderer.setMRT( currentMRT );
518
-
519
- scene.overrideMaterial = currentOverrideMaterial;
704
+ restoreRendererAndSceneState( renderer, scene, _rendererState );
520
705
 
521
706
  }
522
707
 
708
+ /**
709
+ * For VSM additional render passes are required.
710
+ *
711
+ * @param {Renderer} renderer - A reference to the current renderer.
712
+ */
523
713
  vsmPass( renderer ) {
524
714
 
525
715
  const { shadow } = this;
@@ -537,6 +727,9 @@ class ShadowNode extends Node {
537
727
 
538
728
  }
539
729
 
730
+ /**
731
+ * Frees the internal resources of this shadow node.
732
+ */
540
733
  dispose() {
541
734
 
542
735
  this.shadowMap.dispose();
@@ -562,10 +755,15 @@ class ShadowNode extends Node {
562
755
 
563
756
  }
564
757
 
565
- this.updateBeforeType = NodeUpdateType.NONE;
758
+ super.dispose();
566
759
 
567
760
  }
568
761
 
762
+ /**
763
+ * The implementation performs the update of the shadow map if necessary.
764
+ *
765
+ * @param {NodeFrame} frame - A reference to the current node frame.
766
+ */
569
767
  updateBefore( frame ) {
570
768
 
571
769
  const { shadow } = this;
@@ -590,4 +788,12 @@ class ShadowNode extends Node {
590
788
 
591
789
  export default ShadowNode;
592
790
 
791
+ /**
792
+ * TSL function for creating an instance of `ShadowNode`.
793
+ *
794
+ * @function
795
+ * @param {Light} light - The shadow casting light.
796
+ * @param {LightShadow} shadow - The light shadow.
797
+ * @return {ShadowNode} The created shadow node.
798
+ */
593
799
  export const shadow = ( light, shadow ) => nodeObject( new ShadowNode( light, shadow ) );