@plastic-software/three 0.167.3 → 0.174.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 (748) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/build/three.cjs +36277 -24023
  4. package/build/three.core.js +48830 -0
  5. package/build/three.core.min.js +6 -0
  6. package/build/three.module.js +10175 -46743
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +550 -0
  9. package/build/three.tsl.min.js +6 -0
  10. package/build/three.webgpu.js +44348 -50670
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +70301 -0
  13. package/build/three.webgpu.nodes.min.js +6 -0
  14. package/examples/jsm/Addons.js +3 -15
  15. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  16. package/examples/jsm/animation/CCDIKSolver.js +61 -11
  17. package/examples/jsm/capabilities/WebGL.js +27 -21
  18. package/examples/jsm/capabilities/WebGPU.js +1 -10
  19. package/examples/jsm/controls/ArcballControls.js +262 -231
  20. package/examples/jsm/controls/DragControls.js +1 -1
  21. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  22. package/examples/jsm/controls/FlyControls.js +194 -188
  23. package/examples/jsm/controls/OrbitControls.js +801 -777
  24. package/examples/jsm/controls/PointerLockControls.js +26 -20
  25. package/examples/jsm/controls/TrackballControls.js +469 -448
  26. package/examples/jsm/controls/TransformControls.js +119 -68
  27. package/examples/jsm/csm/CSM.js +2 -2
  28. package/examples/jsm/csm/CSMFrustum.js +7 -4
  29. package/examples/jsm/csm/CSMHelper.js +2 -0
  30. package/examples/jsm/csm/CSMShadowNode.js +442 -0
  31. package/examples/jsm/curves/NURBSCurve.js +33 -2
  32. package/examples/jsm/curves/NURBSUtils.js +3 -0
  33. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  34. package/examples/jsm/effects/OutlineEffect.js +1 -1
  35. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  36. package/examples/jsm/effects/StereoEffect.js +6 -1
  37. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  38. package/examples/jsm/exporters/EXRExporter.js +19 -11
  39. package/examples/jsm/exporters/GLTFExporter.js +181 -109
  40. package/examples/jsm/exporters/KTX2Exporter.js +54 -23
  41. package/examples/jsm/exporters/OBJExporter.js +5 -1
  42. package/examples/jsm/exporters/PLYExporter.js +11 -9
  43. package/examples/jsm/exporters/USDZExporter.js +50 -11
  44. package/examples/jsm/geometries/DecalGeometry.js +73 -21
  45. package/examples/jsm/geometries/TextGeometry.js +1 -12
  46. package/examples/jsm/helpers/LightProbeHelper.js +43 -44
  47. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  48. package/examples/jsm/helpers/TextureHelperGPU.js +185 -0
  49. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  50. package/examples/jsm/interactive/HTMLMesh.js +1 -0
  51. package/examples/jsm/interactive/InteractiveGroup.js +108 -51
  52. package/examples/jsm/interactive/SelectionHelper.js +3 -1
  53. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  54. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  55. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  56. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  57. package/examples/jsm/lighting/TiledLighting.js +18 -0
  58. package/examples/jsm/lights/LightProbeGenerator.js +26 -12
  59. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  60. package/examples/jsm/lines/LineGeometry.js +25 -0
  61. package/examples/jsm/lines/LineMaterial.js +0 -1
  62. package/examples/jsm/lines/LineSegmentsGeometry.js +2 -0
  63. package/examples/jsm/lines/webgpu/Line2.js +2 -1
  64. package/examples/jsm/lines/webgpu/LineSegments2.js +16 -21
  65. package/examples/jsm/lines/webgpu/Wireframe.js +57 -0
  66. package/examples/jsm/loaders/3DMLoader.js +1 -0
  67. package/examples/jsm/loaders/3MFLoader.js +104 -2
  68. package/examples/jsm/loaders/BVHLoader.js +1 -1
  69. package/examples/jsm/loaders/ColladaLoader.js +15 -12
  70. package/examples/jsm/loaders/DDSLoader.js +42 -0
  71. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  72. package/examples/jsm/loaders/FBXLoader.js +71 -22
  73. package/examples/jsm/loaders/GCodeLoader.js +4 -2
  74. package/examples/jsm/loaders/GLTFLoader.js +29 -14
  75. package/examples/jsm/loaders/KTX2Loader.js +160 -58
  76. package/examples/jsm/loaders/KTXLoader.js +4 -4
  77. package/examples/jsm/loaders/LDrawLoader.js +22 -136
  78. package/examples/jsm/loaders/LottieLoader.js +2 -1
  79. package/examples/jsm/loaders/MTLLoader.js +27 -7
  80. package/examples/jsm/loaders/MaterialXLoader.js +40 -14
  81. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  82. package/examples/jsm/loaders/OBJLoader.js +5 -3
  83. package/examples/jsm/loaders/PCDLoader.js +14 -13
  84. package/examples/jsm/loaders/PDBLoader.js +3 -2
  85. package/examples/jsm/loaders/PLYLoader.js +15 -12
  86. package/examples/jsm/loaders/PVRLoader.js +1 -1
  87. package/examples/jsm/loaders/STLLoader.js +3 -2
  88. package/examples/jsm/loaders/SVGLoader.js +2 -2
  89. package/examples/jsm/loaders/TDSLoader.js +17 -18
  90. package/examples/jsm/loaders/VRMLLoader.js +17 -17
  91. package/examples/jsm/loaders/VTKLoader.js +4 -3
  92. package/examples/jsm/loaders/XYZLoader.js +3 -2
  93. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  94. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +143 -0
  95. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +114 -0
  96. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  97. package/examples/jsm/math/ColorSpaces.js +76 -0
  98. package/examples/jsm/math/ConvexHull.js +1 -1
  99. package/examples/jsm/math/OBB.js +17 -0
  100. package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
  101. package/examples/jsm/misc/ProgressiveLightMap.js +54 -41
  102. package/examples/jsm/misc/ProgressiveLightMapGPU.js +294 -0
  103. package/examples/jsm/misc/Timer.js +27 -12
  104. package/examples/jsm/misc/Volume.js +28 -18
  105. package/examples/jsm/misc/VolumeSlice.js +19 -16
  106. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  107. package/examples/jsm/modifiers/CurveModifierGPU.js +235 -0
  108. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  109. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  110. package/examples/jsm/objects/LensflareMesh.js +324 -0
  111. package/examples/jsm/objects/Reflector.js +5 -2
  112. package/examples/jsm/objects/Sky.js +2 -2
  113. package/examples/jsm/objects/SkyMesh.js +14 -14
  114. package/examples/jsm/objects/Water2.js +1 -1
  115. package/examples/jsm/objects/Water2Mesh.js +11 -9
  116. package/examples/jsm/objects/WaterMesh.js +38 -33
  117. package/examples/jsm/physics/JoltPhysics.js +8 -8
  118. package/examples/jsm/physics/RapierPhysics.js +5 -5
  119. package/examples/jsm/postprocessing/AfterimagePass.js +14 -3
  120. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  121. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  122. package/examples/jsm/postprocessing/OutlinePass.js +37 -51
  123. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  124. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  125. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  126. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  128. package/examples/jsm/postprocessing/SSRPass.js +8 -4
  129. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  130. package/examples/jsm/renderers/CSS2DRenderer.js +6 -3
  131. package/examples/jsm/renderers/CSS3DRenderer.js +7 -4
  132. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  133. package/examples/jsm/shaders/BokehShader2.js +1 -1
  134. package/examples/jsm/shaders/FXAAShader.js +225 -224
  135. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  136. package/examples/jsm/shaders/OutputShader.js +6 -2
  137. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  138. package/examples/jsm/transpiler/AST.js +12 -2
  139. package/examples/jsm/transpiler/GLSLDecoder.js +77 -31
  140. package/examples/jsm/transpiler/ShaderToyDecoder.js +3 -3
  141. package/examples/jsm/transpiler/TSLEncoder.js +96 -21
  142. package/examples/jsm/tsl/display/AfterImageNode.js +243 -0
  143. package/examples/jsm/tsl/display/AnaglyphPassNode.js +106 -0
  144. package/examples/jsm/tsl/display/AnamorphicNode.js +257 -0
  145. package/{src/nodes/display/BleachBypassNode.js → examples/jsm/tsl/display/BleachBypass.js} +11 -6
  146. package/{src/nodes → examples/jsm/tsl}/display/BloomNode.js +252 -67
  147. package/examples/jsm/tsl/display/DenoiseNode.js +332 -0
  148. package/{src/nodes → examples/jsm/tsl}/display/DepthOfFieldNode.js +92 -14
  149. package/examples/jsm/tsl/display/DotScreenNode.js +103 -0
  150. package/examples/jsm/tsl/display/FXAANode.js +364 -0
  151. package/examples/jsm/tsl/display/FilmNode.js +100 -0
  152. package/examples/jsm/tsl/display/GTAONode.js +521 -0
  153. package/examples/jsm/tsl/display/GaussianBlurNode.js +393 -0
  154. package/examples/jsm/tsl/display/LensflareNode.js +278 -0
  155. package/examples/jsm/tsl/display/Lut3DNode.js +108 -0
  156. package/examples/jsm/tsl/display/MotionBlur.js +33 -0
  157. package/examples/jsm/tsl/display/OutlineNode.js +750 -0
  158. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +88 -0
  159. package/{src/nodes → examples/jsm/tsl}/display/PixelationPassNode.js +160 -28
  160. package/examples/jsm/tsl/display/RGBShiftNode.js +95 -0
  161. package/examples/jsm/tsl/display/SMAANode.js +767 -0
  162. package/examples/jsm/tsl/display/SSAAPassNode.js +357 -0
  163. package/examples/jsm/tsl/display/SSRNode.js +538 -0
  164. package/examples/jsm/tsl/display/Sepia.js +24 -0
  165. package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +66 -20
  166. package/examples/jsm/tsl/display/StereoCompositePassNode.js +184 -0
  167. package/examples/jsm/tsl/display/StereoPassNode.js +119 -0
  168. package/examples/jsm/tsl/display/TRAAPassNode.js +451 -0
  169. package/examples/jsm/tsl/display/TransitionNode.js +140 -0
  170. package/examples/jsm/tsl/display/hashBlur.js +34 -0
  171. package/examples/jsm/tsl/lighting/TiledLightsNode.js +395 -0
  172. package/examples/jsm/tsl/math/Bayer.js +18 -0
  173. package/examples/jsm/tsl/utils/Raymarching.js +65 -0
  174. package/examples/jsm/utils/BufferGeometryUtils.js +2 -2
  175. package/examples/jsm/utils/CameraUtils.js +4 -1
  176. package/examples/jsm/utils/GeometryCompressionUtils.js +38 -123
  177. package/examples/jsm/utils/GeometryUtils.js +22 -19
  178. package/examples/jsm/utils/SceneOptimizer.js +410 -0
  179. package/examples/jsm/utils/SceneUtils.js +2 -2
  180. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  181. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  182. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  183. package/examples/jsm/utils/UVsDebug.js +1 -1
  184. package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +1 -0
  185. package/examples/jsm/utils/WebGPUTextureUtils.js +64 -0
  186. package/examples/jsm/webxr/OculusHandPointerModel.js +21 -21
  187. package/examples/jsm/webxr/Text2D.js +6 -6
  188. package/examples/jsm/webxr/XRControllerModelFactory.js +7 -2
  189. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  190. package/package.json +14 -9
  191. package/src/Three.Core.js +182 -0
  192. package/src/Three.Legacy.js +0 -21
  193. package/src/Three.TSL.js +543 -0
  194. package/src/Three.WebGPU.Nodes.js +23 -0
  195. package/src/Three.WebGPU.js +13 -184
  196. package/src/Three.js +1 -176
  197. package/src/animation/AnimationClip.js +2 -2
  198. package/src/animation/AnimationObjectGroup.js +2 -2
  199. package/src/animation/AnimationUtils.js +1 -1
  200. package/src/animation/PropertyBinding.js +2 -2
  201. package/src/audio/Audio.js +379 -2
  202. package/src/audio/AudioAnalyser.js +58 -1
  203. package/src/audio/AudioContext.js +15 -0
  204. package/src/audio/AudioListener.js +76 -0
  205. package/src/audio/PositionalAudio.js +107 -0
  206. package/src/cameras/ArrayCamera.js +29 -0
  207. package/src/cameras/Camera.js +47 -0
  208. package/src/cameras/CubeCamera.js +66 -0
  209. package/src/cameras/OrthographicCamera.js +109 -0
  210. package/src/cameras/PerspectiveCamera.js +173 -34
  211. package/src/cameras/StereoCamera.js +48 -2
  212. package/src/constants.js +6 -6
  213. package/src/core/BufferAttribute.js +4 -9
  214. package/src/core/BufferGeometry.js +48 -8
  215. package/src/core/Clock.js +1 -1
  216. package/src/core/EventDispatcher.js +52 -8
  217. package/src/core/InterleavedBuffer.js +4 -13
  218. package/src/core/Object3D.js +573 -3
  219. package/src/core/RenderTarget.js +22 -4
  220. package/src/core/RenderTarget3D.js +22 -0
  221. package/src/core/RenderTargetArray.js +22 -0
  222. package/src/extras/Controls.js +104 -0
  223. package/src/extras/DataUtils.js +48 -8
  224. package/src/extras/Earcut.js +18 -7
  225. package/src/extras/ImageUtils.js +18 -11
  226. package/src/extras/PMREMGenerator.js +40 -9
  227. package/src/extras/ShapeUtils.js +24 -2
  228. package/src/extras/TextureUtils.js +96 -10
  229. package/src/extras/core/Curve.js +153 -53
  230. package/src/extras/core/CurvePath.js +63 -22
  231. package/src/extras/core/Interpolations.js +29 -3
  232. package/src/extras/core/Path.js +134 -1
  233. package/src/extras/core/Shape.js +66 -3
  234. package/src/extras/core/ShapePath.js +76 -0
  235. package/src/extras/curves/ArcCurve.js +22 -0
  236. package/src/extras/curves/CatmullRomCurve3.js +89 -18
  237. package/src/extras/curves/CubicBezierCurve.js +67 -0
  238. package/src/extras/curves/CubicBezierCurve3.js +50 -0
  239. package/src/extras/curves/EllipseCurve.js +102 -0
  240. package/src/extras/curves/LineCurve.js +36 -0
  241. package/src/extras/curves/LineCurve3.js +36 -0
  242. package/src/extras/curves/QuadraticBezierCurve.js +59 -0
  243. package/src/extras/curves/QuadraticBezierCurve3.js +43 -0
  244. package/src/extras/curves/SplineCurve.js +48 -0
  245. package/src/geometries/BoxGeometry.js +38 -0
  246. package/src/geometries/CapsuleGeometry.js +34 -0
  247. package/src/geometries/CircleGeometry.js +40 -0
  248. package/src/geometries/ConeGeometry.js +38 -0
  249. package/src/geometries/CylinderGeometry.js +50 -4
  250. package/src/geometries/DodecahedronGeometry.js +32 -0
  251. package/src/geometries/EdgesGeometry.js +30 -2
  252. package/src/geometries/ExtrudeGeometry.js +52 -0
  253. package/src/geometries/IcosahedronGeometry.js +32 -0
  254. package/src/geometries/LatheGeometry.js +43 -3
  255. package/src/geometries/OctahedronGeometry.js +32 -0
  256. package/src/geometries/PlaneGeometry.js +34 -0
  257. package/src/geometries/PolyhedronGeometry.js +29 -0
  258. package/src/geometries/RingGeometry.js +36 -0
  259. package/src/geometries/ShapeGeometry.js +37 -0
  260. package/src/geometries/SphereGeometry.js +37 -0
  261. package/src/geometries/TetrahedronGeometry.js +32 -0
  262. package/src/geometries/TorusGeometry.js +35 -0
  263. package/src/geometries/TorusKnotGeometry.js +38 -0
  264. package/src/geometries/TubeGeometry.js +49 -0
  265. package/src/geometries/WireframeGeometry.js +32 -0
  266. package/src/helpers/ArrowHelper.js +60 -3
  267. package/src/helpers/AxesHelper.js +28 -0
  268. package/src/helpers/Box3Helper.js +28 -0
  269. package/src/helpers/BoxHelper.js +43 -7
  270. package/src/helpers/CameraHelper.js +61 -18
  271. package/src/helpers/DirectionalLightHelper.js +52 -0
  272. package/src/helpers/GridHelper.js +26 -0
  273. package/src/helpers/HemisphereLightHelper.js +39 -0
  274. package/src/helpers/PlaneHelper.js +33 -0
  275. package/src/helpers/PointLightHelper.js +43 -0
  276. package/src/helpers/PolarGridHelper.js +30 -0
  277. package/src/helpers/SkeletonHelper.js +39 -2
  278. package/src/helpers/SpotLightHelper.js +40 -0
  279. package/src/lights/AmbientLight.js +25 -0
  280. package/src/lights/DirectionalLight.js +57 -0
  281. package/src/lights/DirectionalLightShadow.js +15 -0
  282. package/src/lights/HemisphereLight.js +32 -0
  283. package/src/lights/Light.js +36 -0
  284. package/src/lights/LightProbe.js +43 -0
  285. package/src/lights/LightShadow.js +159 -0
  286. package/src/lights/PointLight.js +59 -0
  287. package/src/lights/PointLightShadow.js +21 -0
  288. package/src/lights/RectAreaLight.js +59 -0
  289. package/src/lights/SpotLight.js +102 -0
  290. package/src/lights/SpotLightShadow.js +24 -2
  291. package/src/lights/webgpu/IESSpotLight.js +21 -0
  292. package/src/loaders/Loader.js +132 -0
  293. package/src/loaders/MaterialLoader.js +7 -1
  294. package/src/loaders/nodes/NodeLoader.js +189 -0
  295. package/src/loaders/nodes/NodeMaterialLoader.js +108 -0
  296. package/src/loaders/nodes/NodeObjectLoader.js +151 -0
  297. package/src/materials/LineDashedMaterial.js +0 -1
  298. package/src/materials/Material.js +469 -7
  299. package/src/materials/MeshPhongMaterial.js +1 -1
  300. package/src/materials/MeshPhysicalMaterial.js +2 -2
  301. package/src/materials/MeshStandardMaterial.js +2 -2
  302. package/src/{nodes/materials → materials/nodes}/Line2NodeMaterial.js +192 -82
  303. package/src/materials/nodes/LineBasicNodeMaterial.js +46 -0
  304. package/src/materials/nodes/LineDashedNodeMaterial.js +132 -0
  305. package/src/materials/nodes/MeshBasicNodeMaterial.js +133 -0
  306. package/src/materials/nodes/MeshLambertNodeMaterial.js +82 -0
  307. package/src/materials/nodes/MeshMatcapNodeMaterial.js +77 -0
  308. package/src/materials/nodes/MeshNormalNodeMaterial.js +67 -0
  309. package/src/materials/nodes/MeshPhongNodeMaterial.js +141 -0
  310. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +517 -0
  311. package/src/materials/nodes/MeshSSSNodeMaterial.js +175 -0
  312. package/src/materials/nodes/MeshStandardNodeMaterial.js +186 -0
  313. package/src/materials/nodes/MeshToonNodeMaterial.js +66 -0
  314. package/src/materials/nodes/NodeMaterial.js +1180 -0
  315. package/src/{nodes/materials/Materials.js → materials/nodes/NodeMaterials.js} +3 -2
  316. package/src/materials/nodes/PointsNodeMaterial.js +153 -0
  317. package/src/materials/nodes/ShadowNodeMaterial.js +67 -0
  318. package/src/materials/nodes/SpriteNodeMaterial.js +198 -0
  319. package/src/materials/nodes/VolumeNodeMaterial.js +72 -0
  320. package/src/materials/nodes/manager/NodeMaterialObserver.js +509 -0
  321. package/src/math/Box2.js +177 -0
  322. package/src/math/Box3.js +243 -0
  323. package/src/math/Color.js +343 -0
  324. package/src/math/ColorManagement.js +143 -102
  325. package/src/math/Cylindrical.js +65 -6
  326. package/src/math/Euler.js +137 -4
  327. package/src/math/Frustum.js +83 -0
  328. package/src/math/Interpolant.js +87 -8
  329. package/src/math/Line3.js +96 -2
  330. package/src/math/MathUtils.js +182 -19
  331. package/src/math/Matrix2.js +70 -0
  332. package/src/math/Matrix3.js +229 -4
  333. package/src/math/Matrix4.js +368 -3
  334. package/src/math/Plane.js +164 -2
  335. package/src/math/Quaternion.js +265 -9
  336. package/src/math/Ray.js +160 -0
  337. package/src/math/Sphere.js +147 -0
  338. package/src/math/Spherical.js +73 -11
  339. package/src/math/SphericalHarmonics3.js +112 -14
  340. package/src/math/Triangle.js +230 -2
  341. package/src/math/Vector2.js +396 -10
  342. package/src/math/Vector3.js +550 -13
  343. package/src/math/Vector4.js +415 -9
  344. package/src/math/interpolants/CubicInterpolant.js +10 -1
  345. package/src/math/interpolants/DiscreteInterpolant.js +10 -2
  346. package/src/math/interpolants/LinearInterpolant.js +13 -0
  347. package/src/math/interpolants/QuaternionLinearInterpolant.js +10 -1
  348. package/src/nodes/Nodes.js +84 -166
  349. package/src/nodes/TSL.js +167 -0
  350. package/src/nodes/accessors/AccessorsUtils.js +39 -10
  351. package/src/nodes/accessors/Arrays.js +68 -0
  352. package/src/nodes/accessors/BatchNode.js +93 -26
  353. package/src/nodes/accessors/Bitangent.js +54 -0
  354. package/src/nodes/accessors/BufferAttributeNode.js +189 -11
  355. package/src/nodes/accessors/BufferNode.js +70 -5
  356. package/src/nodes/accessors/BuiltinNode.js +63 -0
  357. package/src/nodes/accessors/Camera.js +129 -0
  358. package/src/nodes/accessors/ClippingNode.js +152 -43
  359. package/src/nodes/accessors/CubeTextureNode.js +76 -13
  360. package/src/nodes/accessors/InstanceNode.js +118 -35
  361. package/src/nodes/accessors/InstancedMeshNode.js +50 -0
  362. package/src/nodes/accessors/Lights.js +129 -0
  363. package/src/nodes/accessors/MaterialNode.js +394 -58
  364. package/src/nodes/accessors/MaterialProperties.js +57 -1
  365. package/src/nodes/accessors/MaterialReferenceNode.js +60 -18
  366. package/src/nodes/accessors/ModelNode.js +159 -12
  367. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -36
  368. package/src/nodes/accessors/MorphNode.js +60 -13
  369. package/src/nodes/accessors/Normal.js +156 -0
  370. package/src/nodes/accessors/Object3DNode.js +154 -35
  371. package/src/nodes/accessors/PointUVNode.js +35 -6
  372. package/src/nodes/accessors/Position.js +64 -0
  373. package/src/nodes/accessors/ReferenceBaseNode.js +357 -0
  374. package/src/nodes/accessors/ReferenceNode.js +243 -6
  375. package/src/nodes/accessors/ReflectVector.js +36 -0
  376. package/src/nodes/accessors/RendererReferenceNode.js +57 -7
  377. package/src/nodes/accessors/SceneNode.js +98 -6
  378. package/src/nodes/accessors/SkinningNode.js +214 -21
  379. package/src/nodes/accessors/StorageBufferNode.js +288 -28
  380. package/src/nodes/accessors/StorageTextureNode.js +139 -12
  381. package/src/nodes/accessors/Tangent.js +62 -0
  382. package/src/nodes/accessors/Texture3DNode.js +98 -12
  383. package/src/nodes/accessors/{TextureBicubicNode.js → TextureBicubic.js} +14 -34
  384. package/src/nodes/accessors/TextureNode.js +347 -34
  385. package/src/nodes/accessors/TextureSizeNode.js +51 -9
  386. package/src/nodes/accessors/UV.js +11 -0
  387. package/src/nodes/accessors/UniformArrayNode.js +241 -32
  388. package/src/nodes/accessors/UserDataNode.js +55 -7
  389. package/src/nodes/accessors/VelocityNode.js +223 -0
  390. package/src/nodes/accessors/VertexColorNode.js +45 -6
  391. package/src/nodes/code/CodeNode.js +108 -8
  392. package/src/nodes/code/ExpressionNode.js +38 -7
  393. package/src/nodes/code/FunctionCallNode.js +62 -11
  394. package/src/nodes/code/FunctionNode.js +54 -24
  395. package/src/nodes/code/ScriptableNode.js +241 -17
  396. package/src/nodes/code/ScriptableValueNode.js +93 -8
  397. package/src/nodes/core/ArrayNode.js +142 -0
  398. package/src/nodes/core/AssignNode.js +60 -12
  399. package/src/nodes/core/AttributeNode.js +55 -22
  400. package/src/nodes/core/BypassNode.js +59 -11
  401. package/src/nodes/core/CacheNode.js +64 -10
  402. package/src/nodes/core/ConstNode.js +38 -3
  403. package/src/nodes/core/ContextNode.js +87 -12
  404. package/src/nodes/core/IndexNode.js +102 -10
  405. package/src/nodes/core/InputNode.js +55 -3
  406. package/src/nodes/core/LightingModel.js +65 -5
  407. package/src/nodes/core/MRTNode.js +81 -7
  408. package/src/nodes/core/Node.js +368 -50
  409. package/src/nodes/core/NodeAttribute.js +38 -0
  410. package/src/nodes/core/NodeBuilder.js +1317 -83
  411. package/src/nodes/core/NodeCache.js +41 -2
  412. package/src/nodes/core/NodeCode.js +31 -0
  413. package/src/nodes/core/NodeFrame.js +123 -2
  414. package/src/nodes/core/NodeFunction.js +46 -0
  415. package/src/nodes/core/NodeFunctionInput.js +44 -0
  416. package/src/nodes/core/NodeParser.js +11 -0
  417. package/src/nodes/core/NodeUniform.js +52 -0
  418. package/src/nodes/core/NodeUtils.js +226 -6
  419. package/src/nodes/core/NodeVar.js +47 -1
  420. package/src/nodes/core/NodeVarying.js +28 -0
  421. package/src/nodes/core/OutputStructNode.js +61 -17
  422. package/src/nodes/core/ParameterNode.js +34 -4
  423. package/src/nodes/core/PropertyNode.js +296 -32
  424. package/src/nodes/core/StackNode.js +108 -8
  425. package/src/nodes/core/StructNode.js +120 -0
  426. package/src/nodes/core/StructType.js +13 -0
  427. package/src/nodes/core/StructTypeNode.js +116 -9
  428. package/src/nodes/core/TempNode.js +37 -7
  429. package/src/nodes/core/UniformGroupNode.js +98 -17
  430. package/src/nodes/core/UniformNode.js +72 -4
  431. package/src/nodes/core/VarNode.js +170 -13
  432. package/src/nodes/core/VaryingNode.js +109 -8
  433. package/src/nodes/core/constants.js +40 -0
  434. package/src/nodes/display/BlendModes.js +193 -0
  435. package/src/nodes/display/BumpMapNode.js +47 -10
  436. package/src/nodes/display/ColorAdjustment.js +141 -0
  437. package/src/nodes/display/ColorSpaceFunctions.js +54 -0
  438. package/src/nodes/display/ColorSpaceNode.js +147 -68
  439. package/src/nodes/display/FrontFacingNode.js +39 -6
  440. package/src/nodes/display/NormalMapNode.js +55 -13
  441. package/src/nodes/display/PassNode.js +420 -19
  442. package/src/nodes/display/PosterizeNode.js +40 -7
  443. package/src/nodes/display/RenderOutputNode.js +81 -13
  444. package/src/nodes/display/ScreenNode.js +286 -0
  445. package/src/nodes/display/ToneMappingFunctions.js +242 -0
  446. package/src/nodes/display/ToneMappingNode.js +68 -175
  447. package/src/nodes/display/ToonOutlinePassNode.js +183 -0
  448. package/src/nodes/display/ViewportDepthNode.js +210 -36
  449. package/src/nodes/display/ViewportDepthTextureNode.js +32 -9
  450. package/src/nodes/display/ViewportSharedTextureNode.js +32 -9
  451. package/src/nodes/display/ViewportTextureNode.js +68 -11
  452. package/src/nodes/fog/Fog.js +113 -0
  453. package/src/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  454. package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  455. package/src/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  456. package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
  457. package/src/nodes/functions/BSDF/D_GGX.js +2 -2
  458. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  459. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  460. package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
  461. package/src/nodes/functions/BSDF/LTC.js +50 -6
  462. package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  463. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  464. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  465. package/src/nodes/functions/BasicLightingModel.js +27 -6
  466. package/src/nodes/functions/PhongLightingModel.js +38 -8
  467. package/src/nodes/functions/PhysicalLightingModel.js +215 -51
  468. package/src/nodes/functions/ShadowMaskModel.js +24 -1
  469. package/src/nodes/functions/ToonLightingModel.js +24 -5
  470. package/src/nodes/functions/VolumetricLightingModel.js +183 -0
  471. package/src/nodes/functions/material/getAlphaHashThreshold.js +68 -0
  472. package/src/nodes/functions/material/getGeometryRoughness.js +10 -4
  473. package/src/nodes/functions/material/getParallaxCorrectNormal.js +37 -0
  474. package/src/nodes/functions/material/getRoughness.js +2 -2
  475. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  476. package/src/nodes/geometry/RangeNode.js +62 -7
  477. package/src/nodes/gpgpu/AtomicFunctionNode.js +280 -0
  478. package/src/nodes/gpgpu/BarrierNode.js +89 -0
  479. package/src/nodes/gpgpu/ComputeBuiltinNode.js +227 -0
  480. package/src/nodes/gpgpu/ComputeNode.js +124 -9
  481. package/src/nodes/gpgpu/WorkgroupInfoNode.js +208 -0
  482. package/src/nodes/lighting/AONode.js +24 -3
  483. package/src/nodes/lighting/AmbientLightNode.js +16 -8
  484. package/src/nodes/lighting/AnalyticLightNode.js +151 -231
  485. package/src/nodes/lighting/BasicEnvironmentNode.js +25 -3
  486. package/src/nodes/lighting/BasicLightMapNode.js +25 -5
  487. package/src/nodes/lighting/DirectionalLightNode.js +19 -20
  488. package/src/nodes/lighting/EnvironmentNode.js +34 -17
  489. package/src/nodes/lighting/HemisphereLightNode.js +42 -11
  490. package/src/nodes/lighting/IESSpotLightNode.js +18 -9
  491. package/src/nodes/lighting/IrradianceNode.js +23 -3
  492. package/src/nodes/lighting/LightProbeNode.js +29 -36
  493. package/src/nodes/lighting/LightUtils.js +12 -4
  494. package/src/nodes/lighting/LightingContextNode.js +70 -21
  495. package/src/nodes/lighting/LightingNode.js +22 -9
  496. package/src/nodes/lighting/LightsNode.js +309 -86
  497. package/src/nodes/lighting/PointLightNode.js +66 -32
  498. package/src/nodes/lighting/PointShadowNode.js +306 -0
  499. package/src/nodes/lighting/RectAreaLightNode.js +61 -25
  500. package/src/nodes/lighting/ShadowBaseNode.js +92 -0
  501. package/src/nodes/lighting/ShadowNode.js +812 -0
  502. package/src/nodes/lighting/SpotLightNode.js +73 -31
  503. package/src/nodes/materialx/MaterialXNodes.js +2 -2
  504. package/src/nodes/materialx/lib/mx_hsv.js +27 -22
  505. package/src/nodes/materialx/lib/mx_noise.js +70 -70
  506. package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
  507. package/src/nodes/math/ConditionalNode.js +230 -0
  508. package/src/nodes/math/Hash.js +21 -0
  509. package/src/nodes/math/MathNode.js +812 -131
  510. package/src/nodes/math/MathUtils.js +47 -8
  511. package/src/nodes/math/OperatorNode.js +410 -66
  512. package/src/nodes/math/TriNoise3D.js +32 -32
  513. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  514. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  515. package/src/nodes/pmrem/PMREMNode.js +188 -28
  516. package/src/nodes/pmrem/PMREMUtils.js +24 -24
  517. package/src/nodes/procedural/Checker.js +22 -0
  518. package/src/nodes/shapes/Shapes.js +32 -0
  519. package/src/nodes/tsl/TSLBase.js +31 -0
  520. package/src/nodes/{shadernode/ShaderNode.js → tsl/TSLCore.js} +114 -98
  521. package/src/nodes/utils/ArrayElementNode.js +45 -5
  522. package/src/nodes/utils/ConvertNode.js +39 -4
  523. package/src/nodes/utils/CubeMapNode.js +88 -8
  524. package/src/nodes/utils/Discard.js +24 -0
  525. package/src/nodes/utils/EquirectUVNode.js +39 -7
  526. package/src/nodes/utils/FlipNode.js +106 -0
  527. package/src/nodes/utils/FunctionOverloadingNode.js +61 -6
  528. package/src/nodes/utils/JoinNode.js +31 -3
  529. package/src/nodes/utils/LoopNode.js +95 -9
  530. package/src/nodes/utils/MatcapUVNode.js +27 -8
  531. package/src/nodes/utils/MaxMipLevelNode.js +57 -6
  532. package/src/nodes/utils/MemberNode.js +68 -0
  533. package/src/nodes/utils/Oscillators.js +41 -0
  534. package/src/nodes/utils/Packing.js +21 -0
  535. package/src/nodes/utils/PostProcessingUtils.js +95 -0
  536. package/src/nodes/utils/RTTNode.js +141 -9
  537. package/src/nodes/utils/ReflectorNode.js +295 -21
  538. package/src/nodes/utils/RemapNode.js +93 -10
  539. package/src/nodes/utils/RotateNode.js +48 -13
  540. package/src/nodes/utils/SetNode.js +50 -4
  541. package/src/nodes/utils/SplitNode.js +62 -6
  542. package/src/nodes/utils/SpriteSheetUVNode.js +56 -7
  543. package/src/nodes/utils/SpriteUtils.js +21 -5
  544. package/src/nodes/utils/StorageArrayElementNode.js +64 -12
  545. package/src/nodes/utils/Timer.js +73 -0
  546. package/src/nodes/utils/TriplanarTexturesNode.js +96 -10
  547. package/src/nodes/utils/UVUtils.js +27 -9
  548. package/src/nodes/utils/ViewportUtils.js +16 -4
  549. package/src/objects/BatchedMesh.js +808 -281
  550. package/src/objects/Bone.js +24 -0
  551. package/src/objects/ClippingGroup.js +68 -0
  552. package/src/objects/Group.js +24 -0
  553. package/src/objects/InstancedMesh.js +120 -2
  554. package/src/objects/LOD.js +120 -5
  555. package/src/objects/Line.js +89 -6
  556. package/src/objects/LineLoop.js +20 -0
  557. package/src/objects/LineSegments.js +18 -0
  558. package/src/objects/Mesh.js +82 -23
  559. package/src/objects/Points.js +62 -0
  560. package/src/objects/Skeleton.js +107 -2
  561. package/src/objects/SkinnedMesh.js +99 -5
  562. package/src/objects/Sprite.js +54 -0
  563. package/src/renderers/WebGLRenderer.js +274 -157
  564. package/src/renderers/common/Animation.js +109 -12
  565. package/src/renderers/common/Attributes.js +40 -0
  566. package/src/renderers/common/Backend.js +504 -44
  567. package/src/renderers/common/Background.js +67 -9
  568. package/src/renderers/common/BindGroup.js +45 -1
  569. package/src/renderers/common/Binding.js +35 -0
  570. package/src/renderers/common/Bindings.js +136 -19
  571. package/src/renderers/common/Buffer.js +49 -0
  572. package/src/renderers/common/BufferUtils.js +25 -0
  573. package/src/renderers/common/BundleGroup.js +83 -0
  574. package/src/renderers/common/ChainMap.js +45 -6
  575. package/src/renderers/common/ClippingContext.js +175 -80
  576. package/src/renderers/common/Color4.js +40 -0
  577. package/src/renderers/common/ComputePipeline.js +24 -0
  578. package/src/renderers/common/Constants.js +2 -1
  579. package/src/renderers/common/CubeRenderTarget.js +22 -3
  580. package/src/renderers/common/DataMap.js +37 -1
  581. package/src/renderers/common/Geometries.js +111 -14
  582. package/src/renderers/common/IndirectStorageBufferAttribute.js +38 -0
  583. package/src/renderers/common/Info.js +78 -35
  584. package/src/renderers/common/Lighting.js +73 -0
  585. package/src/renderers/common/Pipeline.js +22 -0
  586. package/src/renderers/common/Pipelines.js +148 -5
  587. package/src/renderers/common/PostProcessing.js +112 -11
  588. package/src/renderers/common/ProgrammableStage.js +60 -2
  589. package/src/renderers/common/QuadMesh.js +56 -5
  590. package/src/renderers/common/RenderBundle.js +14 -8
  591. package/src/renderers/common/RenderBundles.js +39 -10
  592. package/src/renderers/common/RenderContext.js +205 -7
  593. package/src/renderers/common/RenderContexts.js +59 -6
  594. package/src/renderers/common/RenderList.js +230 -21
  595. package/src/renderers/common/RenderLists.js +45 -6
  596. package/src/renderers/common/RenderObject.js +552 -41
  597. package/src/renderers/common/RenderObjects.js +118 -9
  598. package/src/renderers/common/RenderPipeline.js +24 -0
  599. package/src/renderers/common/Renderer.js +1537 -239
  600. package/src/renderers/common/RendererUtils.js +191 -0
  601. package/src/renderers/common/SampledTexture.js +132 -3
  602. package/src/renderers/common/Sampler.js +30 -0
  603. package/src/renderers/common/StorageBuffer.js +24 -0
  604. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  605. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  606. package/src/renderers/common/StorageTexture.js +38 -0
  607. package/src/renderers/common/Textures.js +142 -32
  608. package/src/renderers/common/TimestampQueryPool.js +98 -0
  609. package/src/renderers/common/Uniform.js +225 -3
  610. package/src/renderers/common/UniformBuffer.js +19 -0
  611. package/src/renderers/common/UniformsGroup.js +157 -6
  612. package/src/renderers/common/XRManager.js +1185 -0
  613. package/src/renderers/common/XRRenderTarget.js +74 -0
  614. package/src/renderers/common/extras/PMREMGenerator.js +211 -53
  615. package/src/renderers/common/nodes/NodeBuilderState.js +100 -6
  616. package/src/renderers/common/nodes/NodeLibrary.js +194 -0
  617. package/src/renderers/common/nodes/NodeSampledTexture.js +92 -4
  618. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  619. package/src/renderers/common/nodes/NodeStorageBuffer.js +37 -3
  620. package/src/renderers/common/nodes/NodeUniform.js +285 -2
  621. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  622. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  623. package/src/renderers/common/nodes/Nodes.js +390 -70
  624. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
  625. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
  626. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  627. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +2 -2
  628. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  629. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  630. package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -0
  631. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  632. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  633. package/src/renderers/webgl/WebGLBackground.js +24 -1
  634. package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
  635. package/src/renderers/webgl/WebGLCapabilities.js +2 -0
  636. package/src/renderers/webgl/WebGLGeometries.js +0 -28
  637. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
  638. package/src/renderers/webgl/WebGLProgram.js +27 -29
  639. package/src/renderers/webgl/WebGLPrograms.js +24 -16
  640. package/src/renderers/webgl/WebGLState.js +68 -11
  641. package/src/renderers/webgl/WebGLTextures.js +49 -10
  642. package/src/renderers/webgl-fallback/WebGLBackend.js +1055 -238
  643. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +5 -10
  644. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +425 -48
  645. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +64 -1
  646. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  647. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  648. package/src/renderers/webgl-fallback/utils/WebGLState.js +419 -14
  649. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +281 -59
  650. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +367 -0
  651. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
  652. package/src/renderers/webgpu/WebGPUBackend.js +816 -236
  653. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +78 -0
  654. package/src/renderers/webgpu/WebGPURenderer.js +45 -6
  655. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +63 -0
  656. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +97 -0
  657. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +954 -147
  658. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +29 -4
  659. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  660. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +147 -31
  661. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +213 -31
  662. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +146 -28
  663. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +161 -7
  664. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +333 -50
  665. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +287 -0
  666. package/src/renderers/webgpu/utils/WebGPUUtils.js +131 -3
  667. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  668. package/src/renderers/webxr/WebXRManager.js +54 -32
  669. package/src/scenes/Fog.js +60 -0
  670. package/src/scenes/FogExp2.js +51 -0
  671. package/src/scenes/Scene.js +87 -0
  672. package/src/textures/Data3DTexture.js +2 -2
  673. package/src/textures/DepthTexture.js +2 -0
  674. package/src/textures/Source.js +2 -2
  675. package/src/textures/Texture.js +368 -5
  676. package/src/textures/VideoFrameTexture.js +35 -0
  677. package/src/utils.js +33 -1
  678. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1207
  679. package/examples/jsm/animation/MMDPhysics.js +0 -1406
  680. package/examples/jsm/cameras/CinematicCamera.js +0 -208
  681. package/examples/jsm/controls/Controls.js +0 -32
  682. package/examples/jsm/exporters/MMDExporter.js +0 -217
  683. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -174
  684. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  685. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  686. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  687. package/examples/jsm/loaders/MMDLoader.js +0 -2295
  688. package/examples/jsm/loaders/TiltLoader.js +0 -520
  689. package/examples/jsm/objects/InstancedPoints.js +0 -21
  690. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  691. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  692. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  693. package/src/nodes/accessors/BitangentNode.js +0 -13
  694. package/src/nodes/accessors/CameraNode.js +0 -19
  695. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -21
  696. package/src/nodes/accessors/NormalNode.js +0 -14
  697. package/src/nodes/accessors/PositionNode.js +0 -10
  698. package/src/nodes/accessors/ReflectVectorNode.js +0 -10
  699. package/src/nodes/accessors/TangentNode.js +0 -23
  700. package/src/nodes/accessors/UVNode.js +0 -3
  701. package/src/nodes/core/NodeKeywords.js +0 -80
  702. package/src/nodes/core/UniformGroup.js +0 -13
  703. package/src/nodes/display/AfterImageNode.js +0 -152
  704. package/src/nodes/display/AnamorphicNode.js +0 -145
  705. package/src/nodes/display/BlendModeNode.js +0 -128
  706. package/src/nodes/display/ColorAdjustmentNode.js +0 -104
  707. package/src/nodes/display/DenoiseNode.js +0 -198
  708. package/src/nodes/display/DotScreenNode.js +0 -75
  709. package/src/nodes/display/FXAANode.js +0 -327
  710. package/src/nodes/display/FilmNode.js +0 -52
  711. package/src/nodes/display/GTAONode.js +0 -324
  712. package/src/nodes/display/GaussianBlurNode.js +0 -207
  713. package/src/nodes/display/Lut3DNode.js +0 -53
  714. package/src/nodes/display/RGBShiftNode.js +0 -49
  715. package/src/nodes/display/SepiaNode.js +0 -18
  716. package/src/nodes/display/TransitionNode.js +0 -76
  717. package/src/nodes/display/ViewportNode.js +0 -137
  718. package/src/nodes/fog/FogExp2Node.js +0 -34
  719. package/src/nodes/fog/FogNode.js +0 -48
  720. package/src/nodes/fog/FogRangeNode.js +0 -35
  721. package/src/nodes/lighting/LightNode.js +0 -57
  722. package/src/nodes/loaders/NodeLoader.js +0 -110
  723. package/src/nodes/loaders/NodeMaterialLoader.js +0 -60
  724. package/src/nodes/loaders/NodeObjectLoader.js +0 -71
  725. package/src/nodes/materials/InstancedPointsNodeMaterial.js +0 -162
  726. package/src/nodes/materials/LineBasicNodeMaterial.js +0 -28
  727. package/src/nodes/materials/LineDashedNodeMaterial.js +0 -55
  728. package/src/nodes/materials/MeshBasicNodeMaterial.js +0 -73
  729. package/src/nodes/materials/MeshLambertNodeMaterial.js +0 -43
  730. package/src/nodes/materials/MeshMatcapNodeMaterial.js +0 -53
  731. package/src/nodes/materials/MeshNormalNodeMaterial.js +0 -40
  732. package/src/nodes/materials/MeshPhongNodeMaterial.js +0 -74
  733. package/src/nodes/materials/MeshPhysicalNodeMaterial.js +0 -244
  734. package/src/nodes/materials/MeshSSSNodeMaterial.js +0 -84
  735. package/src/nodes/materials/MeshStandardNodeMaterial.js +0 -104
  736. package/src/nodes/materials/MeshToonNodeMaterial.js +0 -34
  737. package/src/nodes/materials/NodeMaterial.js +0 -680
  738. package/src/nodes/materials/PointsNodeMaterial.js +0 -39
  739. package/src/nodes/materials/ShadowNodeMaterial.js +0 -34
  740. package/src/nodes/materials/SpriteNodeMaterial.js +0 -90
  741. package/src/nodes/materials/VolumeNodeMaterial.js +0 -106
  742. package/src/nodes/math/CondNode.js +0 -139
  743. package/src/nodes/math/HashNode.js +0 -34
  744. package/src/nodes/procedural/CheckerNode.js +0 -42
  745. package/src/nodes/utils/DiscardNode.js +0 -28
  746. package/src/nodes/utils/OscNode.js +0 -81
  747. package/src/nodes/utils/PackingNode.js +0 -55
  748. package/src/nodes/utils/TimerNode.js +0 -94
