@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +2 -1
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +22 -8
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +57 -38
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +679 -300
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +48 -8
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +11 -2
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -1,6 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
- import { nodeObject, nodeArray } from '../tsl/TSLBase.js';
3
+ import { nodeObject, nodeArray, Fn } from '../tsl/TSLBase.js';
4
4
 
5
5
  /**
6
6
  * This module offers a variety of ways to implement loops in TSL. In it's basic form it's:
@@ -101,9 +101,17 @@ class LoopNode extends Node {
101
101
 
102
102
  const stack = builder.addStack(); // TODO: cache() it
103
103
 
104
- properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, stack, builder );
104
+ properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, builder );
105
105
  properties.stackNode = stack;
106
106
 
107
+ const baseParam = this.params[ 0 ];
108
+
109
+ if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
110
+
111
+ properties.updateNode = Fn( this.params[ 0 ].update )( inputs );
112
+
113
+ }
114
+
107
115
  builder.removeStack();
108
116
 
109
117
  return properties;
@@ -222,30 +230,69 @@ class LoopNode extends Node {
222
230
  const startSnippet = internalParam.start;
223
231
  const endSnippet = internalParam.end;
224
232
 
225
- let declarationSnippet = '';
226
- let conditionalSnippet = '';
227
- let updateSnippet = '';
233
+ let updateSnippet;
234
+
235
+ const deltaOperator = () => condition.includes( '<' ) ? '+=' : '-=';
236
+
237
+ if ( update !== undefined && update !== null ) {
238
+
239
+ switch ( typeof update ) {
240
+
241
+ case 'function':
242
+
243
+ const flow = builder.flowStagesNode( properties.updateNode, 'void' );
244
+ const snippet = flow.code.replace( /\t|;/g, '' );
245
+
246
+ updateSnippet = snippet;
247
+
248
+ break;
249
+
250
+ case 'number':
251
+
252
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + builder.generateConst( type, update );
253
+
254
+ break;
255
+
256
+ case 'string':
257
+
258
+ updateSnippet = name + ' ' + update;
259
+
260
+ break;
261
+
262
+ default:
263
+
264
+ if ( update.isNode ) {
228
265
 
229
- if ( ! update ) {
266
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + update.build( builder );
267
+
268
+ } else {
269
+
270
+ console.error( 'THREE.TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
271
+
272
+ updateSnippet = 'break /* invalid update */';
273
+
274
+ }
275
+
276
+ }
277
+
278
+ } else {
230
279
 
231
280
  if ( type === 'int' || type === 'uint' ) {
232
281
 
233
- if ( condition.includes( '<' ) ) update = '++';
234
- else update = '--';
282
+ update = condition.includes( '<' ) ? '++' : '--';
235
283
 
236
284
  } else {
237
285
 
238
- if ( condition.includes( '<' ) ) update = '+= 1.';
239
- else update = '-= 1.';
286
+ update = deltaOperator() + ' 1.';
240
287
 
241
288
  }
242
289
 
243
- }
290
+ updateSnippet = name + ' ' + update;
244
291
 
245
- declarationSnippet += builder.getVar( type, name ) + ' = ' + startSnippet;
292
+ }
246
293
 
247
- conditionalSnippet += name + ' ' + condition + ' ' + endSnippet;
248
- updateSnippet += name + ' ' + update;
294
+ const declarationSnippet = builder.getVar( type, name ) + ' = ' + startSnippet;
295
+ const conditionalSnippet = name + ' ' + condition + ' ' + endSnippet;
249
296
 
250
297
  loopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
251
298
 
@@ -285,7 +332,7 @@ export default LoopNode;
285
332
  * @param {...any} params - A list of parameters.
286
333
  * @returns {LoopNode}
287
334
  */
288
- export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).append();
335
+ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).toStack();
289
336
 
290
337
  /**
291
338
  * TSL function for creating a `Continue()` expression.
@@ -294,7 +341,7 @@ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params
294
341
  * @function
295
342
  * @returns {ExpressionNode}
296
343
  */
