super-three 0.171.0 → 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
@@ -2,6 +2,18 @@ import UniformNode from '../core/UniformNode.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { nodeProxy } from '../tsl/TSLBase.js';
4
4
 
5
+ /** @module MatcapUVNode **/
6
+
7
+ /**
8
+ * A special type of uniform node that computes the
9
+ * maximum mipmap level for a given texture node.
10
+ *
11
+ * ```js
12
+ * const level = maxMipLevel( textureNode );
13
+ * ```
14
+ *
15
+ * @augments module:UniformNode~UniformNode
16
+ */
5
17
  class MaxMipLevelNode extends UniformNode {
6
18
 
7
19
  static get type() {
@@ -10,22 +22,52 @@ class MaxMipLevelNode extends UniformNode {
10
22
 
11
23
  }
12
24
 
25
+ /**
26
+ * Constructs a new max mip level node.
27
+ *
28
+ * @param {TextureNode} textureNode - The texture node to compute the max mip level for.
29
+ */
13
30
  constructor( textureNode ) {
14
31
 
15
32
  super( 0 );
16
33
 
34
+ /**
35
+ * The texture node to compute the max mip level for.
36
+ *
37
+ * @private
38
+ * @type {TextureNode}
39
+ */
17
40
  this._textureNode = textureNode;
18
41
 
42
+ /**
43
+ * The `updateType` is set to `NodeUpdateType.FRAME` since the node updates
44
+ * the texture once per frame in its {@link MaxMipLevelNode#update} method.
45
+ *
46
+ * @type {String}
47
+ * @default 'frame'
48
+ */
19
49
  this.updateType = NodeUpdateType.FRAME;
20
50
 
21
51
  }
22
52
 
53
+ /**
54
+ * The texture node to compute the max mip level for.
55
+ *
56
+ * @readonly
57
+ * @type {TextureNode}
58
+ */
23
59
  get textureNode() {
24
60
 
25
61
  return this._textureNode;
26
62
 
27
63
  }
28
64
 
65
+ /**
66
+ * The texture.
67
+ *
68
+ * @readonly
69
+ * @type {Texture}
70
+ */
29
71
  get texture() {
30
72
 
31
73
  return this._textureNode.value;
@@ -52,4 +94,11 @@ class MaxMipLevelNode extends UniformNode {
52
94
 
53
95
  export default MaxMipLevelNode;
54
96
 
97
+ /**
98
+ * TSL function for creating a max mip level node.
99
+ *
100
+ * @function
101
+ * @param {TextureNode} textureNode - The texture node to compute the max mip level for.
102
+ * @returns {MaxMipLevelNode}
103
+ */
55
104
  export const maxMipLevel = /*@__PURE__*/ nodeProxy( MaxMipLevelNode );
@@ -1,6 +1,39 @@
1
1
  import { time } from './Timer.js';
2
2
 
3
+ /** @module Oscillators **/
4
+
5
+ /**
6
+ * Generates a sine wave oscillation based on a timer.
7
+ *
8
+ * @method
9
+ * @param {Node<float>} t - The timer to generate the oscillation with.
10
+ * @return {Node<float>} The oscillation node.
11
+ */
3
12
  export const oscSine = ( t = time ) => t.add( 0.75 ).mul( Math.PI * 2 ).sin().mul( 0.5 ).add( 0.5 );
13
+
14
+ /**
15
+ * Generates a square wave oscillation based on a timer.
16
+ *
17
+ * @method
18
+ * @param {Node<float>} t - The timer to generate the oscillation with.
19
+ * @return {Node<float>} The oscillation node.
20
+ */
4
21
  export const oscSquare = ( t = time ) => t.fract().round();
22
+
23
+ /**
24
+ * Generates a triangle wave oscillation based on a timer.
25
+ *
26
+ * @method
27
+ * @param {Node<float>} t - The timer to generate the oscillation with.
28
+ * @return {Node<float>} The oscillation node.
29
+ */
5
30
  export const oscTriangle = ( t = time ) => t.add( 0.5 ).fract().mul( 2 ).sub( 1 ).abs();
31
+
32
+ /**
33
+ * Generates a sawtooth wave oscillation based on a timer.
34
+ *
35
+ * @method
36
+ * @param {Node<float>} t - The timer to generate the oscillation with.
37
+ * @return {Node<float>} The oscillation node.
38
+ */
6
39
  export const oscSawtooth = ( t = time ) => t.fract();
@@ -1,4 +1,21 @@
1
1
  import { nodeObject } from '../tsl/TSLBase.js';
2
2
 
3
+ /** @module Packing **/
4
+
5
+ /**
6
+ * Packs a direction vector into a color value.
7
+ *
8
+ * @method
9
+ * @param {Node<vec3>} node - The direction to pack.
10
+ * @return {Node<vec3>} The color.
11
+ */
3
12
  export const directionToColor = ( node ) => nodeObject( node ).mul( 0.5 ).add( 0.5 );
13
+
14
+ /**
15
+ * Unpacks a color value into a direction vector.
16
+ *
17
+ * @method
18
+ * @param {Node<vec3>} node - The color to unpack.
19
+ * @return {Node<vec3>} The direction.
20
+ */
4
21
  export const colorToDirection = ( node ) => nodeObject( node ).mul( 2.0 ).sub( 1 );
@@ -3,15 +3,18 @@ import { textureSize } from '../accessors/TextureSizeNode.js';
3
3
  import { textureLoad } from '../accessors/TextureNode.js';
4
4
  import { WebGPUCoordinateSystem } from '../../constants.js';
5
5
 
6
+ /** @module PostProcessingUtils **/
7
+
6
8
  /**
7
- * Computes a position in view space based on a fragment's screen position expressed as uv coordinates, the fragments
8
- * depth value and the camera's inverse projection matrix.
9
- *
10
- * @param {vec2} screenPosition - The fragment's screen position expressed as uv coordinates.
11
- * @param {float} depth - The fragment's depth value.
12
- * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix.
13
- * @return {vec3} The fragments position in view space.
14
- */
9
+ * Computes a position in view space based on a fragment's screen position expressed as uv coordinates, the fragments
10
+ * depth value and the camera's inverse projection matrix.
11
+ *
12
+ * @method
13
+ * @param {Node<vec2>} screenPosition - The fragment's screen position expressed as uv coordinates.
14
+ * @param {Node<float>} depth - The fragment's depth value.
15
+ * @param {Node<mat4>} projectionMatrixInverse - The camera's inverse projection matrix.
16
+ * @return {Node<vec3>} The fragments position in view space.
17
+ */
15
18
  export const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionMatrixInverse ], builder ) => {
16
19
 
17
20
  let clipSpacePosition;
@@ -34,13 +37,14 @@ export const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, proj
34
37
  } );
35
38
 
36
39
  /**
37
- * Computes a screen position expressed as uv coordinates based on a fragment's position in view space
38
- * and the camera's projection matrix
39
- *
40
- * @param {vec3} viewPosition - The fragments position in view space.
41
- * @param {mat4} projectionMatrix - The camera's projection matrix.
42
- * @return {vec2} The fragment's screen position expressed as uv coordinates.
43
- */
40
+ * Computes a screen position expressed as uv coordinates based on a fragment's position in view space
41
+ * and the camera's projection matrix
42
+ *
43
+ * @method
44
+ * @param {Node<vec3>} viewPosition - The fragments position in view space.
45
+ * @param {Node<mat4>} projectionMatrix - The camera's projection matrix.
46
+ * @return {Node<vec2>} The fragment's screen position expressed as uv coordinates.
47
+ */
44
48
  export const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] ) => {
45
49
 
46
50
  const sampleClipPos = projectionMatrix.mul( vec4( viewPosition, 1.0 ) );
@@ -50,14 +54,15 @@ export const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionM
50
54
  } );
