super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -281,7 +281,7 @@ class TrackballControls extends Controls {
281
281
  this.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );
282
282
  this.domElement.addEventListener( 'contextmenu', this._onContextMenu );
283
283
 
284
- this.domElement.style.touchAction = 'none'; // disable touch scroll
284
+ this.domElement.style.touchAction = 'none'; // Disable touch scroll
285
285
 
286
286
  }
287
287
 
@@ -291,13 +291,13 @@ class TrackballControls extends Controls {
291
291
  window.removeEventListener( 'keyup', this._onKeyUp );
292
292
 
293
293
  this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
294
- this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
295
- this.domElement.removeEventListener( 'pointerup', this._onPointerUp );
294
+ this.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );
295
+ this.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );
296
296
  this.domElement.removeEventListener( 'pointercancel', this._onPointerCancel );
297
297
  this.domElement.removeEventListener( 'wheel', this._onMouseWheel );
298
298
  this.domElement.removeEventListener( 'contextmenu', this._onContextMenu );
299
299
 
300
- this.domElement.style.touchAction = 'auto'; // disable touch scroll
300
+ this.domElement.style.touchAction = ''; // Restore touch scroll
301
301
 
302
302
  }
303
303
 
@@ -660,8 +660,8 @@ function onPointerDown( event ) {
660
660
 
661
661
  this.domElement.setPointerCapture( event.pointerId );
662
662
 
663
- this.domElement.addEventListener( 'pointermove', this._onPointerMove );
664
- this.domElement.addEventListener( 'pointerup', this._onPointerUp );
663
+ this.domElement.ownerDocument.addEventListener( 'pointermove', this._onPointerMove );
664
+ this.domElement.ownerDocument.addEventListener( 'pointerup', this._onPointerUp );
665
665
 
666
666
  }
667
667
 
@@ -719,8 +719,8 @@ function onPointerUp( event ) {
719
719
 
720
720
  this.domElement.releasePointerCapture( event.pointerId );
721
721
 
722
- this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
723
- this.domElement.removeEventListener( 'pointerup', this._onPointerUp );
722
+ this.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );
723
+ this.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );
724
724
 
725
725
  }
726
726
 
