@plastic-software/three 0.181.3 → 0.183.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -25,7 +25,7 @@ import { modelViewMatrix } from '../../nodes/accessors/ModelNode.js';
25
25
  import { vertexColor } from '../../nodes/accessors/VertexColorNode.js';
26
26
  import { premultiplyAlpha } from '../../nodes/display/BlendModes.js';
27
27
  import { subBuild } from '../../nodes/core/SubBuildNode.js';
28
- import { warn } from '../../utils.js';
28
+ import { error } from '../../utils.js';
29
29
 
30
30
  /**
31
31
  * Base class for all node materials.
@@ -240,6 +240,14 @@ class NodeMaterial extends Material {
240
240
  */
241
241
  this.maskNode = null;
242
242
 
243
+ /**
244
+ * This node can be used to implement a shadow mask for the material.
245
+ *
246
+ * @type {?Node<bool>}
247
+ * @default null
248
+ */
249
+ this.maskShadowNode = null;
250
+
243
251
  /**
244
252
  * The local vertex positions are computed based on multiple factors like the
245
253
  * attribute data, morphing or skinning. This node property allows to overwrite
@@ -382,25 +390,13 @@ class NodeMaterial extends Material {
382
390
  */
383
391
  this.vertexNode = null;
384
392
 
385
- // Deprecated properties
386
-
387
- Object.defineProperty( this, 'shadowPositionNode', { // @deprecated, r176
388
-
389
- get: () => {
390
-
391
- return this.receivedShadowPositionNode;
392
-
393
- },
394
-
395
- set: ( value ) => {
396
-
397
- warn( 'NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".' );
398
-
399
- this.receivedShadowPositionNode = value;
400
-
401
- }
402
-
403
- } );
393
+ /**
394
+ * This node can be used as a global context management component for this material.
395
+ *
396
+ * @type {?ContextNode}
397
+ * @default null
398
+ */
399
+ this.contextNode = null;
404
400
 
405
401
  }
406
402
 