@@ -0,0 +1,1185 @@
1
+ import { ArrayCamera } from '../../cameras/ArrayCamera.js';
2
+ import { EventDispatcher } from '../../core/EventDispatcher.js';
3
+ import { PerspectiveCamera } from '../../cameras/PerspectiveCamera.js';
4
+ import { RAD2DEG } from '../../math/MathUtils.js';
5
+ import { Vector2 } from '../../math/Vector2.js';
6
+ import { Vector3 } from '../../math/Vector3.js';
7
+ import { Vector4 } from '../../math/Vector4.js';
8
+ import { WebXRController } from '../webxr/WebXRController.js';
9
+ import { DepthFormat, DepthStencilFormat, RGBAFormat, UnsignedByteType, UnsignedInt248Type, UnsignedIntType } from '../../constants.js';
10
+ import { DepthTexture } from '../../textures/DepthTexture.js';
11
+ import { XRRenderTarget } from './XRRenderTarget.js';
12
+
13
+ const _cameraLPos = /*@__PURE__*/ new Vector3();
14
+ const _cameraRPos = /*@__PURE__*/ new Vector3();
15
+
16
+ /**
17
+ * The XR manager is built on top of the WebXR Device API to
18
+ * manage XR sessions with `WebGPURenderer`.
19
+ *
20
+ * XR is currently only supported with a WebGL 2 backend.
21
+ *
22
+ * @augments EventDispatcher
23
+ */
24
+ class XRManager extends EventDispatcher {
25
+
26
+ /**
27
+ * Constructs a new XR manager.
28
+ *
29
+ * @param {Renderer} renderer - The renderer.
30
+ */
31
+ constructor( renderer ) {
32
+
33
+ super();
34
+
35
+ /**
36
+ * This flag globally enables XR rendering.
37
+ *
38
+ * @type {boolean}
39
+ * @default false
40
+ */
41
+ this.enabled = false;
42
+
43
+ /**
44
+ * Whether the XR device is currently presenting or not.
45
+ *
46
+ * @type {boolean}
47
+ * @default false
48
+ * @readonly
49
+ */
50
+ this.isPresenting = false;
51
+
52
+ /**
53
+ * Whether the XR camera should automatically be updated or not.
54
+ *
55
+ * @type {boolean}
56
+ * @default true
57
+ */
58
+ this.cameraAutoUpdate = true;
59
+
60
+ /**
61
+ * The renderer.
62
+ *
63
+ * @private
64
+ * @type {Renderer}
65
+ */
66
+ this._renderer = renderer;
67
+
68
+ // camera
69
+
70
+ /**
71
+ * Represents the camera for the left eye.
72
+ *
73
+ * @private
74
+ * @type {PerspectiveCamera}
75
+ */
76
+ this._cameraL = new PerspectiveCamera();
77
+ this._cameraL.viewport = new Vector4();
78
+
79
+ /**
80
+ * Represents the camera for the right eye.
81
+ *
82
+ * @private
83
+ * @type {PerspectiveCamera}
84
+ */
85
+ this._cameraR = new PerspectiveCamera();
86
+ this._cameraR.viewport = new Vector4();
87
+
88
+ /**
89
+ * A list of cameras used for rendering the XR views.
90
+ *
91
+ * @private
92
+ * @type {Array<Camera>}
93
+ */
94
+ this._cameras = [ this._cameraL, this._cameraR ];
95
+
96
+ /**
97
+ * The main XR camera.
98
+ *
99
+ * @private
100
+ * @type {ArrayCamera}
101
+ */
102
+ this._cameraXR = new ArrayCamera();
103
+
104
+ /**
105
+ * The current near value of the XR camera.
106
+ *
107
+ * @private
108
+ * @type {?number}
109
+ * @default null
110
+ */
111
+ this._currentDepthNear = null;
112
+
113
+ /**
114
+ * The current far value of the XR camera.
115
+ *
116
+ * @private
117
+ * @type {?number}
118
+ * @default null
119
+ */
120
+ this._currentDepthFar = null;
121
+
122
+ /**
123
+ * A list of WebXR controllers requested by the application.
124
+ *
125
+ * @private
126
+ * @type {Array<WebXRController>}
127
+ */
128
+ this._controllers = [];
129
+
130
+ /**
131
+ * A list of XR input source. Each input source belongs to
132
+ * an instance of WebXRController.
133
+ *
134
+ * @private
135
+ * @type {Array<XRInputSource?>}
136
+ */
137
+ this._controllerInputSources = [];
138
+
139
+ /**
140
+ * The XR render target that represents the rendering destination
141
+ * during an active XR session.
142
+ *
143
+ * @private
144
+ * @type {?RenderTarget}
145
+ * @default null
146
+ */
147
+ this._xrRenderTarget = null;
148
+
149
+ /**
150
+ * The current animation context.
151
+ *
152
+ * @private
153
+ * @type {?Window}
154
+ * @default null
155
+ */
156
+ this._currentAnimationContext = null;
157
+
158
+ /**
159
+ * The current animation loop.
160
+ *
161
+ * @private
162
+ * @type {?Function}
163
+ * @default null
164
+ */
165
+ this._currentAnimationLoop = null;
166
+
167
+ /**
168
+ * The current pixel ratio.
169
+ *
170
+ * @private
171
+ * @type {?number}
172
+ * @default null
173
+ */
174
+ this._currentPixelRatio = null;
175
+
176
+ /**
177
+ * The current size of the renderer's canvas
178
+ * in logical pixel unit.
179
+ *
180
+ * @private
181
+ * @type {Vector2}
182
+ */
183
+ this._currentSize = new Vector2();
184
+
185
+ /**
186
+ * The default event listener for handling events inside a XR session.
187
+ *
188
+ * @private
189
+ * @type {Function}
190
+ */
191
+ this._onSessionEvent = onSessionEvent.bind( this );
192
+
193
+ /**
194
+ * The event listener for handling the end of a XR session.
195
+ *
196
+ * @private
197
+ * @type {Function}
198
+ */
199
+ this._onSessionEnd = onSessionEnd.bind( this );
200
+
201
+ /**
202
+ * The event listener for handling the `inputsourceschange` event.
203
+ *
204
+ * @private
205
+ * @type {Function}
206
+ */
207
+ this._onInputSourcesChange = onInputSourcesChange.bind( this );
208
+
209
+ /**
210
+ * The animation loop which is used as a replacement for the default
211
+ * animation loop of the application. It is only used when a XR session
212
+ * is active.
213
+ *
214
+ * @private
215
+ * @type {Function}
216
+ */
217
+ this._onAnimationFrame = onAnimationFrame.bind( this );
218
+
219
+ /**
220
+ * The current XR reference space.
221
+ *
222
+ * @private
223
+ * @type {?XRReferenceSpace}
224
+ * @default null
225
+ */
226
+ this._referenceSpace = null;
227
+
228
+ /**
229
+ * The current XR reference space type.
230
+ *
231
+ * @private
232
+ * @type {string}
233
+ * @default 'local-floor'
234
+ */
235
+ this._referenceSpaceType = 'local-floor';
236
+
237
+ /**
238
+ * A custom reference space defined by the application.
239
+ *
240
+ * @private
241
+ * @type {?XRReferenceSpace}
242
+ * @default null
243
+ */
244
+ this._customReferenceSpace = null;
245
+
246
+ /**
247
+ * The framebuffer scale factor.
248
+ *
249
+ * @private
250
+ * @type {number}
251
+ * @default 1
252
+ */
253
+ this._framebufferScaleFactor = 1;
254
+
255
+ /**
256
+ * The foveation factor.
257
+ *
258
+ * @private
259
+ * @type {number}
260
+ * @default 1
261
+ */
262
+ this._foveation = 1.0;
263
+
264
+ /**
265
+ * A reference to the current XR session.
266
+ *
267
+ * @private
268
+ * @type {?XRSession}
269
+ * @default null
270
+ */
271
+ this._session = null;
272
+
273
+ /**
274
+ * A reference to the current XR base layer.
275
+ *
276
+ * @private
277
+ * @type {?XRWebGLLayer}
278
+ * @default null
279
+ */
280
+ this._glBaseLayer = null;
281
+
282
+ /**
283
+ * A reference to the current XR binding.
284
+ *
285
+ * @private
286
+ * @type {?XRWebGLBinding}
287
+ * @default null
288
+ */
289
+ this._glBinding = null;
290
+
291
+ /**
292
+ * A reference to the current XR projection layer.
293
+ *
294
+ * @private
295
+ * @type {?XRProjectionLayer}
296
+ * @default null
297
+ */
298
+ this._glProjLayer = null;
299
+
300
+ /**
301
+ * A reference to the current XR frame.
302
+ *
303
+ * @private
304
+ * @type {?XRFrame}
305
+ * @default null
306
+ */
307
+ this._xrFrame = null;
308
+
309
+ /**
310
+ * Whether to use the WebXR Layers API or not.
311
+ *
312
+ * @private
313
+ * @type {boolean}
314
+ * @readonly
315
+ */
316
+ this._useLayers = ( typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat
317
+
318
+ }
319
+
320
+ /**
321
+ * Returns an instance of `THREE.Group` that represents the transformation
322
+ * of a XR controller in target ray space. The requested controller is defined
323
+ * by the given index.
324
+ *
325
+ * @param {number} index - The index of the XR controller.
326
+ * @return {Group} A group that represents the controller's transformation.
327
+ */
328
+ getController( index ) {
329
+
330
+ const controller = this._getController( index );
331
+
332
+ return controller.getTargetRaySpace();
333
+
334
+ }
335
+
336
+ /**
337
+ * Returns an instance of `THREE.Group` that represents the transformation
338
+ * of a XR controller in grip space. The requested controller is defined
339
+ * by the given index.
340
+ *
341
+ * @param {number} index - The index of the XR controller.
342
+ * @return {Group} A group that represents the controller's transformation.
343
+ */
344
+ getControllerGrip( index ) {
345
+
346
+ const controller = this._getController( index );
347
+
348
+ return controller.getGripSpace();
349
+
350
+ }
351
+
352
+ /**
353
+ * Returns an instance of `THREE.Group` that represents the transformation
354
+ * of a XR controller in hand space. The requested controller is defined
355
+ * by the given index.
356
+ *
357
+ * @param {number} index - The index of the XR controller.
358
+ * @return {Group} A group that represents the controller's transformation.
359
+ */
360
+ getHand( index ) {
361
+
362
+ const controller = this._getController( index );
363
+
364
+ return controller.getHandSpace();
365
+
366
+ }
367
+
368
+ /**
369
+ * Returns the foveation value.
370
+ *
371
+ * @return {number|undefined} The foveation value. Returns `undefined` if no base or projection layer is defined.
372
+ */
373
+ getFoveation() {
374
+
375
+ if ( this._glProjLayer === null && this._glBaseLayer === null ) {
376
+
377
+ return undefined;
378
+
379
+ }
380
+
381
+ return this._foveation;
382
+
383
+ }
384
+
385
+ /**
386
+ * Sets the foveation value.
387
+ *
388
+ * @param {number} foveation - A number in the range `[0,1]` where `0` means no foveation (full resolution)
389
+ * and `1` means maximum foveation (the edges render at lower resolution).
390
+ */
391
+ setFoveation( foveation ) {
392
+
393
+ this._foveation = foveation;
394
+
395
+ if ( this._glProjLayer !== null ) {
396
+
397
+ this._glProjLayer.fixedFoveation = foveation;
398
+
399
+ }
400
+
401
+ if ( this._glBaseLayer !== null && this._glBaseLayer.fixedFoveation !== undefined ) {
402
+
403
+ this._glBaseLayer.fixedFoveation = foveation;
404
+
405
+ }
406
+
407
+ }
408
+
409
+ /**
410
+ * Returns the framebuffer scale factor.
411
+ *
412
+ * @return {number} The framebuffer scale factor.
413
+ */
414
+ getFramebufferScaleFactor() {
415
+
416
+ return this._framebufferScaleFactor;
417
+
418
+ }
419
+
420
+ /**
421
+ * Sets the framebuffer scale factor.
422
+ *
423
+ * This method can not be used during a XR session.
424
+ *
425
+ * @param {number} factor - The framebuffer scale factor.
426
+ */
427
+ setFramebufferScaleFactor( factor ) {
428
+
429
+ this._framebufferScaleFactor = factor;
430
+
431
+ if ( this.isPresenting === true ) {
432
+
433
+ console.warn( 'THREE.XRManager: Cannot change framebuffer scale while presenting.' );
434
+
435
+ }
436
+
437
+ }
438
+
439
+ /**
440
+ * Returns the reference space type.
441
+ *
442
+ * @return {string} The reference space type.
443
+ */
444
+ getReferenceSpaceType() {
445
+
446
+ return this._referenceSpaceType;
447
+
448
+ }
449
+
450
+ /**
451
+ * Sets the reference space type.
452
+ *
453
+ * This method can not be used during a XR session.
454
+ *
455
+ * @param {string} type - The reference space type.
456
+ */
457
+ setReferenceSpaceType( type ) {
458
+
459
+ this._referenceSpaceType = type;
460
+
461
+ if ( this.isPresenting === true ) {
462
+
463
+ console.warn( 'THREE.XRManager: Cannot change reference space type while presenting.' );
464
+
465
+ }
466
+
467
+ }
468
+
469
+ /**
470
+ * Returns the XR reference space.
471
+ *
472
+ * @return {XRReferenceSpace} The XR reference space.
473
+ */
474
+ getReferenceSpace() {
475
+
476
+ return this._customReferenceSpace || this._referenceSpace;
477
+
478
+ }
479
+
480
+ /**
481
+ * Sets a custom XR reference space.
482
+ *
483
+ * @param {XRReferenceSpace} space - The XR reference space.
484
+ */
485
+ setReferenceSpace( space ) {
486
+
487
+ this._customReferenceSpace = space;
488
+
489
+ }
490
+
491
+ /**
492
+ * Returns the XR camera.
493
+ *
494
+ * @return {ArrayCamera} The XR camera.
495
+ */
496
+ getCamera() {
497
+
498
+ return this._cameraXR;
499
+
500
+ }
501
+
502
+ /**
503
+ * Returns the environment blend mode from the current XR session.
504
+ *
505
+ * @return {?('opaque'|'additive'|'alpha-blend')} The environment blend mode. Returns `null` when used outside of a XR session.
506
+ */
507
+ getEnvironmentBlendMode() {
508
+
509
+ if ( this._session !== null ) {
510
+
511
+ return this._session.environmentBlendMode;
512
+
513
+ }
514
+
515
+ }
516
+
517
+ /**
518
+ * Returns the current XR frame.
519
+ *
520
+ * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.
521
+ */
522
+ getFrame() {
523
+
524
+ return this._xrFrame;
525
+
526
+ }
527
+
528
+ /**
529
+ * Returns the current XR session.
530
+ *
531
+ * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.
532
+ */
533
+ getSession() {
534
+
535
+ return this._session;
536
+
537
+ }
538
+
539
+ /**
540
+ * After a XR session has been requested usually with one of the `*Button` modules, it
541
+ * is injected into the renderer with this method. This method triggers the start of
542
+ * the actual XR rendering.
543
+ *
544
+ * @async
545
+ * @param {XRSession} session - The XR session to set.
546
+ * @return {Promise} A Promise that resolves when the session has been set.
547
+ */
548
+ async setSession( session ) {
549
+
550
+ const renderer = this._renderer;
551
+ const backend = renderer.backend;
552
+
553
+ const gl = renderer.getContext();
554
+
555
+ this._session = session;
556
+
557
+ if ( session !== null ) {
558
+
559
+ if ( backend.isWebGPUBackend === true ) throw new Error( 'THREE.XRManager: XR is currently not supported with a WebGPU backend. Use WebGL by passing "{ forceWebGL: true }" to the constructor of the renderer.' );
560
+
561
+ session.addEventListener( 'select', this._onSessionEvent );
562
+ session.addEventListener( 'selectstart', this._onSessionEvent );
563
+ session.addEventListener( 'selectend', this._onSessionEvent );
564
+ session.addEventListener( 'squeeze', this._onSessionEvent );
565
+ session.addEventListener( 'squeezestart', this._onSessionEvent );
566
+ session.addEventListener( 'squeezeend', this._onSessionEvent );
567
+ session.addEventListener( 'end', this._onSessionEnd );
568
+ session.addEventListener( 'inputsourceschange', this._onInputSourcesChange );
569
+
570
+ await backend.makeXRCompatible();
571
+
572
+ this._currentPixelRatio = renderer.getPixelRatio();
573
+ renderer.getSize( this._currentSize );
574
+
575
+ this._currentAnimationContext = renderer._animation.getContext();
576
+ this._currentAnimationLoop = renderer._animation.getAnimationLoop();
577
+ renderer._animation.stop();
578
+
579
+ //
580
+
581
+ if ( this._useLayers === true ) {
582
+
583
+ // default path using XRWebGLBinding/XRProjectionLayer
584
+
585
+ let depthFormat = null;
586
+ let depthType = null;
587
+ let glDepthFormat = null;
588
+
589
+ if ( renderer.depth ) {
590
+
591
+ glDepthFormat = renderer.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;
592
+ depthFormat = renderer.stencil ? DepthStencilFormat : DepthFormat;
593
+ depthType = renderer.stencil ? UnsignedInt248Type : UnsignedIntType;
594
+
595
+ }
596
+
597
+ const projectionlayerInit = {
598
+ colorFormat: gl.RGBA8,
599
+ depthFormat: glDepthFormat,
600
+ scaleFactor: this._framebufferScaleFactor
601
+ };
602
+
603
+ const glBinding = new XRWebGLBinding( session, gl );
604
+ const glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
605
+
606
+ this._glBinding = glBinding;
607
+ this._glProjLayer = glProjLayer;
608
+
609
+ session.updateRenderState( { layers: [ glProjLayer ] } );
610
+
611
+ renderer.setPixelRatio( 1 );
612
+ renderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );
613
+
614
+ this._xrRenderTarget = new XRRenderTarget(
615
+ glProjLayer.textureWidth,
616
+ glProjLayer.textureHeight,
617
+ {
618
+ format: RGBAFormat,
619
+ type: UnsignedByteType,
620
+ colorSpace: renderer.outputColorSpace,
621
+ depthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),
622
+ stencilBuffer: renderer.stencil,
623
+ resolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),
624
+ resolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false ),
625
+ } );
626
+
627
+ this._xrRenderTarget.hasExternalTextures = true;
628
+
629
+ } else {
630
+
631
+ // fallback to XRWebGLLayer
632
+
633
+ const layerInit = {
634
+ antialias: renderer.samples > 0,
635
+ alpha: true,
636
+ depth: renderer.depth,
637
+ stencil: renderer.stencil,
638
+ framebufferScaleFactor: this.getFramebufferScaleFactor()
639
+ };
640
+
641
+ const glBaseLayer = new XRWebGLLayer( session, gl, layerInit );
642
+ this._glBaseLayer = glBaseLayer;
643
+
644
+ session.updateRenderState( { baseLayer: glBaseLayer } );
645
+
646
+ renderer.setPixelRatio( 1 );
647
+ renderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );
648
+
649
+ this._xrRenderTarget = new XRRenderTarget(
650
+ glBaseLayer.framebufferWidth,
651
+ glBaseLayer.framebufferHeight,
652
+ {
653
+ format: RGBAFormat,
654
+ type: UnsignedByteType,
655
+ colorSpace: renderer.outputColorSpace,
656
+ stencilBuffer: renderer.stencil,
657
+ resolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),
658
+ resolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false ),
659
+ }
660
+ );
661
+
662
+ }
663
+
664
+ //
665
+
666
+ this.setFoveation( this.getFoveation() );
667
+
668
+ this._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );
669
+
670
+ renderer._animation.setAnimationLoop( this._onAnimationFrame );
671
+ renderer._animation.setContext( session );
672
+ renderer._animation.start();
673
+
674
+ this.isPresenting = true;
675
+
676
+ this.dispatchEvent( { type: 'sessionstart' } );
677
+
678
+ }
679
+
680
+ }
681
+
682
+ /**
683
+ * This method is called by the renderer per frame and updates the XR camera
684
+ * and it sub cameras based on the given camera. The given camera is the "user"
685
+ * camera created on application level and used for non-XR rendering.
686
+ *
687
+ * @param {PerspectiveCamera} camera - The camera.
688
+ */
689
+ updateCamera( camera ) {
690
+
691
+ const session = this._session;
692
+
693
+ if ( session === null ) return;
694
+
695
+ const depthNear = camera.near;
696
+ const depthFar = camera.far;
697
+
698
+ const cameraXR = this._cameraXR;
699
+ const cameraL = this._cameraL;
700
+ const cameraR = this._cameraR;
701
+
702
+ cameraXR.near = cameraR.near = cameraL.near = depthNear;
703
+ cameraXR.far = cameraR.far = cameraL.far = depthFar;
704
+
705
+ if ( this._currentDepthNear !== cameraXR.near || this._currentDepthFar !== cameraXR.far ) {
706
+
707
+ // Note that the new renderState won't apply until the next frame. See #18320
708
+
709
+ session.updateRenderState( {
710
+ depthNear: cameraXR.near,
711
+ depthFar: cameraXR.far
712
+ } );
713
+
714
+ this._currentDepthNear = cameraXR.near;
715
+ this._currentDepthFar = cameraXR.far;
716
+
717
+ }
718
+
719
+ cameraL.layers.mask = camera.layers.mask | 0b010;
720
+ cameraR.layers.mask = camera.layers.mask | 0b100;
721
+ cameraXR.layers.mask = cameraL.layers.mask | cameraR.layers.mask;
722
+
723
+ const parent = camera.parent;
724
+ const cameras = cameraXR.cameras;
725
+
726
+ updateCamera( cameraXR, parent );
727
+
728
+ for ( let i = 0; i < cameras.length; i ++ ) {
729
+
730
+ updateCamera( cameras[ i ], parent );
731
+
732
+ }
733
+
734
+ // update projection matrix for proper view frustum culling
735
+
736
+ if ( cameras.length === 2 ) {
737
+
738
+ setProjectionFromUnion( cameraXR, cameraL, cameraR );
739
+
740
+ } else {
741
+
742
+ // assume single camera setup (AR)
743
+
744
+ cameraXR.projectionMatrix.copy( cameraL.projectionMatrix );
745
+
746
+ }
747
+
748
+ // update user camera and its children
749
+
750
+ updateUserCamera( camera, cameraXR, parent );
751
+
752
+
753
+ }
754
+
755
+ /**
756
+ * Returns a WebXR controller for the given controller index.
757
+ *
758
+ * @private
759
+ * @param {number} index - The controller index.
760
+ * @return {WebXRController} The XR controller.
761
+ */
762
+ _getController( index ) {
763
+
764
+ let controller = this._controllers[ index ];
765
+
766
+ if ( controller === undefined ) {
767
+
768
+ controller = new WebXRController();
769
+ this._controllers[ index ] = controller;
770
+
771
+ }
772
+
773
+ return controller;
774
+
775
+ }
776
+
777
+ }
778
+
779
+ /**
780
+ * Assumes 2 cameras that are parallel and share an X-axis, and that
781
+ * the cameras' projection and world matrices have already been set.
782
+ * And that near and far planes are identical for both cameras.
783
+ * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765
784
+ *
785
+ * @param {ArrayCamera} camera - The camera to update.
786
+ * @param {PerspectiveCamera} cameraL - The left camera.
787
+ * @param {PerspectiveCamera} cameraR - The right camera.
788
+ */
789
+ function setProjectionFromUnion( camera, cameraL, cameraR ) {
790
+
791
+ _cameraLPos.setFromMatrixPosition( cameraL.matrixWorld );
792
+ _cameraRPos.setFromMatrixPosition( cameraR.matrixWorld );
793
+
794
+ const ipd = _cameraLPos.distanceTo( _cameraRPos );
795
+
796
+ const projL = cameraL.projectionMatrix.elements;
797
+ const projR = cameraR.projectionMatrix.elements;
798
+
799
+ // VR systems will have identical far and near planes, and
800
+ // most likely identical top and bottom frustum extents.
801
+ // Use the left camera for these values.
802
+ const near = projL[ 14 ] / ( projL[ 10 ] - 1 );
803
+ const far = projL[ 14 ] / ( projL[ 10 ] + 1 );
804
+ const topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];
805
+ const bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];
806
+
807
+ const leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];
808
+ const rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];
809
+ const left = near * leftFov;
810
+ const right = near * rightFov;
811
+
812
+ // Calculate the new camera's position offset from the
813
+ // left camera. xOffset should be roughly half `ipd`.
814
+ const zOffset = ipd / ( - leftFov + rightFov );
815
+ const xOffset = zOffset * - leftFov;
816
+
817
+ // TODO: Better way to apply this offset?
818
+ cameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );
819
+ camera.translateX( xOffset );
820
+ camera.translateZ( zOffset );
821
+ camera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );
822
+ camera.matrixWorldInverse.copy( camera.matrixWorld ).invert();
823
+
824
+ // Check if the projection uses an infinite far plane.
825
+ if ( projL[ 10 ] === - 1.0 ) {
826
+
827
+ // Use the projection matrix from the left eye.
828
+ // The camera offset is sufficient to include the view volumes
829
+ // of both eyes (assuming symmetric projections).
830
+ camera.projectionMatrix.copy( cameraL.projectionMatrix );
831
+ camera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );
832
+
833
+ } else {
834
+
835
+ // Find the union of the frustum values of the cameras and scale
836
+ // the values so that the near plane's position does not change in world space,
837
+ // although must now be relative to the new union camera.
838
+ const near2 = near + zOffset;
839
+ const far2 = far + zOffset;
840
+ const left2 = left - xOffset;
841
+ const right2 = right + ( ipd - xOffset );
842
+ const top2 = topFov * far / far2 * near2;
843
+ const bottom2 = bottomFov * far / far2 * near2;
844
+
845
+ camera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );
846
+ camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
847
+
848
+ }
849
+
850
+ }
851
+
852
+ /**
853
+ * Updates the world matrices for the given camera based on the parent 3D object.
854
+ *
855
+ * @inner
856
+ * @param {Camera} camera - The camera to update.
857
+ * @param {Object3D} parent - The parent 3D object.
858
+ */
859
+ function updateCamera( camera, parent ) {
860
+
861
+ if ( parent === null ) {
862
+
863
+ camera.matrixWorld.copy( camera.matrix );
864
+
865
+ } else {
866
+
867
+ camera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );
868
+
869
+ }
870
+
871
+ camera.matrixWorldInverse.copy( camera.matrixWorld ).invert();
872
+
873
+ }
874
+
875
+ /**
876
+ * Updates the given camera with the transformation of the XR camera and parent object.
877
+ *
878
+ * @inner
879
+ * @param {Camera} camera - The camera to update.
880
+ * @param {ArrayCamera} cameraXR - The XR camera.
881
+ * @param {Object3D} parent - The parent 3D object.
882
+ */
883
+ function updateUserCamera( camera, cameraXR, parent ) {
884
+
885
+ if ( parent === null ) {
886
+
887
+ camera.matrix.copy( cameraXR.matrixWorld );
888
+
889
+ } else {
890
+
891
+ camera.matrix.copy( parent.matrixWorld );
892
+ camera.matrix.invert();
893
+ camera.matrix.multiply( cameraXR.matrixWorld );
894
+
895
+ }
896
+
897
+ camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
898
+ camera.updateMatrixWorld( true );
899
+
900
+ camera.projectionMatrix.copy( cameraXR.projectionMatrix );
901
+ camera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );
902
+
903
+ if ( camera.isPerspectiveCamera ) {
904
+
905
+ camera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );
906
+ camera.zoom = 1;
907
+
908
+ }
909
+
910
+ }
911
+
912
+ function onSessionEvent( event ) {
913
+
914
+ const controllerIndex = this._controllerInputSources.indexOf( event.inputSource );
915
+
916
+ if ( controllerIndex === - 1 ) {
917
+
918
+ return;
919
+
920
+ }
921
+
922
+ const controller = this._controllers[ controllerIndex ];
923
+
924
+ if ( controller !== undefined ) {
925
+
926
+ const referenceSpace = this.getReferenceSpace();
927
+
928
+ controller.update( event.inputSource, event.frame, referenceSpace );
929
+ controller.dispatchEvent( { type: event.type, data: event.inputSource } );
930
+
931
+ }
932
+
933
+ }
934
+
935
+ function onSessionEnd() {
936
+
937
+ const session = this._session;
938
+ const renderer = this._renderer;
939
+
940
+ session.removeEventListener( 'select', this._onSessionEvent );
941
+ session.removeEventListener( 'selectstart', this._onSessionEvent );
942
+ session.removeEventListener( 'selectend', this._onSessionEvent );
943
+ session.removeEventListener( 'squeeze', this._onSessionEvent );
944
+ session.removeEventListener( 'squeezestart', this._onSessionEvent );
945
+ session.removeEventListener( 'squeezeend', this._onSessionEvent );
946
+ session.removeEventListener( 'end', this._onSessionEnd );
947
+ session.removeEventListener( 'inputsourceschange', this._onInputSourcesChange );
948
+
949
+ for ( let i = 0; i < this._controllers.length; i ++ ) {
950
+
951
+ const inputSource = this._controllerInputSources[ i ];
952
+
953
+ if ( inputSource === null ) continue;
954
+
955
+ this._controllerInputSources[ i ] = null;
956
+
957
+ this._controllers[ i ].disconnect( inputSource );
958
+
959
+ }
960
+
961
+ this._currentDepthNear = null;
962
+ this._currentDepthFar = null;
963
+
964
+ // restore framebuffer/rendering state
965
+
966
+ renderer.backend.setXRTarget( null );
967
+ renderer.setOutputRenderTarget( null );
968
+
969
+ this._session = null;
970
+ this._xrRenderTarget = null;
971
+
972
+ //
973
+
974
+ this.isPresenting = false;
975
+
976
+ renderer._animation.stop();
977
+
978
+ renderer._animation.setAnimationLoop( this._currentAnimationLoop );
979
+ renderer._animation.setContext( this._currentAnimationContext );
980
+ renderer._animation.start();
981
+
982
+ renderer.setPixelRatio( this._currentPixelRatio );
983
+ renderer.setSize( this._currentSize.width, this._currentSize.height, false );
984
+
985
+ this.dispatchEvent( { type: 'sessionend' } );
986
+
987
+ }
988
+
989
+ function onInputSourcesChange( event ) {
990
+
991
+ const controllers = this._controllers;
992
+ const controllerInputSources = this._controllerInputSources;
993
+
994
+ // Notify disconnected
995
+
996
+ for ( let i = 0; i < event.removed.length; i ++ ) {
997
+
998
+ const inputSource = event.removed[ i ];
999
+ const index = controllerInputSources.indexOf( inputSource );
1000
+
1001
+ if ( index >= 0 ) {
1002
+
1003
+ controllerInputSources[ index ] = null;
1004
+ controllers[ index ].disconnect( inputSource );
1005
+
1006
+ }
1007
+
1008
+ }
1009
+
1010
+ // Notify connected
1011
+
1012
+ for ( let i = 0; i < event.added.length; i ++ ) {
1013
+
1014
+ const inputSource = event.added[ i ];
1015
+
1016
+ let controllerIndex = controllerInputSources.indexOf( inputSource );
1017
+
1018
+ if ( controllerIndex === - 1 ) {
1019
+
1020
+ // Assign input source a controller that currently has no input source
1021
+
1022
+ for ( let i = 0; i < controllers.length; i ++ ) {
1023
+
1024
+ if ( i >= controllerInputSources.length ) {
1025
+
1026
+ controllerInputSources.push( inputSource );
1027
+ controllerIndex = i;
1028
+ break;
1029
+
1030
+ } else if ( controllerInputSources[ i ] === null ) {
1031
+
1032
+ controllerInputSources[ i ] = inputSource;
1033
+ controllerIndex = i;
1034
+ break;
1035
+
1036
+ }
1037
+
1038
+ }
1039
+
1040
+ // If all controllers do currently receive input we ignore new ones
1041
+
1042
+ if ( controllerIndex === - 1 ) break;
1043
+
1044
+ }
1045
+
1046
+ const controller = controllers[ controllerIndex ];
1047
+
1048
+ if ( controller ) {
1049
+
1050
+ controller.connect( inputSource );
1051
+
1052
+ }
1053
+
1054
+ }
1055
+
1056
+ }
1057
+
1058
+ function onAnimationFrame( time, frame ) {
1059
+
1060
+ if ( frame === undefined ) return;
1061
+
1062
+ const cameraXR = this._cameraXR;
1063
+ const renderer = this._renderer;
1064
+ const backend = renderer.backend;
1065
+
1066
+ const glBaseLayer = this._glBaseLayer;
1067
+
1068
+ const referenceSpace = this.getReferenceSpace();
1069
+ const pose = frame.getViewerPose( referenceSpace );
1070
+
1071
+ this._xrFrame = frame;
1072
+
1073
+ if ( pose !== null ) {
1074
+
1075
+ const views = pose.views;
1076
+
1077
+ if ( this._glBaseLayer !== null ) {
1078
+
1079
+ backend.setXRTarget( glBaseLayer.framebuffer );
1080
+
1081
+ }
1082
+
1083
+ let cameraXRNeedsUpdate = false;
1084
+
1085
+ // check if it's necessary to rebuild cameraXR's camera list
1086
+
1087
+ if ( views.length !== cameraXR.cameras.length ) {
1088
+
1089
+ cameraXR.cameras.length = 0;
1090
+ cameraXRNeedsUpdate = true;
1091
+
1092
+ }
1093
+
1094
+ for ( let i = 0; i < views.length; i ++ ) {
1095
+
1096
+ const view = views[ i ];
1097
+
1098
+ let viewport;
1099
+
1100
+ if ( this._useLayers === true ) {
1101
+
1102
+ const glSubImage = this._glBinding.getViewSubImage( this._glProjLayer, view );
1103
+ viewport = glSubImage.viewport;
1104
+
1105
+ // For side-by-side projection, we only produce a single texture for both eyes.
1106
+ if ( i === 0 ) {
1107
+
1108
+ backend.setXRRenderTargetTextures(
1109
+ this._xrRenderTarget,
1110
+ glSubImage.colorTexture,
1111
+ this._glProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture
1112
+ );
1113
+
1114
+ }
1115
+
1116
+ } else {
1117
+
1118
+ viewport = glBaseLayer.getViewport( view );
1119
+
1120
+ }
1121
+
1122
+ let camera = this._cameras[ i ];
1123
+
1124
+ if ( camera === undefined ) {
1125
+
1126
+ camera = new PerspectiveCamera();
1127
+ camera.layers.enable( i );
1128
+ camera.viewport = new Vector4();
1129
+ this._cameras[ i ] = camera;
1130
+
1131
+ }
1132
+
1133
+ camera.matrix.fromArray( view.transform.matrix );
1134
+ camera.matrix.decompose( camera.position, camera.quaternion, camera.scale );
1135
+ camera.projectionMatrix.fromArray( view.projectionMatrix );
1136
+ camera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();
1137
+ camera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );
1138
+
1139
+ if ( i === 0 ) {
1140
+
1141
+ cameraXR.matrix.copy( camera.matrix );
1142
+ cameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );
1143
+
1144
+ }
1145
+
1146
+ if ( cameraXRNeedsUpdate === true ) {
1147
+
1148
+ cameraXR.cameras.push( camera );
1149
+
1150
+ }
1151
+
1152
+ }
1153
+
1154
+ renderer.setOutputRenderTarget( this._xrRenderTarget );
1155
+
1156
+ }
1157
+
1158
+ //
1159
+
1160
+ for ( let i = 0; i < this._controllers.length; i ++ ) {
1161
+
1162
+ const inputSource = this._controllerInputSources[ i ];
1163
+ const controller = this._controllers[ i ];
1164
+
1165
+ if ( inputSource !== null && controller !== undefined ) {
1166
+
1167
+ controller.update( inputSource, frame, referenceSpace );
1168
+
1169
+ }
1170
+
1171
+ }
1172
+
1173
+ if ( this._currentAnimationLoop ) this._currentAnimationLoop( time, frame );
1174
+
1175
+ if ( frame.detectedPlanes ) {
1176
+
1177
+ this.dispatchEvent( { type: 'planesdetected', data: frame } );
1178
+
1179
+ }
1180
+
1181
+ this._xrFrame = null;
1182
+
1183
+ }
1184
+
1185
+ export default XRManager;