@plastic-software/three 0.181.3 → 0.183.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 (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -9,7 +9,7 @@ import RenderLists from './RenderLists.js';
9
9
  import RenderContexts from './RenderContexts.js';
10
10
  import Textures from './Textures.js';
11
11
  import Background from './Background.js';
12
- import Nodes from './nodes/Nodes.js';
12
+ import NodeManager from './nodes/NodeManager.js';
13
13
  import Color4 from './Color4.js';
14
14
  import ClippingContext from './ClippingContext.js';
15
15
  import QuadMesh from './QuadMesh.js';
@@ -30,11 +30,12 @@ import { Matrix4 } from '../../math/Matrix4.js';
30
30
  import { Vector2 } from '../../math/Vector2.js';
31
31
  import { Vector4 } from '../../math/Vector4.js';
32
32
  import { RenderTarget } from '../../core/RenderTarget.js';
33
- import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
33
+ import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, VSMShadowMap } from '../../constants.js';
34
34
 
35
- import { float, vec3, vec4 } from '../../nodes/tsl/TSLCore.js';
35
+ import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js';
36
36
  import { reference } from '../../nodes/accessors/ReferenceNode.js';
37
37
  import { highpModelNormalViewMatrix, highpModelViewMatrix } from '../../nodes/accessors/ModelNode.js';
38
+ import { context } from '../../nodes/core/ContextNode.js';
38
39
  import { error, warn, warnOnce } from '../../utils.js';
39
40
 
40
41
  const _scene = /*@__PURE__*/ new Scene();
@@ -46,6 +47,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray();
46
47
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
47
48
  const _vector4 = /*@__PURE__*/ new Vector4();
48
49
 
50
+ const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };
51
+
49
52
  /**
50
53
  * Base class for renderers.
51
54
  */