@@ -251,6 +251,33 @@ class TransformControls extends Controls {
251
251
  */
252
252
  defineProperty( 'showZ', true );
253
253
 
254
+ /**
255
+ * Whether the xy-plane helper should be visible or not.
256
+ *
257
+ * @name TransformControls#showXY
258
+ * @type {boolean}
259
+ * @default true
260
+ */
261
+ defineProperty( 'showXY', true );
262
+
263
+ /**
264
+ * Whether the yz-plane helper should be visible or not.
265
+ *
266
+ * @name TransformControls#showYZ
267
+ * @type {boolean}
268
+ * @default true
269
+ */
270
+ defineProperty( 'showYZ', true );
271
+
272
+ /**
273
+ * Whether the xz-axis helper should be visible or not.
274
+ *
275
+ * @name TransformControls#showXZ
276
+ * @type {boolean}
277
+ * @default true
278
+ */
279
+ defineProperty( 'showXZ', true );
280
+
254
281
  /**
255
282
  * The minimum allowed X position during translation.
256
283
  *
@@ -373,7 +400,7 @@ class TransformControls extends Controls {
373
400
  this.domElement.addEventListener( 'pointermove', this._onPointerHover );
374
401
  this.domElement.addEventListener( 'pointerup', this._onPointerUp );
375
402
 
376
- this.domElement.style.touchAction = 'none'; // disable touch scroll
403
+ this.domElement.style.touchAction = 'none'; // Disable touch scroll
377
404
 
378
405
  }
379
406
 
@@ -384,7 +411,7 @@ class TransformControls extends Controls {
384
411
  this.domElement.removeEventListener( 'pointermove', this._onPointerMove );
385
412
  this.domElement.removeEventListener( 'pointerup', this._onPointerUp );
386
413
 
387
- this.domElement.style.touchAction = 'auto';
414
+ this.domElement.style.touchAction = ''; // Restore touch scroll
388
415
 
389
416
  }
390
417
 
@@ -1784,6 +1811,11 @@ class TransformControlsGizmo extends Object3D {
1784
1811
  handle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );
1785
1812
  handle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );
1786
1813
 
1814
+ // Hide disabled plane helpers
1815
+ handle.visible = handle.visible && ( handle.name.indexOf( 'XY' ) === - 1 || this.showXY );
1816
+ handle.visible = handle.visible && ( handle.name.indexOf( 'YZ' ) === - 1 || this.showYZ );
1817
+ handle.visible = handle.visible && ( handle.name.indexOf( 'XZ' ) === - 1 || this.showXZ );
1818
+
1787
1819
  // highlight selected axis
1788
1820
 
1789
1821
  handle.material._color = handle.material._color || handle.material.color.clone();
@@ -13,6 +13,7 @@ import { CSMShader } from './CSMShader.js';
13
13
  const _cameraToLightMatrix = new Matrix4();
14
14
  const _lightSpaceFrustum = new CSMFrustum( { webGL: true } );
15
15
  const _center = new Vector3();
16
+ const _origin = new Vector3();
16
17
  const _bbox = new Box3();
17
18
  const _uniformArray = [];
18
19
  const _logArray = [];
@@ -367,7 +368,7 @@ export class CSM {
367
368
 
368
369
  // for each frustum we need to find its min-max box aligned with the light orientation
369
370
  // the position in _lightOrientationMatrix does not matter, as we transform there and back
370
- _lightOrientationMatrix.lookAt( new Vector3(), this.lightDirection, _up );
371
+ _lightOrientationMatrix.lookAt( _origin, this.lightDirection, _up );
371
372
  _lightOrientationMatrixInverse.copy( _lightOrientationMatrix ).invert();
372
373
 
373
374
  for ( let i = 0; i < frustums.length; i ++ ) {
@@ -574,8 +574,12 @@ class CSMShadowNode extends ShadowBaseNode {
574
574
  const light = this.lights[ i ];
575
575
  const parent = light.parent;
576
576
 
577
- parent.remove( light.target );
578
- parent.remove( light );
577
+ if ( parent !== null ) {
578
+
579
+ parent.remove( light.target );
580
+ parent.remove( light );
581
+
582
+ }
579
583
 
580
584
  }
581
585
 
@@ -1,16 +1,38 @@
1
1
  import {
2
2
  LinearFilter,
3
+ MathUtils,
3
4
  Matrix3,
4
5
  NearestFilter,
6
+ PerspectiveCamera,
5
7
  RGBAFormat,
6
8
  ShaderMaterial,
7
- StereoCamera,
9
+ Vector3,
8
10
  WebGLRenderTarget
9
11
  } from 'three';
10
12
  import { FullScreenQuad } from '../postprocessing/Pass.js';
13
+ import { frameCorners } from '../utils/CameraUtils.js';
14
+
15
+ const _cameraL = /*@__PURE__*/ new PerspectiveCamera();
16
+ const _cameraR = /*@__PURE__*/ new PerspectiveCamera();
17
+
18
+ // Reusable vectors for screen corner calculations
19
+ const _eyeL = /*@__PURE__*/ new Vector3();
20
+ const _eyeR = /*@__PURE__*/ new Vector3();
21
+ const _screenCenter = /*@__PURE__*/ new Vector3();
22
+ const _screenBottomLeft = /*@__PURE__*/ new Vector3();
23
+ const _screenBottomRight = /*@__PURE__*/ new Vector3();
24
+ const _screenTopLeft = /*@__PURE__*/ new Vector3();
25
+ const _right = /*@__PURE__*/ new Vector3();
26
+ const _up = /*@__PURE__*/ new Vector3();
27
+ const _forward = /*@__PURE__*/ new Vector3();
11
28
 
12
29
  /**
13
- * A class that creates an anaglyph effect.
30
+ * A class that creates an anaglyph effect using physically-correct
31
+ * off-axis stereo projection.
32
+ *
33
+ * This implementation uses CameraUtils.frameCorners() to align stereo
34
+ * camera frustums to a virtual screen plane, providing accurate depth
35
+ * perception with zero parallax at the plane distance.
14
36
  *
15
37
  * Note that this class can only be used with {@link WebGLRenderer}.
16
38
  * When using {@link WebGPURenderer}, use {@link AnaglyphPassNode}.
@@ -42,13 +64,38 @@ class AnaglyphEffect {
42
64
  - 0.00155529, - 0.0184503, 1.2264
43
65
  ] );
44
66
 
45
- const _stereo = new StereoCamera();
67
+ /**
68
+ * The interpupillary distance (eye separation) in world units.
69
+ * Typical human IPD is 0.064 meters (64mm).
70
+ *
71
+ * @type {number}
72
+ * @default 0.064
73
+ */
74
+ this.eyeSep = 0.064;
75
+
76
+ /**
77
+ * The distance in world units from the viewer to the virtual
78
+ * screen plane where zero parallax (screen depth) occurs.
79
+ * Objects at this distance appear at the screen surface.
80
+ * Objects closer appear in front of the screen (negative parallax).
81
+ * Objects further appear behind the screen (positive parallax).
82
+ *
83
+ * The screen dimensions are derived from the camera's FOV and aspect ratio
84
+ * at this distance, ensuring the stereo view matches the camera's field of view.
85
+ *
86
+ * @type {number}
87
+ * @default 0.5
88
+ */
89
+ this.planeDistance = 0.5;
46
90
 
47
91
  const _params = { minFilter: LinearFilter, magFilter: NearestFilter, format: RGBAFormat };
48
92
 
49
93
  const _renderTargetL = new WebGLRenderTarget( width, height, _params );
50
94
  const _renderTargetR = new WebGLRenderTarget( width, height, _params );
51
95
 
96
+ _cameraL.layers.enable( 1 );
97
+ _cameraR.layers.enable( 2 );
98
+
52
99
  const _material = new ShaderMaterial( {
53
100
 
54
101
  uniforms: {
@@ -141,16 +188,64 @@ class AnaglyphEffect {
141
188
 
142
189
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
143
190
 
144
- _stereo.update( camera );
145
-
191
+ // Get the camera's local coordinate axes from its world matrix
192
+ camera.matrixWorld.extractBasis( _right, _up, _forward );
193
+ _right.normalize();
194
+ _up.normalize();
195
+ _forward.normalize();
196
+
197
+ // Calculate eye positions
198
+ const halfSep = this.eyeSep / 2;
199
+ _eyeL.copy( camera.position ).addScaledVector( _right, - halfSep );
200
+ _eyeR.copy( camera.position ).addScaledVector( _right, halfSep );
201
+
202
+ // Calculate screen center (at planeDistance in front of the camera center)
203
+ _screenCenter.copy( camera.position ).addScaledVector( _forward, - this.planeDistance );
204
+
205
+ // Calculate screen dimensions from camera FOV and aspect ratio
206
+ const halfHeight = this.planeDistance * Math.tan( MathUtils.DEG2RAD * camera.fov / 2 );
207
+ const halfWidth = halfHeight * camera.aspect;
208
+
209
+ // Calculate screen corners
210
+ _screenBottomLeft.copy( _screenCenter )
211
+ .addScaledVector( _right, - halfWidth )
212
+ .addScaledVector( _up, - halfHeight );
213
+
214
+ _screenBottomRight.copy( _screenCenter )
215
+ .addScaledVector( _right, halfWidth )
216
+ .addScaledVector( _up, - halfHeight );
217
+
218
+ _screenTopLeft.copy( _screenCenter )
219
+ .addScaledVector( _right, - halfWidth )
220
+ .addScaledVector( _up, halfHeight );
221
+
222
+ // Set up left eye camera
223
+ _cameraL.position.copy( _eyeL );
224
+ _cameraL.near = camera.near;
225
+ _cameraL.far = camera.far;
226
+ frameCorners( _cameraL, _screenBottomLeft, _screenBottomRight, _screenTopLeft, true );
227
+ _cameraL.matrixWorld.compose( _cameraL.position, _cameraL.quaternion, _cameraL.scale );
228
+ _cameraL.matrixWorldInverse.copy( _cameraL.matrixWorld ).invert();
229
+
230
+ // Set up right eye camera
231
+ _cameraR.position.copy( _eyeR );
232
+ _cameraR.near = camera.near;
233
+ _cameraR.far = camera.far;
234
+ frameCorners( _cameraR, _screenBottomLeft, _screenBottomRight, _screenTopLeft, true );
235
+ _cameraR.matrixWorld.compose( _cameraR.position, _cameraR.quaternion, _cameraR.scale );
236
+ _cameraR.matrixWorldInverse.copy( _cameraR.matrixWorld ).invert();
237
+
238
+ // Render left eye
146
239
  renderer.setRenderTarget( _renderTargetL );
147
240
  renderer.clear();
148
- renderer.render( scene, _stereo.cameraL );
241
+ renderer.render( scene, _cameraL );
149
242
 
243
+ // Render right eye
150
244
  renderer.setRenderTarget( _renderTargetR );
151
245
  renderer.clear();
152
- renderer.render( scene, _stereo.cameraR );
246
+ renderer.render( scene, _cameraR );
153
247
 
248
+ // Composite anaglyph
154
249
  renderer.setRenderTarget( null );
155
250
  _quad.render( renderer );
156
251
 
@@ -0,0 +1,59 @@
1
+ import {
2
+ BackSide,
3
+ Mesh,
4
+ MeshBasicMaterial,
5
+ SphereGeometry,
6
+ Scene
7
+ } from 'three';
8
+
9
+ /**
10
+ * This class represents a scene with a uniform color that can be used as
11
+ * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents
12
+ * uniform ambient lighting and can be used for Image Based Lighting by
13
+ * assigning it to {@link Scene#environment}.
14
+ *
15
+ * ```js
16
+ * const environment = new ColorEnvironment( 0x00ff00 );
17
+ * const pmremGenerator = new THREE.PMREMGenerator( renderer );
18
+ *
19
+ * const envMap = pmremGenerator.fromScene( environment ).texture;
20
+ * scene.environment = envMap;
21
+ * ```
22
+ *
23
+ * @augments Scene
24
+ * @three_import import { ColorEnvironment } from 'three/addons/environments/ColorEnvironment.js';
25
+ */
26
+ class ColorEnvironment extends Scene {
27
+
28
+ /**
29
+ * Constructs a new color environment.
30
+ *
31
+ * @param {number|Color} color - The color of the environment.
32
+ */
33
+ constructor( color = 0xffffff ) {
34
+
35
+ super();
36
+
37
+ this.name = 'ColorEnvironment';
38
+
39
+ const geometry = new SphereGeometry( 1, 16, 16 );
40
+ const material = new MeshBasicMaterial( { color: color, side: BackSide } );
41
+
42
+ this.add( new Mesh( geometry, material ) );
43
+
44
+ }
45
+
46
+ /**
47
+ * Frees internal resources. This method should be called
48
+ * when the environment is no longer required.
49
+ */
50
+ dispose() {
51
+
52
+ this.children[ 0 ].geometry.dispose();
53
+ this.children[ 0 ].material.dispose();
54
+
55
+ }
56
+
57
+ }
58
+
59
+ export { ColorEnvironment };
@@ -36,6 +36,9 @@ class RoomEnvironment extends Scene {
36
36
 
37
37
  super();
38
38
 
39
+ this.name = 'RoomEnvironment';
40
+ this.position.y = - 3.5;
41
+
39
42
  const geometry = new BoxGeometry();
40
43
  geometry.deleteAttribute( 'uv' );
41
44
 
@@ -90,7 +90,7 @@ function supportedRTT( renderTarget ) {
90
90
 
91
91
  }
92
92
 
93
- if ( renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
93
+ if ( renderTarget.isCubeRenderTarget || renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
94
94
 
95
95
  throw Error( 'EXRExporter.parse: Unsupported render target type, expected instance of WebGLRenderTarget.' );
96
96
 
@@ -88,6 +88,7 @@ const KHR_mesh_quantization_ExtraAttrTypes = {
88
88
  * - KHR_texture_transform
89
89
  * - EXT_materials_bump
90
90
  * - EXT_mesh_gpu_instancing
91
+ * - EXT_texture_webp
91
92
  *
92
93
  * The following glTF 2.0 extension is supported by an external user plugin:
93
94
  *
@@ -1533,15 +1534,30 @@ class GLTFWriter {
1533
1534
 
1534
1535
  }
1535
1536
 
1536
- let mimeType = map.userData.mimeType;
1537
+ const mimeType = map.userData.mimeType;
1537
1538
 
1538
- if ( mimeType === 'image/webp' ) mimeType = 'image/png';
1539
+ const imageIndex = this.processImage( map.image, map.format, map.flipY, mimeType );
1539
1540
 
1540
1541
  const textureDef = {
1541
- sampler: this.processSampler( map ),
1542
- source: this.processImage( map.image, map.format, map.flipY, mimeType )
1542
+ sampler: this.processSampler( map )
1543
1543
  };
1544
1544
 
1545
+ if ( mimeType === 'image/webp' ) {
1546
+
1547
+ textureDef.extensions = textureDef.extensions || {};
1548
+ textureDef.extensions[ 'EXT_texture_webp' ] = {
1549
+ source: imageIndex
1550
+ };
1551
+
1552
+ this.extensionsUsed[ 'EXT_texture_webp' ] = true;
1553
+ this.extensionsRequired[ 'EXT_texture_webp' ] = true;
1554
+
1555
+ } else {
1556
+
1557
+ textureDef.source = imageIndex;
1558
+
1559
+ }
1560
+
1545
1561
  if ( map.name ) textureDef.name = map.name;
1546
1562
 
1547
1563
  await this._invokeAllAsync( async function ( ext ) {
@@ -1832,7 +1848,7 @@ class GLTFWriter {
1832
1848
  const validVertexAttributes =
1833
1849
  /^(POSITION|NORMAL|TANGENT|TEXCOORD_\d+|COLOR_\d+|JOINTS_\d+|WEIGHTS_\d+)$/;
1834
1850
 
1835
- if ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;
1851
+ if ( ! validVertexAttributes.test( attributeName ) && ! attributeName.startsWith( '_' ) ) attributeName = '_' + attributeName;
1836
1852
 
1837
1853
  if ( cache.attributes.has( this.getUID( attribute ) ) ) {
1838
1854
 
@@ -1852,12 +1868,12 @@ class GLTFWriter {
1852
1868
  ! ( array instanceof Uint8Array ) ) {
1853
1869
 
1854
1870
  console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' );
1855
- modifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );
1871
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Uint16Array );
1856
1872
 
1857
1873
  } else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {
1858
1874
 
1859
1875
  console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` );
1860
- modifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );
1876
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Float32Array );
1861
1877
 
1862
1878
  }
1863
1879
 
@@ -2355,6 +2371,13 @@ class GLTFWriter {
2355
2371
 
2356
2372
  if ( ! json.nodes ) json.nodes = [];
2357
2373
 
2374
+ // Handle pivot by creating a container node
2375
+ if ( object.pivot !== null ) {
2376
+
2377
+ return await this._processNodeWithPivotAsync( object );
2378
+
2379
+ }
2380
+
2358
2381
  const nodeDef = {};
2359
2382
 
2360
2383
  if ( options.trs ) {
@@ -2451,6 +2474,126 @@ class GLTFWriter {
2451
2474
 
2452
2475
  }
2453
2476
 
2477
+ /**
2478
+ * Process Object3D node with pivot using container approach
2479
+ * @param {THREE.Object3D} object Object3D with pivot
2480
+ * @return {Promise<number>} Index of the container node
2481
+ */
2482
+ async _processNodeWithPivotAsync( object ) {
2483
+
2484
+ const json = this.json;
2485
+ const options = this.options;
2486
+ const nodeMap = this.nodeMap;
2487
+
2488
+ const pivot = object.pivot;
2489
+
2490
+ // Container node: holds position + pivot offset, rotation, scale
2491
+ // Animations will target this node
2492
+ const containerDef = {};
2493
+
2494
+ const rotation = object.quaternion.toArray();
2495
+ const position = [
2496
+ object.position.x + pivot.x,
2497
+ object.position.y + pivot.y,
2498
+ object.position.z + pivot.z
2499
+ ];
2500
+ const scale = object.scale.toArray();
2501
+
2502
+ if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {
2503
+
2504
+ containerDef.rotation = rotation;
2505
+
2506
+ }
2507
+
2508
+ if ( ! equalArray( position, [ 0, 0, 0 ] ) ) {
2509
+
2510
+ containerDef.translation = position;
2511
+
2512
+ }
2513
+
2514
+ if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {
2515
+
2516
+ containerDef.scale = scale;
2517
+
2518
+ }
2519
+
2520
+ // Store pivot in extras for round-trip reconstruction
2521
+ containerDef.extras = { pivot: pivot.toArray() };
2522
+
2523
+ if ( object.name !== '' ) containerDef.name = String( object.name );
2524
+
2525
+ this.serializeUserData( object, containerDef );
2526
+
2527
+ const containerIndex = json.nodes.push( containerDef ) - 1;
2528
+
2529
+ // Map original object to container so animations target it
2530
+ nodeMap.set( object, containerIndex );
2531
+
2532
+ // Child node: holds mesh with -pivot offset
2533
+ const childDef = {};
2534
+
2535
+ const childPosition = [ - pivot.x, - pivot.y, - pivot.z ];
2536
+
2537
+ if ( ! equalArray( childPosition, [ 0, 0, 0 ] ) ) {
2538
+
2539
+ childDef.translation = childPosition;
2540
+
2541
+ }
2542
+
2543
+ if ( object.isMesh || object.isLine || object.isPoints ) {
2544
+
2545
+ const meshIndex = await this.processMeshAsync( object );
2546
+
2547
+ if ( meshIndex !== null ) childDef.mesh = meshIndex;
2548
+
2549
+ } else if ( object.isCamera ) {
2550
+
2551
+ childDef.camera = this.processCamera( object );
2552
+
2553
+ }
2554
+
2555
+ if ( object.isSkinnedMesh ) this.skins.push( object );
2556
+
2557
+ const childIndex = json.nodes.push( childDef ) - 1;
2558
+
2559
+ // Build children array for container
2560
+ const containerChildren = [ childIndex ];
2561
+
2562
+ // Process object's children as children of the child node
2563
+ if ( object.children.length > 0 ) {
2564
+
2565
+ const grandchildren = [];
2566
+
2567
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
2568
+
2569
+ const child = object.children[ i ];
2570
+
2571
+ if ( child.visible || options.onlyVisible === false ) {
2572
+
2573
+ const childNodeIndex = await this.processNodeAsync( child );
2574
+
2575
+ if ( childNodeIndex !== null ) grandchildren.push( childNodeIndex );
2576
+
2577
+ }
2578
+
2579
+ }
2580
+
2581
+ if ( grandchildren.length > 0 ) childDef.children = grandchildren;
2582
+
2583
+ }
2584
+
2585
+ containerDef.children = containerChildren;
2586
+
2587
+ await this._invokeAllAsync( function ( ext ) {
2588
+
2589
+ ext.writeNode && ext.writeNode( object, containerDef );
2590
+
2591
+ } );
2592
+
2593
+ return containerIndex;
2594
+
2595
+ }
2596
+
2454
2597
  /**
2455
2598
  * Process Scene
2456
2599
  * @param {Scene} scene Scene to process
@@ -3538,9 +3681,9 @@ GLTFExporter.Utils = {
3538
3681
 
3539
3682
  },
3540
3683
 
3541
- toFloat32BufferAttribute: function ( srcAttribute ) {
3684
+ toTypedBufferAttribute: function ( srcAttribute, TypedArray ) {
3542
3685
 
3543
- const dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3686
+ const dstAttribute = new BufferAttribute( new TypedArray( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3544
3687
 
3545
3688
  if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {
3546
3689
 
@@ -501,7 +501,6 @@ function buildHierarchy( object, parentNode, materials, usedNames, files, option
501
501
  function buildXform( object, usedNames ) {
502
502
 
503
503
  const name = getName( object, usedNames );
504
- const transform = buildMatrix( object.matrix );
505
504
 
506
505
  if ( object.matrix.determinant() < 0 ) {
507
506
 
@@ -514,8 +513,28 @@ function buildXform( object, usedNames ) {
514
513
 
515
514
  const node = new USDNode( name, 'Xform' );
516
515
 
517
- node.addProperty( `matrix4d xformOp:transform = ${transform}` );
518
- node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
516
+ if ( object.pivot !== null ) {
517
+
518
+ // Export with pivot using separate transform ops
519
+ const p = object.position;
520
+ const q = object.quaternion;
521
+ const s = object.scale;
522
+ const piv = object.pivot;
523
+
524
+ node.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );
525
+ node.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );
526
+ node.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );
527
+ node.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );
528
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:translate:pivot", "xformOp:orient", "xformOp:scale", "!invert!xformOp:translate:pivot"]' );
529
+
530
+ } else {
531
+
532
+ // Export as single transform matrix
533
+ const transform = buildMatrix( object.matrix );
534
+ node.addProperty( `matrix4d xformOp:transform = ${transform}` );
535
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
536
+
537
+ }
519
538
 
520
539
  return node;
521
540
 
@@ -35,7 +35,7 @@ class DecalGeometry extends BufferGeometry {
35
35
  * @param {Mesh} [mesh] - The base mesh the decal should be projected on.
36
36
  * @param {Vector3} [position] - The position of the decal projector.
37
37
  * @param {Euler} [orientation] - The orientation of the decal projector.
38
- * @param {Vector3} [size] - Tje scale of the decal projector.
38
+ * @param {Vector3} [size] - The scale of the decal projector.
39
39
  */
40
40
  constructor( mesh = new Mesh(), position = new Vector3(), orientation = new Euler(), size = new Vector3( 1, 1, 1 ) ) {
41
41
 
@@ -2,6 +2,8 @@ import {
2
2
  ExtrudeGeometry
3
3
  } from 'three';
4
4
 
5
+ import { Font } from '../loaders/FontLoader.js';
6
+
5
7
  /**
6
8
  * A class for generating text as a single geometry. It is constructed by providing a string of text, and a set of
7
9
  * parameters consisting of a loaded font and extrude settings.
@@ -60,6 +62,22 @@ class TextGeometry extends ExtrudeGeometry {
60
62
 
61
63
  }
62
64
 
65
+ toJSON() {
66
+
67
+ const data = super.toJSON();
68
+ return data;
69
+
70
+ }
71
+
72
+ static fromJSON( data ) {
73
+
74
+ const options = data.options;
75
+
76
+ options.font = new Font( options.font.data );
77
+ return new TextGeometry( options.text, options );
78
+
79
+ }
80
+
63
81
  }
64
82
 
65
83
  /**