51
55
 
52
56
  /**
53
- * Computes a normal vector based on depth data. Can be used as a fallback when no normal render
54
- * target is available or if flat surface normals are required.
55
- *
56
- * @param {vec2} uv - The texture coordinate.
57
- * @param {DepthTexture} depthTexture - The depth texture.
58
- * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix.
59
- * @return {vec3} The computed normal vector.
60
- */
57
+ * Computes a normal vector based on depth data. Can be used as a fallback when no normal render
58
+ * target is available or if flat surface normals are required.
59
+ *
60
+ * @method
61
+ * @param {Node<vec2>} uv - The texture coordinate.
62
+ * @param {DepthTexture} depthTexture - The depth texture.
63
+ * @param {Node<mat4>} projectionMatrixInverse - The camera's inverse projection matrix.
64
+ * @return {Node<vec3>} The computed normal vector.
65
+ */
61
66
  export const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projectionMatrixInverse ] ) => {
62
67
 
63
68
  const size = textureSize( textureLoad( depthTexture ) );
@@ -9,8 +9,18 @@ import { RenderTarget } from '../../core/RenderTarget.js';
9
9
  import { Vector2 } from '../../math/Vector2.js';
10
10
  import { HalfFloatType } from '../../constants.js';
11
11
 
12
+ /** @module RTTNode **/
13
+
12
14
  const _size = /*@__PURE__*/ new Vector2();
13
15
 
16
+ /**
17
+ * `RTTNode` takes another node and uses it with a `QuadMesh` to render into a texture (RTT).
18
+ * This module is especially relevant in context of post processing where certain nodes require
19
+ * texture input for their effects. With the helper function `convertToTexture()` which is based
20
+ * on this module, the node system can automatically ensure texture input if required.
21
+ *
22
+ * @augments module:TextureNode~TextureNode
23
+ */
14
24
  class RTTNode extends TextureNode {
15
25
 
16
26
  static get type() {
@@ -19,30 +29,110 @@ class RTTNode extends TextureNode {
19
29
 
20
30
  }
21
31
 
32
+ /**
33
+ * Constructs a new RTT node.
34
+ *
35
+ * @param {Node} node - The node to render a texture with.
36
+ * @param {Number?} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
37
+ * @param {Number?} [height=null] - The height of the internal render target.
38
+ * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
39
+ */
22
40
  constructor( node, width = null, height = null, options = { type: HalfFloatType } ) {
23
41
 
24
42
  const renderTarget = new RenderTarget( width, height, options );
25
43
 
26
44
  super( renderTarget.texture, uv() );
27
45
 
46
+ /**
47
+ * The node to render a texture with.
48
+ *
49
+ * @type {Node}
50
+ */
28
51
  this.node = node;
52
+
53
+ /**
54
+ * The width of the internal render target.
55
+ * If not width is applied, the render target is automatically resized.
56
+ *
57
+ * @type {Number?}
58
+ * @default null
59
+ */
29
60
  this.width = width;
61
+
62
+ /**
63
+ * The height of the internal render target.
64
+ *
65
+ * @type {Number?}
66
+ * @default null
67
+ */
30
68
  this.height = height;
31
69
 
70
+ /**
71
+ * The pixel ratio
72
+ *
73
+ * @type {Number}
74
+ * @default 1
75
+ */
76
+ this.pixelRatio = 1;
77
+
78
+ /**
79
+ * The render target
80
+ *
81
+ * @type {RenderTarget}
82
+ */
32
83
  this.renderTarget = renderTarget;
33
84
 
85
+ /**
86
+ * Whether the texture requires an update or not.
87
+ *
88
+ * @type {Boolean}
89
+ * @default true
90
+ */
34
91
  this.textureNeedsUpdate = true;
35
- this.autoUpdate = true;
36
92
 
37
- this.updateMap = new WeakMap();
93
+ /**
94
+ * Whether the texture should automatically be updated or not.
95
+ *
96
+ * @type {Boolean}
97
+ * @default true
98
+ */
99
+ this.autoUpdate = true;
38
100
 
101
+ /**
102
+ * The node which is used with the quad mesh for RTT.
103
+ *
104
+ * @private
105
+ * @type {Node}
106
+ * @default null
107
+ */
39
108
  this._rttNode = null;
109
+
110
+ /**
111
+ * The internal quad mesh for RTT.
112
+ *
113
+ * @private
114
+ * @type {QuadMesh}
115
+ */
40
116
  this._quadMesh = new QuadMesh( new NodeMaterial() );
41
117
 
118
+ /**
119
+ * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates
120
+ * the texture once per render in its {@link RTTNode#updateBefore} method.
121
+ *
122
+ * @type {String}
123
+ * @default 'render'
124
+ */
42
125
  this.updateBeforeType = NodeUpdateType.RENDER;
43
126
 
44
127
  }
45
128
 
129
+ /**
130
+ * Whether the internal render target should automatically be resized or not.
131
+ *
132
+ * @type {Boolean}
133
+ * @readonly
134
+ * @default true
135
+ */
46
136
  get autoSize() {
47
137
 
48
138
  return this.width === null;
@@ -59,6 +149,12 @@ class RTTNode extends TextureNode {
59
149
 
60
150
  }
61
151
 
152
+ /**
153
+ * Sets the size of the internal render target
154
+ *
155
+ * @param {Number} width - The width to set.
156
+ * @param {Number} height - The width to set.
157
+ */
62
158
  setSize( width, height ) {
63
159
 
64
160
  this.width = width;
@@ -73,6 +169,11 @@ class RTTNode extends TextureNode {
73
169
 
74
170
  }
75
171
 
172
+ /**
173
+ * Sets the pixel ratio. This will also resize the render target.
174
+ *
175
+ * @param {Number} pixelRatio - The pixel ratio to set.
176
+ */
76
177
  setPixelRatio( pixelRatio ) {
77
178
 
78
179
  this.pixelRatio = pixelRatio;
@@ -129,8 +230,28 @@ class RTTNode extends TextureNode {
129
230
 
130
231
  export default RTTNode;
131
232
 
233
+ /**
234
+ * TSL function for creating a RTT node.
235
+ *
236
+ * @function
237
+ * @param {Node} node - The node to render a texture with.
238
+ * @param {Number?} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
239
+ * @param {Number?} [height=null] - The height of the internal render target.
240
+ * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
241
+ * @returns {RTTNode}
242
+ */
132
243
  export const rtt = ( node, ...params ) => nodeObject( new RTTNode( nodeObject( node ), ...params ) );
133
244
 
245
+ /**
246
+ * TSL function for converting nodes to textures nodes.
247
+ *
248
+ * @function
249
+ * @param {Node} node - The node to render a texture with.
250
+ * @param {Number?} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.
251
+ * @param {Number?} [height=null] - The height of the internal render target.
252
+ * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.
253
+ * @returns {RTTNode}
254
+ */
134
255
  export const convertToTexture = ( node, ...params ) => {
135
256
 
136
257
  if ( node.isTextureNode ) return node;
@@ -14,6 +14,8 @@ import { Matrix4 } from '../../math/Matrix4.js';
14
14
  import { RenderTarget } from '../../core/RenderTarget.js';
15
15
  import { DepthTexture } from '../../textures/DepthTexture.js';
16
16
 
17
+ /** @module ReflectorNode **/
18
+
17
19
  const _reflectorPlane = new Plane();
18
20
  const _normal = new Vector3();
19
21
  const _reflectorWorldPosition = new Vector3();
@@ -35,6 +37,19 @@ _defaultRT.depthTexture = new DepthTexture( 1, 1 );
35
37
 
36
38
  let _inReflector = false;
37
39
 
40
+ /**
41
+ * This node can be used to implement mirror-like flat reflective surfaces.
42
+ *
43
+ * ```js
44
+ * const groundReflector = reflector();
45
+ * material.colorNode = groundReflector;
46
+ *
47
+ * const plane = new Mesh( geometry, material );
48
+ * plane.add( groundReflector.target );
49
+ * ```
50
+ *
51
+ * @augments module:TextureNode~TextureNode
52
+ */
38
53
  class ReflectorNode extends TextureNode {
39
54
 
40
55
  static get type() {
@@ -43,29 +58,72 @@ class ReflectorNode extends TextureNode {
43
58
 
44
59
  }
45
60
 
61
+ /**
62
+ * Constructs a new reflector node.
63
+ *
64
+ * @param {Object} [parameters={}] - An object holding configuration parameters.
65
+ * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.
66
+ * @param {Number} [parameters.resolution=1] - The resolution scale.
67
+ * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.
68
+ * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.
69
+ * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not.
70
+ * @param {TextureNode} [parameters.defaultTexture] - The default texture node.
71
+ * @param {ReflectorBaseNode} [parameters.reflector] - The reflector base node.
72
+ */
46
73
  constructor( parameters = {} ) {
47
74
 
48
75
  super( parameters.defaultTexture || _defaultRT.texture, _defaultUV );
49
76
 
77
+ /**
78
+ * A reference to the internal reflector base node which holds the actual implementation.
79
+ *
80
+ * @private
81
+ * @type {ReflectorBaseNode?}
82
+ * @default null
83
+ */
50
84
  this._reflectorBaseNode = parameters.reflector || new ReflectorBaseNode( this, parameters );
85
+
86
+ /**
87
+ * A reference to the internal depth node.
88
+ *
89
+ * @private
90
+ * @type {Node?}
91
+ * @default null
92
+ */
51
93
  this._depthNode = null;
52
94
 
53
95
  this.setUpdateMatrix( false );
54
96
 
55
97
  }
56
98
 
99
+ /**
100
+ * A reference to the internal reflector node.
101
+ *
102
+ * @type {ReflectorBaseNode}
103
+ */
57
104
  get reflector() {
58
105
 
59
106
  return this._reflectorBaseNode;
60
107
 
61
108
  }
62
109
 
110
+ /**
111
+ * A reference to 3D object the reflector is linked to.
112
+ *
113
+ * @type {Object3D}
114
+ */
63
115
  get target() {
64
116
 
65
117
  return this._reflectorBaseNode.target;
66
118
 
67
119
  }
68
120
 
121
+ /**
122
+ * Returns a node representing the mirror's depth. That can be used
123
+ * to implement more advanced reflection effects like distance attenuation.
124
+ *
125
+ * @return {Node} The depth node.
126
+ */
69
127
  getDepthNode() {
70
128
 
71
129
  if ( this._depthNode === null ) {
@@ -107,7 +165,15 @@ class ReflectorNode extends TextureNode {
107
165
 
108
166
  }
109
167
 
110
-
168
+ /**
169
+ * Holds the actual implementation of the reflector.
170
+ *
171
+ * TODO: Explain why `ReflectorBaseNode`. Originally the entire logic was implemented
172
+ * in `ReflectorNode`, see #29619.
173
+ *
174
+ * @private
175
+ * @augments Node
176
+ */
111
177
  class ReflectorBaseNode extends Node {
112
178
 
113
179
  static get type() {
@@ -116,6 +182,17 @@ class ReflectorBaseNode extends Node {
116
182
 
117
183
  }
118
184
 
185
+ /**
186
+ * Constructs a new reflector base node.
187
+ *
188
+ * @param {TextureNode} textureNode - Represents the rendered reflections as a texture node.
189
+ * @param {Object} [parameters={}] - An object holding configuration parameters.
190
+ * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.
191
+ * @param {Number} [parameters.resolution=1] - The resolution scale.
192
+ * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.
193
+ * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.
194
+ * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not.
195
+ */
119
196
  constructor( textureNode, parameters = {} ) {
120
197
 
121
198
  super();
@@ -128,23 +205,85 @@ class ReflectorBaseNode extends Node {
128
205
  depth = false
129
206
  } = parameters;
130
207
 
131
- //
132
-
208
+ /**
209
+ * Represents the rendered reflections as a texture node.
210
+ *
211
+ * @type {TextureNode}
212
+ */
133
213
  this.textureNode = textureNode;
134
214
 
215
+ /**
216
+ * The 3D object the reflector is linked to.
217
+ *
218
+ * @type {Object3D}
219
+ * @default {new Object3D()}
220
+ */
135
221
  this.target = target;
222
+
223
+ /**
224
+ * The resolution scale.
225
+ *
226
+ * @type {Number}
227
+ * @default {1}
228
+ */
136
229
  this.resolution = resolution;
230
+
231
+ /**
232
+ * Whether mipmaps should be generated or not.
233
+ *
234
+ * @type {Boolean}
235
+ * @default {false}
236
+ */
137
237
  this.generateMipmaps = generateMipmaps;
238
+
239
+ /**
240
+ * Whether reflectors can render other reflector nodes or not.
241
+ *
242
+ * @type {Boolean}
243
+ * @default {true}
244
+ */
138
245
  this.bounces = bounces;
246
+
247
+ /**
248
+ * Whether depth data should be generated or not.
249
+ *
250
+ * @type {Boolean}
251
+ * @default {false}
252
+ */
139
253
  this.depth = depth;
140
254
 
255
+ /**
256
+ * The `updateBeforeType` is set to `NodeUpdateType.RENDER` when {@link ReflectorBaseNode#bounces}
257
+ * is `true`. Otherwise it's `NodeUpdateType.FRAME`.
258
+ *
259
+ * @type {String}
260
+ * @default 'render'
261
+ */
141
262
  this.updateBeforeType = bounces ? NodeUpdateType.RENDER : NodeUpdateType.FRAME;
142
263
 
264
+ /**
265
+ * Weak map for managing virtual cameras.
266
+ *
267
+ * @type {WeakMap<Camera, Camera>}
268
+ */
143
269
  this.virtualCameras = new WeakMap();
270
+
271
+ /**
272
+ * Weak map for managing render targets.
273
+ *
274
+ * @type {WeakMap<Camera, RenderTarget>}
275
+ */
144
276
  this.renderTargets = new WeakMap();
145
277
 
146
278
  }
147
279
 
280
+ /**
281
+ * Updates the resolution of the internal render target.
282
+ *
283
+ * @private
284
+ * @param {RenderTarget} renderTarget - The render target to resize.
285
+ * @param {Renderer} renderer - The renderer that is used to determine the new size.
286
+ */
148
287
  _updateResolution( renderTarget, renderer ) {
149
288
 
150
289
  const resolution = this.resolution;
@@ -163,6 +302,13 @@ class ReflectorBaseNode extends Node {
163
302
 
164
303
  }
165
304
 
305
+ /**
306
+ * Returns a virtual camera for the given camera. The virtual camera is used to
307
+ * render the scene from the reflector's view so correct reflections can be produced.
308
+ *
309
+ * @param {Camera} camera - The scene's camera.
310
+ * @return {Camera} The corresponding virtual camera.
311
+ */
166
312
  getVirtualCamera( camera ) {
167
313
 
168
314
  let virtualCamera = this.virtualCameras.get( camera );
@@ -179,6 +325,13 @@ class ReflectorBaseNode extends Node {
179
325
 
180
326
  }
181
327
 
328
+ /**
329
+ * Returns a render target for the given camera. The reflections are rendered
330
+ * into this render target.
331
+ *
332
+ * @param {Camera} camera - The scene's camera.
333
+ * @return {RenderTarget} The render target.
334
+ */
182
335
  getRenderTarget( camera ) {
183
336
 
184
337
  let renderTarget = this.renderTargets.get( camera );
@@ -210,7 +363,7 @@ class ReflectorBaseNode extends Node {
210
363
 
211
364
  updateBefore( frame ) {
212
365
 
213
- if ( this.bounces === false && _inReflector ) return;
366
+ if ( this.bounces === false && _inReflector ) return false;
214
367
 
215
368
  _inReflector = true;
216
369
 
@@ -307,14 +460,17 @@ class ReflectorBaseNode extends Node {
307
460
 
308
461
  const currentRenderTarget = renderer.getRenderTarget();
309
462
  const currentMRT = renderer.getMRT();
463
+ const currentAutoClear = renderer.autoClear;
310
464
 
311
465
  renderer.setMRT( null );
312
466
  renderer.setRenderTarget( renderTarget );
467
+ renderer.autoClear = true;
313
468
 
314
469
  renderer.render( scene, virtualCamera );
315
470
 
316
471
  renderer.setMRT( currentMRT );
317
472
  renderer.setRenderTarget( currentRenderTarget );
473
+ renderer.autoClear = currentAutoClear;
318
474
 
319
475
  material.visible = true;
320
476
 
@@ -324,6 +480,20 @@ class ReflectorBaseNode extends Node {
324
480
 
325
481
  }
326
482
 
483
+ /**
484
+ * TSL function for creating a reflector node.
485
+ *
486
+ * @function
487
+ * @param {Object} [parameters={}] - An object holding configuration parameters.
488
+ * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.
489
+ * @param {Number} [parameters.resolution=1] - The resolution scale.
490
+ * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.
491
+ * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.
492
+ * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not.
493
+ * @param {TextureNode} [parameters.defaultTexture] - The default texture node.
494
+ * @param {ReflectorBaseNode} [parameters.reflector] - The reflector base node.
495
+ * @returns {ReflectorNode}
496
+ */
327
497
  export const reflector = ( parameters ) => nodeObject( new ReflectorNode( parameters ) );
328
498
 
329
499
  export default ReflectorNode;