@@ -489,13 +485,41 @@ class NodeMaterial extends Material {
489
485
  const renderer = builder.renderer;
490
486
  const renderTarget = renderer.getRenderTarget();
491
487
 
488
+ // < CONTEXT >
489
+
490
+ if ( renderer.contextNode.isContextNode === true ) {
491
+
492
+ builder.context = { ...builder.context, ...renderer.contextNode.getFlowContextData() };
493
+
494
+ } else {
495
+
496
+ error( 'NodeMaterial: "renderer.contextNode" must be an instance of `context()`.' );
497
+
498
+ }
499
+
500
+ if ( this.contextNode !== null ) {
501
+
502
+ if ( this.contextNode.isContextNode === true ) {
503
+
504
+ builder.context = { ...builder.context, ...this.contextNode.getFlowContextData() };
505
+
506
+ } else {
507
+
508
+ error( 'NodeMaterial: "material.contextNode" must be an instance of `context()`.' );
509
+
510
+ }
511
+
512
+ }
513
+
492
514
  // < VERTEX STAGE >
493
515
 
494
516
  builder.addStack();
495
517
 
496
- const mvp = subBuild( this.setupVertex( builder ), 'VERTEX' );
518
+ const mvp = this.setupVertex( builder );
497
519
 
498
- const vertexNode = this.vertexNode || mvp;
520
+ const vertexNode = subBuild( this.vertexNode || mvp, 'VERTEX' );
521
+
522
+ builder.context.clipSpace = vertexNode;
499
523
 
500
524
  builder.stack.outputNode = vertexNode;
501
525
 
@@ -558,6 +582,14 @@ class NodeMaterial extends Material {
558
582
 
559
583
  if ( isCustomOutput ) resultNode = this.outputNode;
560
584
 
585
+ //
586
+
587
+ if ( builder.context.getOutput ) {
588
+
589
+ resultNode = builder.context.getOutput( resultNode, builder );
590
+
591
+ }
592
+
561
593
  // MRT
562
594
 
563
595
  if ( renderTarget !== null ) {
@@ -753,7 +785,7 @@ class NodeMaterial extends Material {
753
785
 
754
786
  this.setupPosition( builder );
755
787
 
756
- builder.context.vertex = builder.removeStack();
788
+ builder.context.position = builder.removeStack();
757
789
 
758
790
  return modelViewProjection;
759
791
 
@@ -1018,9 +1050,21 @@ class NodeMaterial extends Material {
1018
1050
 
1019
1051
  }
1020
1052
 
1021
- if ( this.aoNode !== null || builder.material.aoMap ) {
1053
+ let aoNode = this.aoNode;
1022
1054
 
1023
- const aoNode = this.aoNode !== null ? this.aoNode : materialAO;
1055
+ if ( aoNode === null && builder.material.aoMap ) {
1056
+
1057
+ aoNode = materialAO;
1058
+
1059
+ }
1060
+
1061
+ if ( builder.context.getAO ) {
1062
+
1063
+ aoNode = builder.context.getAO( aoNode, builder );
1064
+
1065
+ }
1066
+
1067
+ if ( aoNode ) {
1024
1068
 
1025
1069
  materialLightsNode.push( new AONode( aoNode ) );
1026
1070
 
@@ -1285,6 +1329,7 @@ class NodeMaterial extends Material {
1285
1329
  this.backdropAlphaNode = source.backdropAlphaNode;
1286
1330
  this.alphaTestNode = source.alphaTestNode;
1287
1331
  this.maskNode = source.maskNode;
1332
+ this.maskShadowNode = source.maskShadowNode;
1288
1333
 
1289
1334
  this.positionNode = source.positionNode;
1290
1335
  this.geometryNode = source.geometryNode;
@@ -1301,6 +1346,8 @@ class NodeMaterial extends Material {
1301
1346
  this.fragmentNode = source.fragmentNode;
1302
1347
  this.vertexNode = source.vertexNode;
1303
1348
 
1349
+ this.contextNode = source.contextNode;
1350
+
1304
1351
  return super.copy( source );
1305
1352
 
1306
1353
  }
@@ -173,6 +173,7 @@ class NodeMaterialObserver {
173
173
  geometry: {
174
174
  id: geometry.id,
175
175
  attributes: this.getAttributesData( geometry.attributes ),
176
+ indexId: geometry.index ? geometry.index.id : null,
176
177
  indexVersion: geometry.index ? geometry.index.version : null,
177
178
  drawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }
178
179
  },
@@ -232,7 +233,8 @@ class NodeMaterialObserver {
232
233
  const attribute = attributes[ name ];
233
234
 
234
235
  attributesData[ name ] = {
235
- version: attribute.version
236
+ id: attribute.id,
237
+ version: attribute.version,
236
238
  };
237
239
 
238
240
  }
@@ -259,7 +261,7 @@ class NodeMaterialObserver {
259
261
 
260
262
  }
261
263
 
262
- if ( builder.renderer.overrideNodes.modelViewMatrix !== null || builder.renderer.overrideNodes.modelNormalViewMatrix !== null )
264
+ if ( builder.context.modelViewMatrix || builder.context.modelNormalViewMatrix || builder.context.getAO || builder.context.getShadow )
263
265
  return true;
264
266
 
265
267
  return false;
@@ -423,8 +425,9 @@ class NodeMaterialObserver {
423
425
 
424
426
  }
425
427
 
426
- if ( storedAttributeData.version !== attribute.version ) {
428
+ if ( storedAttributeData.id !== attribute.id || storedAttributeData.version !== attribute.version ) {
427
429
 
430
+ storedAttributeData.id = attribute.id;
428
431
  storedAttributeData.version = attribute.version;
429
432
  return false;
430
433
 
@@ -435,11 +438,14 @@ class NodeMaterialObserver {
435
438
  // check index
436
439
 
437
440
  const index = geometry.index;
441
+ const storedIndexId = storedGeometryData.indexId;
438
442
  const storedIndexVersion = storedGeometryData.indexVersion;
443
+ const currentIndexId = index ? index.id : null;
439
444
  const currentIndexVersion = index ? index.version : null;
440
445
 
441
- if ( storedIndexVersion !== currentIndexVersion ) {
446
+ if ( storedIndexId !== currentIndexId || storedIndexVersion !== currentIndexVersion ) {
442
447
 
448
+ storedGeometryData.indexId = currentIndexId;
443
449
  storedGeometryData.indexVersion = currentIndexVersion;
444
450
  return false;
445
451
 
package/src/math/Line3.js CHANGED
@@ -284,12 +284,10 @@ class Line3 {
284
284
 
285
285
  }
286
286
 
287
- c1.copy( p1 ).add( _d1.multiplyScalar( s ) );
288
- c2.copy( p2 ).add( _d2.multiplyScalar( t ) );
287
+ c1.copy( p1 ).addScaledVector( _d1, s );
288
+ c2.copy( p2 ).addScaledVector( _d2, t );
289
289
 
290
- c1.sub( c2 );
291
-
292
- return c1.dot( c1 );
290
+ return c1.distanceToSquared( c2 );
293
291
 
294
292
  }
295
293
 
@@ -64,7 +64,7 @@ function euclideanModulo( n, m ) {
64
64
 
65
65
  /**
66
66
  * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`
67
- * for the given value.
67
+ * for the given value. `a2` must be greater than `a1`.
68
68
  *
69
69
  * @param {number} x - The value to be mapped.
70
70
  * @param {number} a1 - Minimum value for range A.
@@ -159,9 +159,9 @@ function pingpong( x, length = 1 ) {
159
159
  *
160
160
  * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.
161
161
  *
162
- * @param {number} x - The value to evaluate based on its position between min and max.
163
- * @param {number} min - The min value. Any x value below min will be `0`.
164
- * @param {number} max - The max value. Any x value above max will be `1`.
162
+ * @param {number} x - The value to evaluate based on its position between `min` and `max`.
163
+ * @param {number} min - The min value. Any `x` value below `min` will be `0`. `min` must be lower than `max`.
164
+ * @param {number} max - The max value. Any `x` value above `max` will be `1`. `max` must be greater than `min`.
165
165
  * @return {number} The alternated value.
166
166
  */
167
167
  function smoothstep( x, min, max ) {
@@ -177,11 +177,11 @@ function smoothstep( x, min, max ) {
177
177
 
178
178
  /**
179
179
  * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)
180
- * that has zero 1st and 2nd order derivatives at x=0 and x=1.
180
+ * that has zero 1st and 2nd order derivatives at `x=0` and `x=1`.
181
181
  *
182
- * @param {number} x - The value to evaluate based on its position between min and max.
183
- * @param {number} min - The min value. Any x value below min will be `0`.
184
- * @param {number} max - The max value. Any x value above max will be `1`.
182
+ * @param {number} x - The value to evaluate based on its position between `min` and `max`.
183
+ * @param {number} min - The min value. Any `x` value below `min` will be `0`. `min` must be lower than `max`.
184
+ * @param {number} max - The max value. Any `x` value above `max` will be `1`. `max` must be greater than `min`.
185
185
  * @return {number} The alternated value.
186
186
  */
187
187
  function smootherstep( x, min, max ) {
@@ -294,7 +294,7 @@ function isPowerOfTwo( value ) {
294
294
  /**
295
295
  * Returns the smallest power of two that is greater than or equal to the given number.
296
296
  *
297
- * @param {number} value - The value to find a POT for.
297
+ * @param {number} value - The value to find a POT for. Must be greater than `0`.
298
298
  * @return {number} The smallest power of two that is greater than or equal to the given number.
299
299
  */
300
300
  function ceilPowerOfTwo( value ) {
@@ -306,7 +306,7 @@ function ceilPowerOfTwo( value ) {
306
306
  /**
307
307
  * Returns the largest power of two that is less than or equal to the given number.
308
308
  *
309
- * @param {number} value - The value to find a POT for.
309
+ * @param {number} value - The value to find a POT for. Must be greater than `0`.
310
310
  * @return {number} The largest power of two that is less than or equal to the given number.
311
311
  */
312
312
  function floorPowerOfTwo( value ) {
@@ -234,6 +234,16 @@ class Matrix4 {
234
234
  */
235
235
  extractBasis( xAxis, yAxis, zAxis ) {
236
236
 
237
+ if ( this.determinant() === 0 ) {
238
+
239
+ xAxis.set( 1, 0, 0 );
240
+ yAxis.set( 0, 1, 0 );
241
+ zAxis.set( 0, 0, 1 );
242
+
243
+ return this;
244
+
245
+ }
246
+
237
247
  xAxis.setFromMatrixColumn( this, 0 );
238
248
  yAxis.setFromMatrixColumn( this, 1 );
239
249
  zAxis.setFromMatrixColumn( this, 2 );
@@ -274,6 +284,12 @@ class Matrix4 {
274
284
  */
275
285
  extractRotation( m ) {
276
286
 
287
+ if ( m.determinant() === 0 ) {
288
+
289
+ return this.identity();
290
+
291
+ }
292
+
277
293
  const te = this.elements;
278
294
  const me = m.elements;
279
295
 
@@ -614,43 +630,18 @@ class Matrix4 {
614
630
  const n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];
615
631
  const n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];
616
632
 
617
- //TODO: make this more efficient
618
-
619
- return (
620
- n41 * (
621
- + n14 * n23 * n32
622
- - n13 * n24 * n32
623
- - n14 * n22 * n33
624
- + n12 * n24 * n33
625
- + n13 * n22 * n34
626
- - n12 * n23 * n34
627
- ) +
628
- n42 * (
629
- + n11 * n23 * n34
630
- - n11 * n24 * n33
631
- + n14 * n21 * n33
632
- - n13 * n21 * n34
633
- + n13 * n24 * n31
634
- - n14 * n23 * n31
635
- ) +
636
- n43 * (
637
- + n11 * n24 * n32
638
- - n11 * n22 * n34
639
- - n14 * n21 * n32
640
- + n12 * n21 * n34
641
- + n14 * n22 * n31
642
- - n12 * n24 * n31
643
- ) +
644
- n44 * (
645
- - n13 * n22 * n31
646
- - n11 * n23 * n32
647
- + n11 * n22 * n33
648
- + n13 * n21 * n32
649
- - n12 * n21 * n33
650
- + n12 * n23 * n31
651
- )
633
+ const t11 = n23 * n34 - n24 * n33;
634
+ const t12 = n22 * n34 - n24 * n32;
635
+ const t13 = n22 * n33 - n23 * n32;
652
636
 
653
- );
637
+ const t21 = n21 * n34 - n24 * n31;
638
+ const t22 = n21 * n33 - n23 * n31;
639
+ const t23 = n21 * n32 - n22 * n31;
640
+
641
+ return n11 * ( n42 * t11 - n43 * t12 + n44 * t13 ) -
642
+ n12 * ( n41 * t11 - n43 * t21 + n44 * t22 ) +
643
+ n13 * ( n41 * t12 - n42 * t21 + n44 * t23 ) -
644
+ n14 * ( n41 * t13 - n42 * t22 + n43 * t23 );
654
645
 
655
646
  }
656
647
 
@@ -716,7 +707,7 @@ class Matrix4 {
716
707
  */
717
708
  invert() {
718
709
 
719
- // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
710
+ // based on https://github.com/toji/gl-matrix
720
711
  const te = this.elements,
721
712
 
722
713
  n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],
@@ -724,36 +715,44 @@ class Matrix4 {
724
715
  n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],
725
716
  n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],
726
717
 
727
- t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
728
- t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
729
- t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
730
- t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;
731
-
732
- const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
718
+ t1 = n11 * n22 - n21 * n12,
719
+ t2 = n11 * n32 - n31 * n12,
720
+ t3 = n11 * n42 - n41 * n12,
721
+ t4 = n21 * n32 - n31 * n22,
722
+ t5 = n21 * n42 - n41 * n22,
723
+ t6 = n31 * n42 - n41 * n32,
724
+ t7 = n13 * n24 - n23 * n14,
725
+ t8 = n13 * n34 - n33 * n14,
726
+ t9 = n13 * n44 - n43 * n14,
727
+ t10 = n23 * n34 - n33 * n24,
728
+ t11 = n23 * n44 - n43 * n24,
729
+ t12 = n33 * n44 - n43 * n34;
730
+
731
+ const det = t1 * t12 - t2 * t11 + t3 * t10 + t4 * t9 - t5 * t8 + t6 * t7;
733
732
 
734
733
  if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
735
734
 
736
735
  const detInv = 1 / det;
737
736
 
738
- te[ 0 ] = t11 * detInv;
739
- te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
740
- te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
741
- te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
737
+ te[ 0 ] = ( n22 * t12 - n32 * t11 + n42 * t10 ) * detInv;
738
+ te[ 1 ] = ( n31 * t11 - n21 * t12 - n41 * t10 ) * detInv;
739
+ te[ 2 ] = ( n24 * t6 - n34 * t5 + n44 * t4 ) * detInv;
740
+ te[ 3 ] = ( n33 * t5 - n23 * t6 - n43 * t4 ) * detInv;
742
741
 
743
- te[ 4 ] = t12 * detInv;
744
- te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
745
- te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
746
- te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
742
+ te[ 4 ] = ( n32 * t9 - n12 * t12 - n42 * t8 ) * detInv;
743
+ te[ 5 ] = ( n11 * t12 - n31 * t9 + n41 * t8 ) * detInv;
744
+ te[ 6 ] = ( n34 * t3 - n14 * t6 - n44 * t2 ) * detInv;
745
+ te[ 7 ] = ( n13 * t6 - n33 * t3 + n43 * t2 ) * detInv;
747
746
 
748
- te[ 8 ] = t13 * detInv;
749
- te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
750
- te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
751
- te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
747
+ te[ 8 ] = ( n12 * t11 - n22 * t9 + n42 * t7 ) * detInv;
748
+ te[ 9 ] = ( n21 * t9 - n11 * t11 - n41 * t7 ) * detInv;
749
+ te[ 10 ] = ( n14 * t5 - n24 * t3 + n44 * t1 ) * detInv;
750
+ te[ 11 ] = ( n23 * t3 - n13 * t5 - n43 * t1 ) * detInv;
752
751
 
753
- te[ 12 ] = t14 * detInv;
754
- te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
755
- te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
756
- te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
752
+ te[ 12 ] = ( n22 * t8 - n12 * t10 - n32 * t7 ) * detInv;
753
+ te[ 13 ] = ( n11 * t10 - n21 * t8 + n31 * t7 ) * detInv;
754
+ te[ 14 ] = ( n24 * t2 - n14 * t4 - n34 * t1 ) * detInv;
755
+ te[ 15 ] = ( n13 * t4 - n23 * t2 + n33 * t1 ) * detInv;
757
756
 
758
757
  return this;
759
758
 
@@ -1051,18 +1050,28 @@ class Matrix4 {
1051
1050
 
1052
1051
  const te = this.elements;
1053
1052
 
1053
+ position.x = te[ 12 ];
1054
+ position.y = te[ 13 ];
1055
+ position.z = te[ 14 ];
1056
+
1057
+ const det = this.determinant();
1058
+
1059
+ if ( det === 0 ) {
1060
+
1061
+ scale.set( 1, 1, 1 );
1062
+ quaternion.identity();
1063
+
1064
+ return this;
1065
+
1066
+ }
1067
+
1054
1068
  let sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();
1055
1069
  const sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
1056
1070
  const sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();
1057
1071
 
1058
- // if determine is negative, we need to invert one scale
1059
- const det = this.determinant();
1072
+ // if determinant is negative, we need to invert one scale
1060
1073
  if ( det < 0 ) sx = - sx;
1061
1074
 
1062
- position.x = te[ 12 ];
1063
- position.y = te[ 13 ];
1064
- position.z = te[ 14 ];
1065
-
1066
1075
  // scale the rotation part
1067
1076
  _m1.copy( this );
1068
1077
 
@@ -54,7 +54,7 @@ class Quaternion {
54
54
  * @param {number} srcOffset0 - An offset into the first source array.
55
55
  * @param {Array<number>} src1 - The source array of the second quaternion.
56
56
  * @param {number} srcOffset1 - An offset into the second source array.
57
- * @param {number} t - The interpolation factor in the range `[0,1]`.
57
+ * @param {number} t - The interpolation factor. A value in the range `[0,1]` will interpolate. A value outside the range `[0,1]` will extrapolate.
58
58
  * @see {@link Quaternion#slerp}
59
59
  */
60
60
  static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
@@ -69,28 +69,6 @@ class Quaternion {
69
69
  z1 = src1[ srcOffset1 + 2 ],
70
70
  w1 = src1[ srcOffset1 + 3 ];
71
71
 
72
- if ( t <= 0 ) {
73
-
74
- dst[ dstOffset + 0 ] = x0;
75
- dst[ dstOffset + 1 ] = y0;
76
- dst[ dstOffset + 2 ] = z0;
77
- dst[ dstOffset + 3 ] = w0;
78
-
79
- return;
80
-
81
- }
82
-
83
- if ( t >= 1 ) {
84
-
85
- dst[ dstOffset + 0 ] = x1;
86
- dst[ dstOffset + 1 ] = y1;
87
- dst[ dstOffset + 2 ] = z1;
88
- dst[ dstOffset + 3 ] = w1;
89
-
90
- return;
91
-
92
- }
93
-
94
72
  if ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {
95
73
 
96
74
  let dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;
@@ -732,18 +710,14 @@ class Quaternion {
732
710
  }
733
711
 
734
712
  /**
735
- * Performs a spherical linear interpolation between quaternions.
713
+ * Performs a spherical linear interpolation between this quaternion and the target quaternion.
736
714
  *
737
715
  * @param {Quaternion} qb - The target quaternion.
738
- * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.
716
+ * @param {number} t - The interpolation factor. A value in the range `[0,1]` will interpolate. A value outside the range `[0,1]` will extrapolate.
739
717
  * @return {Quaternion} A reference to this quaternion.
740
718
  */
741
719
  slerp( qb, t ) {
742
720
 
743
- if ( t <= 0 ) return this;
744
-
745
- if ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()
746
-
747
721
  let x = qb._x, y = qb._y, z = qb._z, w = qb._w;
748
722
 
749
723
  let dot = this.dot( qb );
@@ -405,7 +405,7 @@ class Sphere {
405
405
  * Returns a serialized structure of the bounding sphere.
406
406
  *
407
407
  * @param {Object} json - The serialized json to set the sphere from.
408
- * @return {Box3} A reference to this bounding sphere.
408
+ * @return {Sphere} A reference to this bounding sphere.
409
409
  */
410
410
  fromJSON( json ) {
411
411
 
@@ -106,7 +106,7 @@ class Vector3 {
106
106
  }
107
107
 
108
108
  /**
109
- * Sets the vector's x component to the given value
109
+ * Sets the vector's x component to the given value.
110
110
  *
111
111
  * @param {number} x - The value to set.
112
112
  * @return {Vector3} A reference to this vector.
@@ -120,7 +120,7 @@ class Vector3 {
120
120
  }
121
121
 
122
122
  /**
123
- * Sets the vector's y component to the given value
123
+ * Sets the vector's y component to the given value.
124
124
  *
125
125
  * @param {number} y - The value to set.
126
126
  * @return {Vector3} A reference to this vector.
@@ -134,7 +134,7 @@ class Vector3 {
134
134
  }
135
135
 
136
136
  /**
137
- * Sets the vector's z component to the given value
137
+ * Sets the vector's z component to the given value.
138
138
  *
139
139
  * @param {number} z - The value to set.
140
140
  * @return {Vector3} A reference to this vector.
@@ -744,8 +744,6 @@ class Vector3 {
744
744
 
745
745
  }
746
746
 
747
- // TODO lengthSquared?
748
-
749
747
  /**
750
748
  * Computes the square of the Euclidean length (straight-line length) from
751
749
  * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should