@@ -56,6 +59,7 @@ class Renderer {
56
59
  *
57
60
  * @typedef {Object} Renderer~Options
58
61
  * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
62
+ * @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
59
63
  * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
60
64
  * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
61
65
  * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
@@ -63,7 +67,7 @@ class Renderer {
63
67
  * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. This parameter can set to any other integer value than 0
64
68
  * to overwrite the default.
65
69
  * @property {?Function} [getFallback=null] - This callback function can be used to provide a fallback backend, if the primary backend can't be targeted.
66
- * @property {number} [colorBufferType=HalfFloatType] - Defines the type of color buffers. The default `HalfFloatType` is recommend for best
70
+ * @property {number} [outputBufferType=HalfFloatType] - Defines the type of output buffers. The default `HalfFloatType` is recommend for best
67
71
  * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
68
72
  * @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.
69
73
  */
@@ -90,13 +94,14 @@ class Renderer {
90
94
 
91
95
  const {
92
96
  logarithmicDepthBuffer = false,
97
+ reversedDepthBuffer = false,
93
98
  alpha = true,
94
99
  depth = true,
95
100
  stencil = false,
96
101
  antialias = false,
97
102
  samples = 0,
98
103
  getFallback = null,
99
- colorBufferType = HalfFloatType,
104
+ outputBufferType = HalfFloatType,
100
105
  multiview = false
101
106
  } = parameters;
102
107
 
@@ -157,9 +162,19 @@ class Renderer {
157
162
  *
158
163
  * @type {boolean}
159
164
  * @default false
165
+ * @readonly
160
166
  */
161
167
  this.logarithmicDepthBuffer = logarithmicDepthBuffer;
162
168
 
169
+ /**
170
+ * Whether reversed depth buffer is enabled or not.
171
+ *
172
+ * @type {boolean}
173
+ * @default false
174
+ * @readonly
175
+ */
176
+ this.reversedDepthBuffer = reversedDepthBuffer;
177
+
163
178
  /**
164
179
  * Defines the output color space of the renderer.
165
180
  *
@@ -222,17 +237,13 @@ class Renderer {
222
237
  this.info = new Info();
223
238
 
224
239
  /**
225
- * Stores override nodes for specific transformations or calculations.
240
+ * A global context node that stores override nodes for specific transformations or calculations.
226
241
  * These nodes can be used to replace default behavior in the rendering pipeline.
227
242
  *
228
- * @type {Object}
229
- * @property {?Node} modelViewMatrix - An override node for the model-view matrix.
230
- * @property {?Node} modelNormalViewMatrix - An override node for the model normal view matrix.
243
+ * @type {ContextNode}
244
+ * @property {Object} value - The context value object.
231
245
  */
232
- this.overrideNodes = {
233
- modelViewMatrix: null,
234
- modelNormalViewMatrix: null
235
- };
246
+ this.contextNode = context();
236
247
 
237
248
  /**
238
249
  * The node library defines how certain library objects like materials, lights
@@ -320,7 +331,7 @@ class Renderer {
320
331
  * A reference to a renderer module for managing node related logic.
321
332
  *
322
333
  * @private
323
- * @type {?Nodes}
334
+ * @type {?NodeManager}
324
335
  * @default null
325
336
  */
326
337
  this._nodes = null;
@@ -563,8 +574,7 @@ class Renderer {
563
574
  * and pipeline updates.
564
575
  *
565
576
  * @private
566
- * @type {?Function}
567
- * @default null
577
+ * @type {Function}
568
578
  */
569
579
  this._handleObjectFunction = this._renderObjectDirect;
570
580
 
@@ -587,7 +597,7 @@ class Renderer {
587
597
  this.onDeviceLost = this._onDeviceLost;
588
598
 
589
599
  /**
590
- * Defines the type of color buffers. The default `HalfFloatType` is recommend for
600
+ * Defines the type of output buffers. The default `HalfFloatType` is recommend for
591
601
  * best quality. To save memory and bandwidth, `UnsignedByteType` might be used.
592
602
  * This will reduce rendering quality though.
593
603
  *
@@ -595,7 +605,7 @@ class Renderer {
595
605
  * @type {number}
596
606
  * @default HalfFloatType
597
607
  */
598
- this._colorBufferType = colorBufferType;
608
+ this._outputBufferType = outputBufferType;
599
609
 
600
610
  /**
601
611
  * A cache for shadow nodes per material
@@ -614,6 +624,16 @@ class Renderer {
614
624
  */
615
625
  this._initialized = false;
616
626
 
627
+ /**
628
+ * The call depth of the renderer. Counts the number of
629
+ * nested render calls.
630
+ *
631
+ * @private
632
+ * @type {number}
633
+ * @default - 1
634
+ */
635
+ this._callDepth = - 1;
636
+
617
637
  /**
618
638
  * A reference to the promise which initializes the renderer.
619
639
  *
@@ -652,6 +672,7 @@ class Renderer {
652
672
  * Shadow map configuration
653
673
  * @typedef {Object} ShadowMapConfig
654
674
  * @property {boolean} enabled - Whether to globally enable shadows or not.
675
+ * @property {boolean} transmitted - Whether to enable light transmission through non-opaque materials.
655
676
  * @property {number} type - The shadow map type.
656
677
  */
657
678
 
@@ -662,6 +683,7 @@ class Renderer {
662
683
  */
663
684
  this.shadowMap = {
664
685
  enabled: false,
686
+ transmitted: false,
665
687
  type: PCFShadowMap
666
688
  };
667
689
 
@@ -699,7 +721,7 @@ class Renderer {
699
721
  await this.compileAsync( scene, camera );
700
722
 
701
723
  const renderList = this._renderLists.get( scene, camera );
702
- const renderContext = this._renderContexts.get( scene, camera, this._renderTarget );
724
+ const renderContext = this._renderContexts.get( this._renderTarget, this._mrt );
703
725
 
704
726
  const material = scene.overrideMaterial || object.material;
705
727
 
@@ -763,7 +785,7 @@ class Renderer {
763
785
 
764
786
  }
765
787
 
766
- this._nodes = new Nodes( this, backend );
788
+ this._nodes = new NodeManager( this, backend );
767
789
  this._animation = new Animation( this, this._nodes, this.info );
768
790
  this._attributes = new Attributes( backend );
769
791
  this._background = new Background( this, this._nodes );
@@ -774,7 +796,7 @@ class Renderer {
774
796
  this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
775
797
  this._renderLists = new RenderLists( this.lighting );
776
798
  this._bundles = new RenderBundles();
777
- this._renderContexts = new RenderContexts();
799
+ this._renderContexts = new RenderContexts( this );
778
800
 
779
801
  //
780
802
 
@@ -835,7 +857,7 @@ class Renderer {
835
857
  * @param {Object3D} scene - The scene or 3D object to precompile.
836
858
  * @param {Camera} camera - The camera that is used to render the scene.
837
859
  * @param {?Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.
838
- * @return {Promise<Array|undefined>} A Promise that resolves when the compile has been finished.
860
+ * @return {Promise} A Promise that resolves when the compile has been finished.
839
861
  */
840
862
  async compileAsync( scene, camera, targetScene = null ) {
841
863
 
@@ -850,6 +872,7 @@ class Renderer {
850
872
  const previousRenderId = nodeFrame.renderId;
851
873
  const previousRenderContext = this._currentRenderContext;
852
874
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
875
+ const previousHandleObjectFunction = this._handleObjectFunction;
853
876
  const previousCompilationPromises = this._compilationPromises;
854
877
 
855
878
  //
@@ -859,7 +882,7 @@ class Renderer {
859
882
  if ( targetScene === null ) targetScene = scene;
860
883
 
861
884
  const renderTarget = this._renderTarget;
862
- const renderContext = this._renderContexts.get( targetScene, camera, renderTarget );
885
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt );
863
886
  const activeMipmapLevel = this._activeMipmapLevel;
864
887
 
865
888
  const compilationPromises = [];
@@ -933,7 +956,15 @@ class Renderer {
933
956
 
934
957
  //
935
958
 
936
- this._background.update( sceneRef, renderList, renderContext );
959
+ if ( targetScene !== scene ) {
960
+
961
+ this._background.update( targetScene, renderList, renderContext );
962
+
963
+ } else {
964
+
965
+ this._background.update( sceneRef, renderList, renderContext );
966
+
967
+ }
937
968
 
938
969
  // process render lists
939
970
 
@@ -951,10 +982,9 @@ class Renderer {
951
982
 
952
983
  this._currentRenderContext = previousRenderContext;
953
984
  this._currentRenderObjectFunction = previousRenderObjectFunction;
985
+ this._handleObjectFunction = previousHandleObjectFunction;
954
986
  this._compilationPromises = previousCompilationPromises;
955
987
 
956
- this._handleObjectFunction = this._renderObjectDirect;
957
-
958
988
  // wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete
959
989
 
960
990
  await Promise.all( compilationPromises );
@@ -996,11 +1026,6 @@ class Renderer {
996
1026
 
997
1027
  //
998
1028
 
999
- /**
1000
- * Sets the inspector instance. The inspector can be any class that extends from `InspectorBase`.
1001
- *
1002
- * @param {InspectorBase} value - The new inspector.
1003
- */
1004
1029
  set inspector( value ) {
1005
1030
 
1006
1031
  if ( this._inspector !== null ) {
@@ -1014,6 +1039,11 @@ class Renderer {
1014
1039
 
1015
1040
  }
1016
1041
 
1042
+ /**
1043
+ * The inspector instance. The inspector can be any class that extends from `InspectorBase`.
1044
+ *
1045
+ * @type {InspectorBase}
1046
+ */
1017
1047
  get inspector() {
1018
1048
 
1019
1049
  return this._inspector;
@@ -1031,15 +1061,17 @@ class Renderer {
1031
1061
  */
1032
1062
  set highPrecision( value ) {
1033
1063
 
1064
+ const contextNodeData = this.contextNode.value;
1065
+
1034
1066
  if ( value === true ) {
1035
1067
 
1036
- this.overrideNodes.modelViewMatrix = highpModelViewMatrix;
1037
- this.overrideNodes.modelNormalViewMatrix = highpModelNormalViewMatrix;
1068
+ contextNodeData.modelViewMatrix = highpModelViewMatrix;
1069
+ contextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;
1038
1070
 
1039
1071
  } else if ( this.highPrecision ) {
1040
1072
 
1041
- this.overrideNodes.modelViewMatrix = null;
1042
- this.overrideNodes.modelNormalViewMatrix = null;
1073
+ delete contextNodeData.modelViewMatrix;
1074
+ delete contextNodeData.modelNormalViewMatrix;
1043
1075
 
1044
1076
  }
1045
1077
 
@@ -1053,7 +1085,9 @@ class Renderer {
1053
1085
  */
1054
1086
  get highPrecision() {
1055
1087
 
1056
- return this.overrideNodes.modelViewMatrix === highpModelViewMatrix && this.overrideNodes.modelNormalViewMatrix === highpModelNormalViewMatrix;
1088
+ const contextNodeData = this.contextNode.value;
1089
+
1090
+ return contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;
1057
1091
 
1058
1092
  }
1059
1093
 
@@ -1083,13 +1117,27 @@ class Renderer {
1083
1117
  }
1084
1118
 
1085
1119
  /**
1086
- * Returns the color buffer type.
1120
+ * Returns the output buffer type.
1087
1121
  *
1088
- * @return {number} The color buffer type.
1122
+ * @return {number} The output buffer type.
1089
1123
  */
1090
- getColorBufferType() {
1124
+ getOutputBufferType() {
1091
1125
 
1092
- return this._colorBufferType;
1126
+ return this._outputBufferType;
1127
+
1128
+ }
1129
+
1130
+ /**
1131
+ * Returns the output buffer type.
1132
+ *
1133
+ * @deprecated since r182. Use `.getOutputBufferType()` instead.
1134
+ * @return {number} The output buffer type.
1135
+ */
1136
+ getColorBufferType() { // @deprecated, r182
1137
+
1138
+ warnOnce( 'Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".' );
1139
+
1140
+ return this.getOutputBufferType();
1093
1141
 
1094
1142
  }
1095
1143
 
@@ -1265,7 +1313,7 @@ class Renderer {
1265
1313
  frameBufferTarget = new RenderTarget( width, height, {
1266
1314
  depthBuffer: depth,
1267
1315
  stencilBuffer: stencil,
1268
- type: this._colorBufferType,
1316
+ type: this._outputBufferType,
1269
1317
  format: RGBAFormat,
1270
1318
  colorSpace: ColorManagement.workingColorSpace,
1271
1319
  generateMipmaps: false,
@@ -1333,9 +1381,12 @@ class Renderer {
1333
1381
  const previousRenderId = nodeFrame.renderId;
1334
1382
  const previousRenderContext = this._currentRenderContext;
1335
1383
  const previousRenderObjectFunction = this._currentRenderObjectFunction;
1384
+ const previousHandleObjectFunction = this._handleObjectFunction;
1336
1385
 
1337
1386
  //
1338
1387
 
1388
+ this._callDepth ++;
1389
+
1339
1390
  const sceneRef = ( scene.isScene === true ) ? scene : _scene;
1340
1391
 
1341
1392
  const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
@@ -1361,10 +1412,11 @@ class Renderer {
1361
1412
 
1362
1413
  //
1363
1414
 
1364
- const renderContext = this._renderContexts.get( scene, camera, renderTarget );
1415
+ const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
1365
1416
 
1366
1417
  this._currentRenderContext = renderContext;
1367
1418
  this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
1419
+ this._handleObjectFunction = this._renderObjectDirect;
1368
1420
 
1369
1421
  //
1370
1422
 
@@ -1382,20 +1434,68 @@ class Renderer {
1382
1434
 
1383
1435
  //
1384
1436
 
1385
- const coordinateSystem = this.coordinateSystem;
1437
+
1386
1438
  const xr = this.xr;
1387
1439
 
1388
- if ( camera.coordinateSystem !== coordinateSystem && xr.isPresenting === false ) {
1440
+ if ( xr.isPresenting === false ) {
1441
+
1442
+ let projectionMatrixNeedsUpdate = false;
1443
+
1444
+ // reversed depth
1445
+
1446
+ if ( this.reversedDepthBuffer === true && camera.reversedDepth !== true ) {
1447
+
1448
+ camera._reversedDepth = true;
1449
+
1450
+ if ( camera.isArrayCamera ) {
1451
+
1452
+ for ( const subCamera of camera.cameras ) {
1453
+
1454
+ subCamera._reversedDepth = true;
1455
+
1456
+ }
1457
+
1458
+ }
1459
+
1460
+ projectionMatrixNeedsUpdate = true;
1461
+
1462
+ }
1463
+
1464
+ // WebGPU/WebGL coordinate system
1465
+
1466
+ const coordinateSystem = this.coordinateSystem;
1467
+
1468
+ if ( camera.coordinateSystem !== coordinateSystem ) {
1469
+
1470
+ camera.coordinateSystem = coordinateSystem;
1471
+
1472
+ if ( camera.isArrayCamera ) {
1473
+
1474
+ for ( const subCamera of camera.cameras ) {
1475
+
1476
+ subCamera.coordinateSystem = coordinateSystem;
1477
+
1478
+ }
1479
+
1480
+ }
1481
+
1482
+ projectionMatrixNeedsUpdate = true;
1483
+
1484
+ }
1485
+
1486
+ // camera update
1487
+
1488
+ if ( projectionMatrixNeedsUpdate === true ) {
1389
1489
 
1390
- camera.coordinateSystem = coordinateSystem;
1391
- camera.updateProjectionMatrix();
1490
+ camera.updateProjectionMatrix();
1392
1491
 
1393
- if ( camera.isArrayCamera ) {
1492
+ if ( camera.isArrayCamera ) {
1394
1493
 
1395
- for ( const subCamera of camera.cameras ) {
1494
+ for ( const subCamera of camera.cameras ) {
1396
1495
 
1397
- subCamera.coordinateSystem = coordinateSystem;
1398
- subCamera.updateProjectionMatrix();
1496
+ subCamera.updateProjectionMatrix();
1497
+
1498
+ }
1399
1499
 
1400
1500
  }
1401
1501
 
@@ -1564,9 +1664,12 @@ class Renderer {
1564
1664
 
1565
1665
  this._currentRenderContext = previousRenderContext;
1566
1666
  this._currentRenderObjectFunction = previousRenderObjectFunction;
1667
+ this._handleObjectFunction = previousHandleObjectFunction;
1567
1668
 
1568
1669
  //
1569
1670
 
1671
+ this._callDepth --;
1672
+
1570
1673
  if ( frameBufferTarget !== null ) {
1571
1674
 
1572
1675
  this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
@@ -1842,9 +1945,9 @@ class Renderer {
1842
1945
  /**
1843
1946
  * Defines the scissor rectangle.
1844
1947
  *
1845
- * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.
1948
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.
1846
1949
  * Instead of passing four arguments, the method also works with a single four-dimensional vector.
1847
- * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.
1950
+ * @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.
1848
1951
  * @param {number} width - The width of the scissor box in logical pixel unit.
1849
1952
  * @param {number} height - The height of the scissor box in logical pixel unit.
1850
1953
  */
@@ -1895,8 +1998,8 @@ class Renderer {
1895
1998
  /**
1896
1999
  * Defines the viewport.
1897
2000
  *
1898
- * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.
1899
- * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.
2001
+ * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.
2002
+ * @param {number} y - The vertical coordinate for the upper left corner of the viewport origin in logical pixel unit.
1900
2003
  * @param {number} width - The width of the viewport in logical pixel unit.
1901
2004
  * @param {number} height - The height of the viewport in logical pixel unit.
1902
2005
  * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
@@ -1962,7 +2065,7 @@ class Renderer {
1962
2065
  */
1963
2066
  getClearDepth() {
1964
2067
 
1965
- return this._clearDepth;
2068
+ return ( this.reversedDepthBuffer === true ) ? 1 - this._clearDepth : this._clearDepth;
1966
2069
 
1967
2070
  }
1968
2071
 
@@ -2040,7 +2143,7 @@ class Renderer {
2040
2143
 
2041
2144
  const renderTargetData = this._textures.get( renderTarget );
2042
2145
 
2043
- renderContext = this._renderContexts.getForClear( renderTarget );
2146
+ renderContext = this._renderContexts.get( renderTarget );
2044
2147
  renderContext.textures = renderTargetData.textures;
2045
2148
  renderContext.depthTexture = renderTargetData.depthTexture;
2046
2149
  renderContext.width = renderTargetData.width;
@@ -2049,7 +2152,13 @@ class Renderer {
2049
2152
  renderContext.depth = renderTarget.depthBuffer;
2050
2153
  renderContext.stencil = renderTarget.stencilBuffer;
2051
2154
  // #30329
2052
- renderContext.clearColorValue = this.backend.getClearColor();
2155
+ const color = this.backend.getClearColor();
2156
+ renderContext.clearColorValue.r = color.r;
2157
+ renderContext.clearColorValue.g = color.g;
2158
+ renderContext.clearColorValue.b = color.b;
2159
+ renderContext.clearColorValue.a = color.a;
2160
+ renderContext.clearDepthValue = this.getClearDepth();
2161
+ renderContext.clearStencilValue = this.getClearStencil();
2053
2162
  renderContext.activeCubeFace = this.getActiveCubeFace();
2054
2163
  renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
2055
2164
 
@@ -2360,6 +2469,7 @@ class Renderer {
2360
2469
  /**
2361
2470
  * Resets the renderer to the initial state before WebXR started.
2362
2471
  *
2472
+ * @private
2363
2473
  */
2364
2474
  _resetXRState() {
2365
2475
 
@@ -2641,6 +2751,37 @@ class Renderer {
2641
2751
 
2642
2752
  }
2643
2753
 
2754
+ /**
2755
+ * Initializes the given render target.
2756
+ *
2757
+ * @param {RenderTarget} renderTarget - The render target to intialize.
2758
+ */
2759
+ initRenderTarget( renderTarget ) {
2760
+
2761
+ if ( this._initialized === false ) {
2762
+
2763
+ throw new Error( 'Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
2764
+
2765
+ }
2766
+
2767
+ this._textures.updateRenderTarget( renderTarget );
2768
+
2769
+ const renderTargetData = this._textures.get( renderTarget );
2770
+
2771
+ const renderContext = this._renderContexts.get( renderTarget );
2772
+
2773
+ renderContext.textures = renderTargetData.textures;
2774
+ renderContext.depthTexture = renderTargetData.depthTexture;
2775
+ renderContext.width = renderTargetData.width;
2776
+ renderContext.height = renderTargetData.height;
2777
+ renderContext.renderTarget = renderTarget;
2778
+ renderContext.depth = renderTarget.depthBuffer;
2779
+ renderContext.stencil = renderTarget.stencilBuffer;
2780
+
2781
+ this.backend.initRenderTarget( renderContext );
2782
+
2783
+ }
2784
+
2644
2785
  /**
2645
2786
  * Copies the current bound framebuffer into the given texture.
2646
2787
  *
@@ -2750,6 +2891,7 @@ class Renderer {
2750
2891
  * Analyzes the given 3D object's hierarchy and builds render lists from the
2751
2892
  * processed hierarchy.
2752
2893
  *
2894
+ * @private
2753
2895
  * @param {Object3D} object - The 3D object to process (usually a scene).
2754
2896
  * @param {Camera} camera - The camera the object is rendered with.
2755
2897
  * @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.
@@ -2975,6 +3117,7 @@ class Renderer {
2975
3117
  * Retrieves shadow nodes for the given material. This is used to setup shadow passes.
2976
3118
  * The result is cached per material and updated when the material's version changes.
2977
3119
  *
3120
+ * @private
2978
3121
  * @param {Material} material
2979
3122
  * @returns {Object} - The shadow nodes for the material.
2980
3123
  */
@@ -2989,12 +3132,13 @@ class Renderer {
2989
3132
  const hasMap = material.map !== null;
2990
3133
  const hasColorNode = material.colorNode && material.colorNode.isNode;
2991
3134
  const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
3135
+ const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
2992
3136
 
2993
3137
  let positionNode = null;
2994
3138
  let colorNode = null;
2995
3139
  let depthNode = null;
2996
3140
 
2997
- if ( hasMap || hasColorNode || hasCastShadowNode ) {
3141
+ if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
2998
3142
 
2999
3143
  let shadowRGB;
3000
3144
  let shadowAlpha;
@@ -3004,6 +3148,12 @@ class Renderer {
3004
3148
  shadowRGB = material.castShadowNode.rgb;
3005
3149
  shadowAlpha = material.castShadowNode.a;
3006
3150
 
3151
+ if ( this.shadowMap.transmitted !== true ) {
3152
+
3153
+ warnOnce( 'Renderer: `shadowMap.transmitted` needs to be set to `true` when using `material.castShadowNode`.' );
3154
+
3155
+ }
3156
+
3007
3157
  } else {
3008
3158
 
3009
3159
  shadowRGB = vec3( 0 );
@@ -3025,6 +3175,20 @@ class Renderer {
3025
3175
 
3026
3176
  colorNode = vec4( shadowRGB, shadowAlpha );
3027
3177
 
3178
+ if ( hasMaskNode ) {
3179
+
3180
+ const maskNode = material.maskShadowNode || material.maskNode;
3181
+
3182
+ colorNode = Fn( ( [ color ] ) => {
3183
+
3184
+ maskNode.not().discard();
3185
+
3186
+ return color;
3187
+
3188
+ } )( colorNode );
3189
+
3190
+ }
3191
+
3028
3192
  }
3029
3193
 
3030
3194
  if ( material.depthNode && material.depthNode.isNode ) {
@@ -3093,9 +3257,9 @@ class Renderer {
3093
3257
  materialOverride = true;
3094
3258
 
3095
3259
  // store original nodes
3096
- materialColorNode = scene.overrideMaterial.colorNode;
3097
- materialDepthNode = scene.overrideMaterial.depthNode;
3098
- materialPositionNode = scene.overrideMaterial.positionNode;
3260
+ materialColorNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.colorNode : null;
3261
+ materialDepthNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.depthNode : null;
3262
+ materialPositionNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.positionNode : null;
3099
3263
  materialSide = scene.overrideMaterial.side;
3100
3264
 
3101
3265
  if ( material.positionNode && material.positionNode.isNode ) {
@@ -3114,7 +3278,15 @@ class Renderer {
3114
3278
 
3115
3279
  const { colorNode, depthNode, positionNode } = this._getShadowNodes( material );
3116
3280
 
3117
- overrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;
3281
+ if ( this.shadowMap.type === VSMShadowMap ) {
3282
+
3283
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
3284
+
3285
+ } else {
3286
+
3287
+ overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ];
3288
+
3289
+ }
3118
3290
 
3119
3291
  if ( colorNode !== null ) overrideMaterial.colorNode = colorNode;
3120
3292
  if ( depthNode !== null ) overrideMaterial.depthNode = depthNode;
@@ -3161,6 +3333,19 @@ class Renderer {
3161
3333
 
3162
3334
  }
3163
3335
 
3336
+ /**
3337
+ * Checks if the given compatibility is supported by the selected backend. If the
3338
+ * renderer has not been initialized, this method always returns `false`.
3339
+ *
3340
+ * @param {string} name - The compatibility's name.
3341
+ * @return {boolean} Whether the compatibility is supported or not.
3342
+ */
3343
+ hasCompatibility( name ) {
3344
+
3345
+ return this.backend.hasCompatibility( name );
3346
+
3347
+ }
3348
+
3164
3349
  /**
3165
3350
  * This method represents the default `_handleObjectFunction` implementation which creates
3166
3351
  * a render object from the given data and performs the draw command with the selected backend.
@@ -3181,6 +3366,16 @@ class Renderer {
3181
3366
  renderObject.drawRange = object.geometry.drawRange;
3182
3367
  renderObject.group = group;
3183
3368
 
3369
+ if ( this._currentRenderBundle !== null ) {
3370
+
3371
+ const renderBundleData = this.backend.get( this._currentRenderBundle );
3372
+
3373
+ renderBundleData.renderObjects.push( renderObject );
3374
+
3375
+ renderObject.bundle = this._currentRenderBundle.bundleGroup;
3376
+
3377
+ }
3378
+
3184
3379
  //
3185
3380
 
3186
3381
  const needsRefresh = this._nodes.needsRefresh( renderObject );
@@ -3200,16 +3395,6 @@ class Renderer {
3200
3395
 
3201
3396
  //
3202
3397
 
3203
- if ( this._currentRenderBundle !== null ) {
3204
-
3205
- const renderBundleData = this.backend.get( this._currentRenderBundle );
3206
-
3207
- renderBundleData.renderObjects.push( renderObject );
3208
-
3209
- renderObject.bundle = this._currentRenderBundle.bundleGroup;
3210
-
3211
- }
3212
-
3213
3398
  this.backend.draw( renderObject, this.info );
3214
3399
 
3215
3400
  if ( needsRefresh ) this._nodes.updateAfter( renderObject );