297
- export const Continue = () => expression( 'continue' ).append();
344
+ export const Continue = () => expression( 'continue' ).toStack();
298
345
 
299
346
  /**
300
347
  * TSL function for creating a `Break()` expression.
@@ -303,21 +350,4 @@ export const Continue = () => expression( 'continue' ).append();
303
350
  * @function
304
351
  * @returns {ExpressionNode}
305
352
  */
306
- export const Break = () => expression( 'break' ).append();
307
-
308
- // Deprecated
309
-
310
- /**
311
- * @tsl
312
- * @function
313
- * @deprecated since r168. Use {@link Loop} instead.
314
- *
315
- * @param {...any} params
316
- * @returns {LoopNode}
317
- */
318
- export const loop = ( ...params ) => { // @deprecated, r168
319
-
320
- console.warn( 'THREE.TSL: loop() has been renamed to Loop().' );
321
- return Loop( ...params );
322
-
323
- };
353
+ export const Break = () => expression( 'break' ).toStack();
@@ -0,0 +1,22 @@
1
+ import { normalView } from '../accessors/Normal.js';
2
+ import { positionViewDirection } from '../accessors/Position.js';
3
+ import { Fn, vec2, vec3 } from '../tsl/TSLBase.js';
4
+
5
+ /**
6
+ * TSL function for creating a matcap uv node.
7
+ *
8
+ * Can be used to compute texture coordinates for projecting a
9
+ * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}.
10
+ *
11
+ * @tsl
12
+ * @function
13
+ * @returns {Node<vec2>} The matcap UV coordinates.
14
+ */
15
+ export const matcapUV = /*@__PURE__*/ Fn( () => {
16
+
17
+ const x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize();
18
+ const y = positionViewDirection.cross( x );
19
+
20
+ return vec2( x.dot( normalView ), y.dot( normalView ) ).mul( 0.495 ).add( 0.5 ); // 0.495 to remove artifacts caused by undersized matcap disks
21
+
22
+ } ).once( [ 'NORMAL', 'VERTEX' ] )().toVar( 'matcapUV' );
@@ -41,6 +41,15 @@ class RTTNode extends TextureNode {
41
41
 
42
42
  super( renderTarget.texture, uv() );
43
43
 
44
+ /**
45
+ * This flag can be used for type testing.
46
+ *
47
+ * @type {boolean}
48
+ * @readonly
49
+ * @default true
50
+ */
51
+ this.isRTTNode = true;
52
+
44
53
  /**
45
54
  * The node to render a texture with.
46
55
  *
@@ -131,7 +140,7 @@ class RTTNode extends TextureNode {
131
140
  * @readonly
132
141
  * @default true
133
142
  */
134
- get autoSize() {
143
+ get autoResize() {
135
144
 
136
145
  return this.width === null;
137
146
 
@@ -188,13 +197,21 @@ class RTTNode extends TextureNode {
188
197
 
189
198
  //
190
199
 
191
- if ( this.autoSize === true ) {
192
-
193
- this.pixelRatio = renderer.getPixelRatio();
200
+ if ( this.autoResize === true ) {
194
201
 
202
+ const pixelRatio = renderer.getPixelRatio();
195
203
  const size = renderer.getSize( _size );
196
204
 
197
- this.setSize( size.width, size.height );
205
+ const effectiveWidth = size.width * pixelRatio;
206
+ const effectiveHeight = size.height * pixelRatio;
207
+
208
+ if ( effectiveWidth !== this.renderTarget.width || effectiveHeight !== this.renderTarget.height ) {
209
+
210
+ this.renderTarget.setSize( effectiveWidth, effectiveHeight );
211
+
212
+ this.textureNeedsUpdate = true;
213
+
214
+ }
198
215
 
199
216
  }
200
217
 
@@ -154,10 +154,28 @@ class ReflectorNode extends TextureNode {
154
154
 
155
155
  clone() {
156
156
 
157
- const texture = new this.constructor( this.reflectorNode );
158
- texture._reflectorBaseNode = this._reflectorBaseNode;
157
+ const newNode = new this.constructor( this.reflectorNode );
158
+ newNode.uvNode = this.uvNode;
159
+ newNode.levelNode = this.levelNode;
160
+ newNode.biasNode = this.biasNode;
161
+ newNode.sampler = this.sampler;
162
+ newNode.depthNode = this.depthNode;
163
+ newNode.compareNode = this.compareNode;
164
+ newNode.gradNode = this.gradNode;
165
+ newNode._reflectorBaseNode = this._reflectorBaseNode;
166
+
167
+ return newNode;
159
168
 
160
- return texture;
169
+ }
170
+
171
+ /**
172
+ * Frees internal resources. Should be called when the node is no longer in use.
173
+ */
174
+ dispose() {
175
+
176
+ super.dispose();
177
+
178
+ this._reflectorBaseNode.dispose();
161
179
 
162
180
  }
163
181
 
@@ -269,9 +287,9 @@ class ReflectorBaseNode extends Node {
269
287
  /**
270
288
  * Weak map for managing render targets.
271
289
  *
272
- * @type {WeakMap<Camera, RenderTarget>}
290
+ * @type {Map<Camera, RenderTarget>}
273
291
  */
274
- this.renderTargets = new WeakMap();
292
+ this.renderTargets = new Map();
275
293
 
276
294
  /**
277
295
  * Force render even if reflector is facing away from camera.
@@ -281,6 +299,17 @@ class ReflectorBaseNode extends Node {
281
299
  */
282
300
  this.forceUpdate = false;
283
301
 
302
+ /**
303
+ * Whether the reflector has been rendered or not.
304
+ *
305
+ * When the reflector is facing away from the camera,
306
+ * this flag is set to `false` and the texture will be empty(black).
307
+ *
308
+ * @type {boolean}
309
+ * @default {false}
310
+ */
311
+ this.hasOutput = false;
312
+
284
313
  }
285
314
 
286
315
  /**
@@ -308,6 +337,21 @@ class ReflectorBaseNode extends Node {
308
337
 
309
338
  }
310
339
 
340
+ /**
341
+ * Frees internal resources. Should be called when the node is no longer in use.
342
+ */
343
+ dispose() {
344
+
345
+ super.dispose();
346
+
347
+ for ( const renderTarget of this.renderTargets.values() ) {
348
+
349
+ renderTarget.dispose();
350
+
351
+ }
352
+
353
+ }
354
+
311
355
  /**
312
356
  * Returns a virtual camera for the given camera. The virtual camera is used to
313
357
  * render the scene from the reflector's view so correct reflections can be produced.
@@ -398,7 +442,21 @@ class ReflectorBaseNode extends Node {
398
442
  // Avoid rendering when reflector is facing away unless forcing an update
399
443
  const isFacingAway = _view.dot( _normal ) > 0;
400
444
 
401
- if ( isFacingAway === true && this.forceUpdate === false ) return;
445
+ let needsClear = false;
446
+
447
+ if ( isFacingAway === true && this.forceUpdate === false ) {
448
+
449
+ if ( this.hasOutput === false ) {
450
+
451
+ _inReflector = false;
452
+
453
+ return;
454
+
455
+ }
456
+
457
+ needsClear = true;
458
+
459
+ }
402
460
 
403
461
  _view.reflect( _normal ).negate();
404
462
  _view.add( _reflectorWorldPosition );
@@ -473,7 +531,19 @@ class ReflectorBaseNode extends Node {
473
531
  renderer.setRenderTarget( renderTarget );
474
532
  renderer.autoClear = true;
475
533
 
476
- renderer.render( scene, virtualCamera );
534
+ if ( needsClear ) {
535
+
536
+ renderer.clear();
537
+
538
+ this.hasOutput = false;
539
+
540
+ } else {
541
+
542
+ renderer.render( scene, virtualCamera );
543
+
544
+ this.hasOutput = true;
545
+
546
+ }
477
547
 
478
548
  renderer.setMRT( currentMRT );
479
549
  renderer.setRenderTarget( currentRenderTarget );
@@ -0,0 +1,81 @@
1
+ import Node from '../core/Node.js';
2
+ import { uv } from '../accessors/UV.js';
3
+ import { nodeObject } from '../tsl/TSLCore.js';
4
+
5
+ /**
6
+ * Class representing a node that samples a value using a provided callback function.
7
+ *
8
+ * @extends Node
9
+ */
10
+ class SampleNode extends Node {
11
+
12
+ /**
13
+ * Returns the type of the node.
14
+ *
15
+ * @type {string}
16
+ * @readonly
17
+ * @static
18
+ */
19
+ static get type() {
20
+
21
+ return 'SampleNode';
22
+
23
+ }
24
+
25
+ /**
26
+ * Creates an instance of SampleNode.
27
+ *
28
+ * @param {Function} callback - The function to be called when sampling. Should accept a UV node and return a value.
29
+ */
30
+ constructor( callback ) {
31
+
32
+ super();
33
+
34
+ this.callback = callback;
35
+
36
+ /**
37
+ * This flag can be used for type testing.
38
+ *
39
+ * @type {boolean}
40
+ * @readonly
41
+ * @default true
42
+ */
43
+ this.isSampleNode = true;
44
+
45
+ }
46
+
47
+ /**
48
+ * Sets up the node by sampling with the default UV accessor.
49
+ *
50
+ * @returns {Node} The result of the callback function when called with the UV node.
51
+ */
52
+ setup() {
53
+
54
+ return this.sample( uv() );
55
+
56
+ }
57
+
58
+ /**
59
+ * Calls the callback function with the provided UV node.
60
+ *
61
+ * @param {Node<vec2>} uv - The UV node or value to be passed to the callback.
62
+ * @returns {Node} The result of the callback function.
63
+ */
64
+ sample( uv ) {
65
+
66
+ return this.callback( uv );
67
+
68
+ }
69
+
70
+ }
71
+
72
+ export default SampleNode;
73
+
74
+ /**
75
+ * Helper function to create a SampleNode wrapped as a node object.
76
+ *
77
+ * @function
78
+ * @param {Function} callback - The function to be called when sampling. Should accept a UV node and return a value.
79
+ * @returns {SampleNode} The created SampleNode instance wrapped as a node object.
80
+ */
81
+ export const sample = ( callback ) => nodeObject( new SampleNode( callback ) );
@@ -0,0 +1,65 @@
1
+ import { add } from '../math/OperatorNode.js';
2
+ import { normalLocal } from '../accessors/Normal.js';
3
+ import { positionLocal } from '../accessors/Position.js';
4
+ import { texture } from '../accessors/TextureNode.js';
5
+ import { float, vec3, Fn } from '../tsl/TSLBase.js';
6
+
7
+ /**
8
+ * TSL function for creating a triplanar textures node.
9
+ *
10
+ * Can be used for triplanar texture mapping.
11
+ *
12
+ * ```js
13
+ * material.colorNode = triplanarTexture( texture( diffuseMap ) );
14
+ * ```
15
+ *
16
+ * @tsl
17
+ * @function
18
+ * @param {Node} textureXNode - First texture node.
19
+ * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead.
20
+ * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead.
21
+ * @param {?Node<float>} [scaleNode=float(1)] - The scale node.
22
+ * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space.
23
+ * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space.
24
+ * @returns {Node<vec4>}
25
+ */
26
+ export const triplanarTextures = /*@__PURE__*/ Fn( ( [ textureXNode, textureYNode = null, textureZNode = null, scaleNode = float( 1 ), positionNode = positionLocal, normalNode = normalLocal ] ) => {
27
+
28
+ // Reference: https://github.com/keijiro/StandardTriplanar
29
+
30
+ // Blending factor of triplanar mapping
31
+ let bf = normalNode.abs().normalize();
32
+ bf = bf.div( bf.dot( vec3( 1.0 ) ) );
33
+
34
+ // Triplanar mapping
35
+ const tx = positionNode.yz.mul( scaleNode );
36
+ const ty = positionNode.zx.mul( scaleNode );
37
+ const tz = positionNode.xy.mul( scaleNode );
38
+
39
+ // Base color
40
+ const textureX = textureXNode.value;
41
+ const textureY = textureYNode !== null ? textureYNode.value : textureX;
42
+ const textureZ = textureZNode !== null ? textureZNode.value : textureX;
43
+
44
+ const cx = texture( textureX, tx ).mul( bf.x );
45
+ const cy = texture( textureY, ty ).mul( bf.y );
46
+ const cz = texture( textureZ, tz ).mul( bf.z );
47
+
48
+ return add( cx, cy, cz );
49
+
50
+ } );
51
+
52
+ /**
53
+ * TSL function for creating a triplanar textures node.
54
+ *
55
+ * @tsl
56
+ * @function
57
+ * @param {Node} textureXNode - First texture node.
58
+ * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead.
59
+ * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead.
60
+ * @param {?Node<float>} [scaleNode=float(1)] - The scale node.
61
+ * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space.
62
+ * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space.
63
+ * @returns {Node<vec4>}
64
+ */
65
+ export const triplanarTexture = ( ...params ) => triplanarTextures( ...params );
@@ -10,6 +10,7 @@ import { Sphere } from '../math/Sphere.js';
10
10
  import { Frustum } from '../math/Frustum.js';
11
11
  import { Vector3 } from '../math/Vector3.js';
12
12
  import { Color } from '../math/Color.js';
13
+ import { FrustumArray } from '../math/FrustumArray.js';
13
14
 
14
15
  function ascIdSort( a, b ) {
15
16
 
@@ -79,6 +80,7 @@ class MultiDrawRenderList {
79
80
  const _matrix = /*@__PURE__*/ new Matrix4();
80
81
  const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
81
82
  const _frustum = /*@__PURE__*/ new Frustum();
83
+ const _frustumArray = /*@__PURE__*/ new FrustumArray();
82
84
  const _box = /*@__PURE__*/ new Box3();
83
85
  const _sphere = /*@__PURE__*/ new Sphere();
84
86
  const _vector = /*@__PURE__*/ new Vector3();
@@ -1249,7 +1251,7 @@ class BatchedMesh extends Mesh {
1249
1251
  const availableInstanceIds = this._availableInstanceIds;
1250
1252
  const instanceInfo = this._instanceInfo;
1251
1253
  availableInstanceIds.sort( ascIdSort );
1252
- while ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length ) {
1254
+ while ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {
1253
1255
 
1254
1256
  instanceInfo.pop();
1255
1257
  availableInstanceIds.pop();
@@ -1441,15 +1443,24 @@ class BatchedMesh extends Mesh {
1441
1443
  } ) );
1442
1444
  this._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );
1443
1445
 
1446
+ this._availableInstanceIds = source._availableInstanceIds.slice();
1447
+ this._availableGeometryIds = source._availableGeometryIds.slice();
1448
+
1449
+ this._nextIndexStart = source._nextIndexStart;
1450
+ this._nextVertexStart = source._nextVertexStart;
1451
+ this._geometryCount = source._geometryCount;
1452
+
1444
1453
  this._maxInstanceCount = source._maxInstanceCount;
1445
1454
  this._maxVertexCount = source._maxVertexCount;
1446
1455
  this._maxIndexCount = source._maxIndexCount;
1447
1456
 
1448
1457
  this._geometryInitialized = source._geometryInitialized;
1449
- this._geometryCount = source._geometryCount;
1450
1458
  this._multiDrawCounts = source._multiDrawCounts.slice();
1451
1459
  this._multiDrawStarts = source._multiDrawStarts.slice();
1452
1460
 
1461
+ this._indirectTexture = source._indirectTexture.clone();
1462
+ this._indirectTexture.image.data = this._indirectTexture.image.data.slice();
1463
+
1453
1464
  this._matricesTexture = source._matricesTexture.clone();
1454
1465
  this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
1455
1466
 
@@ -1511,15 +1522,18 @@ class BatchedMesh extends Mesh {
1511
1522
  const indirectTexture = this._indirectTexture;
1512
1523
  const indirectArray = indirectTexture.image.data;
1513
1524
 
1525
+ const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
1514
1526
  // prepare the frustum in the local frame
1515
- if ( perObjectFrustumCulled ) {
1527
+ if ( perObjectFrustumCulled && ! camera.isArrayCamera ) {
1516
1528
 
1517
1529
  _matrix
1518
1530
  .multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )
1519
1531
  .multiply( this.matrixWorld );
1532
+
1520
1533
  _frustum.setFromProjectionMatrix(
1521
1534
  _matrix,
1522
- renderer.coordinateSystem
1535
+ camera.coordinateSystem,
1536
+ camera.reversedDepth
1523
1537
  );
1524
1538
 
1525
1539
  }
@@ -1546,7 +1560,7 @@ class BatchedMesh extends Mesh {
1546
1560
  let culled = false;
1547
1561
  if ( perObjectFrustumCulled ) {
1548
1562
 
1549
- culled = ! _frustum.intersectsSphere( _sphere );
1563
+ culled = ! frustum.intersectsSphere( _sphere, camera );
1550
1564
 
1551
1565
  }
1552
1566
 
@@ -1603,7 +1617,7 @@ class BatchedMesh extends Mesh {
1603
1617
  // get the bounds in world space
1604
1618
  this.getMatrixAt( i, _matrix );
1605
1619
  this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
1606
- culled = ! _frustum.intersectsSphere( _sphere );
1620
+ culled = ! frustum.intersectsSphere( _sphere, camera );
1607
1621
 
1608
1622
  }
1609
1623
 
@@ -94,6 +94,15 @@ class Mesh extends Object3D {
94
94
  */
95
95
  this.morphTargetInfluences = undefined;
96
96
 
97
+ /**
98
+ * The number of instances of this mesh.
99
+ * Can only be used with {@link WebGPURenderer}.
100
+ *
101
+ * @type {number}
102
+ * @default 1
103
+ */
104
+ this.count = 1;
105
+
97
106
  this.updateMorphTargets();
98
107
 
99
108
  }
@@ -350,7 +350,7 @@ class Skeleton {
350
350
 
351
351
  const data = {
352
352
  metadata: {
353
- version: 4.6,
353
+ version: 4.7,
354
354
  type: 'Skeleton',
355
355
  generator: 'Skeleton.toJSON'
356
356
  },
@@ -108,6 +108,15 @@ class Sprite extends Object3D {
108
108
  */
109
109
  this.center = new Vector2( 0.5, 0.5 );
110
110
 
111
+ /**
112
+ * The number of instances of this sprite.
113
+ * Can only be used with {@link WebGPURenderer}.
114
+ *
115
+ * @type {number}
116
+ * @default 1
117
+ */
118
+ this.count = 1;
119
+
111
120
  }
112
121
 
113
122
  /**
@@ -37,6 +37,7 @@ class WebGL3DRenderTarget extends WebGLRenderTarget {
37
37
  * @type {Data3DTexture}
38
38
  */
39
39
  this.texture = new Data3DTexture( null, width, height, depth );
40
+ this._setTextureOptions( options );
40
41
 
41
42
  this.texture.isRenderTargetTexture = true;
42
43
 
@@ -37,6 +37,7 @@ class WebGLArrayRenderTarget extends WebGLRenderTarget {
37
37
  * @type {DataArrayTexture}
38
38
  */
39
39
  this.texture = new DataArrayTexture( null, width, height, depth );
40
+ this._setTextureOptions( options );
40
41
 
41
42
  this.texture.isRenderTargetTexture = true;
42
43
 
@@ -41,7 +41,8 @@ class WebGLCubeRenderTarget extends WebGLRenderTarget {
41
41
  *
42
42
  * @type {DataArrayTexture}
43
43
  */
44
- this.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace );
44
+ this.texture = new CubeTexture( images );
45
+ this._setTextureOptions( options );
45
46
 
46
47
  // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)
47
48
  // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,
@@ -53,9 +54,6 @@ class WebGLCubeRenderTarget extends WebGLRenderTarget {
53
54
 
54
55
  this.texture.isRenderTargetTexture = true;
55
56
 
56
- this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;
57
- this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;
58
-
59
57
  }
60
58
 
61
59
  /**