@gnsx/three 0.185.15 → 0.186.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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -92,11 +92,13 @@ export * from './loaders/EXRLoader.js';
92
92
  export * from './loaders/FBXLoader.js';
93
93
  export * from './loaders/FontLoader.js';
94
94
  export * from './loaders/GCodeLoader.js';
95
+ export * from './loaders/GLTFGaussianSplatLoaderExtension.js';
95
96
  export * from './loaders/GLTFLoader.js';
96
97
  export * from './loaders/HDRLoader.js';
97
98
  export * from './loaders/HDRCubeTextureLoader.js';
98
99
  export * from './loaders/IESLoader.js';
99
100
  export * from './loaders/KMZLoader.js';
101
+ export * from './loaders/KSPLATLoader.js';
100
102
  export * from './loaders/KTX2Loader.js';
101
103
  export * from './loaders/KTXLoader.js';
102
104
  export * from './loaders/LDrawLoader.js';
@@ -104,12 +106,6 @@ export * from './loaders/LUT3dlLoader.js';
104
106
  export * from './loaders/LUTCubeLoader.js';
105
107
  export * from './loaders/LUTImageLoader.js';
106
108
  export * from './loaders/LWOLoader.js';
107
- // WITH_GENESYS
108
- // LottieLoader is excluded from the Addons barrel because it imports lottie-web from a CDN URL
109
- // (https://cdn.jsdelivr.net/npm/lottie-web@5.13.0/+esm), which Node.js/TSX cannot resolve in test
110
- // environments. The loader is also deprecated in r185 and scheduled for removal in r186.
111
- // export * from './loaders/LottieLoader.js';
112
- // !WITH_GENESYS
113
109
  export * from './loaders/MD2Loader.js';
114
110
  export * from './loaders/MDDLoader.js';
115
111
  export * from './loaders/MTLLoader.js';
@@ -120,6 +116,8 @@ export * from './loaders/PDBLoader.js';
120
116
  export * from './loaders/PLYLoader.js';
121
117
  export * from './loaders/PVRLoader.js';
122
118
  export * from './loaders/RGBELoader.js';
119
+ export * from './loaders/SPLATLoader.js';
120
+ export * from './loaders/SPZLoader.js';
123
121
  export * from './loaders/UltraHDRLoader.js';
124
122
  export * from './loaders/STLLoader.js';
125
123
  export * from './loaders/SVGLoader.js';
@@ -155,6 +153,7 @@ export * from './misc/MorphAnimMesh.js';
155
153
  export * from './misc/MorphBlendMesh.js';
156
154
  export * from './misc/ProgressiveLightMap.js';
157
155
  export * from './misc/RollerCoaster.js';
156
+ export * from './misc/Sculptor.js';
158
157
  export * from './misc/TileCreasedNormalsPlugin.js';
159
158
  export * from './misc/TubePainter.js';
160
159
  export * from './misc/Volume.js';
@@ -166,6 +165,7 @@ export * from './modifiers/SimplifyModifier.js';
166
165
  export * from './modifiers/TessellateModifier.js';
167
166
 
168
167
  export * from './objects/GroundedSkybox.js';
168
+ export * from './objects/GaussianSplat.js';
169
169
  export * from './objects/Lensflare.js';
170
170
  export * from './objects/MarchingCubes.js';
171
171
  export * from './objects/Reflector.js';
@@ -2563,7 +2563,7 @@ class ArcballControls extends Controls {
2563
2563
  * Rotates camera around its direction axis passing by a given point by a given angle.
2564
2564
  *
2565
2565
  * @private
2566
- * @param {Vector3} point - The point where the rotation axis is passing trough.
2566
+ * @param {Vector3} point - The point where the rotation axis is passing through.
2567
2567
  * @param {number} angle - Angle in radians.
2568
2568
  * @returns {Object} The computed transformation matrix.
2569
2569
  */
@@ -262,25 +262,51 @@ class FirstPersonControls extends Controls {
262
262
 
263
263
  if ( this.enabled === false ) return;
264
264
 
265
- const moveForward = this._keyForward || this._pointerForward;
266
- const moveBackward = this._keyBackward || this._pointerBackward;
265
+ let drive = ( this._keyForward ? 1 : 0 ) - ( this._keyBackward ? 1 : 0 );
266
+ let lookMove = ( this._pointerForward ? 1 : 0 ) - ( this._pointerBackward ? 1 : 0 );
267
267
 
268
- const forward = moveForward || ( this.autoForward && ! moveBackward );
269
-
270
- // target velocity in the object's local space
271
-
272
- _targetVelocity.set(
273
- ( this._moveRight ? 1 : 0 ) - ( this._moveLeft ? 1 : 0 ),
274
- ( this._moveUp ? 1 : 0 ) - ( this._moveDown ? 1 : 0 ),
275
- ( moveBackward ? 1 : 0 ) - ( forward ? 1 : 0 )
276
- ).multiplyScalar( this.movementSpeed );
268
+ if ( this.autoForward && drive === 0 && lookMove === 0 ) lookMove = 1;
277
269
 
278
270
  // faster forward movement the higher the camera is
279
271
 
280
- if ( forward && this.heightSpeed ) {
272
+ let forwardSpeed = this.movementSpeed;
273
+
274
+ if ( this.heightSpeed ) {
281
275
 
282
276
  const y = MathUtils.clamp( this.object.position.y, this.heightMin, this.heightMax );
283
- _targetVelocity.z -= ( y - this.heightMin ) * this.heightCoef;
277
+ forwardSpeed += ( y - this.heightMin ) * this.heightCoef;
278
+
279
+ }
280
+
281
+ // target velocity in world space: keys are world axis aligned, moving in the
282
+ // XZ plane from the camera's yaw only (R / F along world Y), while pointer
283
+ // and touch input moves along the look direction
284
+
285
+ const yaw = MathUtils.degToRad( this._lon );
286
+ const sinYaw = Math.sin( yaw );
287
+ const cosYaw = Math.cos( yaw );
288
+
289
+ let strafe = ( this._moveRight ? 1 : 0 ) - ( this._moveLeft ? 1 : 0 );
290
+ let climb = ( this._moveUp ? 1 : 0 ) - ( this._moveDown ? 1 : 0 );
291
+
292
+ // normalize combined key input so diagonal movement isn't faster
293
+
294
+ const keyScale = 1 / Math.max( 1, Math.sqrt( strafe * strafe + climb * climb + drive * drive ) );
295
+
296
+ strafe *= this.movementSpeed * keyScale;
297
+ climb *= this.movementSpeed * keyScale;
298
+ drive *= ( drive > 0 ? forwardSpeed : this.movementSpeed ) * keyScale;
299
+
300
+ _targetVelocity.set(
301
+ sinYaw * drive - cosYaw * strafe,
302
+ climb,
303
+ cosYaw * drive + sinYaw * strafe
304
+ );
305
+
306
+ if ( lookMove !== 0 ) {
307
+
308
+ _lookDirection.set( 0, 0, - 1 ).applyQuaternion( this.object.quaternion );
309
+ _targetVelocity.addScaledVector( _lookDirection, lookMove * ( lookMove > 0 ? forwardSpeed : this.movementSpeed ) );
284
310
 
285
311
  }
286
312
 
@@ -288,9 +314,7 @@ class FirstPersonControls extends Controls {
288
314
 
289
315
  this._velocity.lerp( _targetVelocity, this.dampingFactor );
290
316
 
291
- this.object.translateX( this._velocity.x * delta );
292
- this.object.translateY( this._velocity.y * delta );
293
- this.object.translateZ( this._velocity.z * delta );
317
+ this.object.position.addScaledVector( this._velocity, delta );
294
318
 
295
319
  let verticalLookRatio = 1;
296
320
 
@@ -447,8 +471,8 @@ function onKeyDown( event ) {
447
471
  case 'ArrowRight':
448
472
  case 'KeyD': this._moveRight = true; break;
449
473
 
450
- case 'KeyE': this._moveUp = true; break;
451
- case 'KeyQ': this._moveDown = true; break;
474
+ case 'KeyR': this._moveUp = true; break;
475
+ case 'KeyF': this._moveDown = true; break;
452
476
 
453
477
  }
454
478
 
@@ -470,8 +494,8 @@ function onKeyUp( event ) {
470
494
  case 'ArrowRight':
471
495
  case 'KeyD': this._moveRight = false; break;
472
496
 
473
- case 'KeyE': this._moveUp = false; break;
474
- case 'KeyQ': this._moveDown = false; break;
497
+ case 'KeyR': this._moveUp = false; break;
498
+ case 'KeyF': this._moveDown = false; break;
475
499
 
476
500
  }
477
501
 
@@ -511,6 +511,8 @@ class OrbitControls extends Controls {
511
511
 
512
512
  disconnect() {
513
513
 
514
+ this.state = _STATE.NONE;
515
+
514
516
  this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
515
517
  this.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );
516
518
  this.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );
@@ -523,8 +525,15 @@ class OrbitControls extends Controls {
523
525
 
524
526
  const document = this.domElement.getRootNode(); // offscreen canvas compatibility
525
527
  document.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );
528
+ document.removeEventListener( 'keyup', this._interceptControlUp, { capture: true } );
529
+
530
+ this._controlActive = false;
531
+
532
+ this._pointers.length = 0;
533
+ this._pointerPositions = {};
526
534
 
527
535
  this.domElement.style.touchAction = ''; // Restore touch scroll
536
+ this.domElement.style.cursor = 'auto';
528
537
 
529
538
  }
530
539
 
@@ -97,6 +97,14 @@ class TrackballControls extends Controls {
97
97
  */
98
98
  this.panSpeed = 0.3;
99
99
 
100
+ /**
101
+ * The roll speed used for multi-touch roll.
102
+ *
103
+ * @type {number}
104
+ * @default 1
105
+ */
106
+ this.rollSpeed = 1.0;
107
+
100
108
  /**
101
109
  * Whether rotation is disabled or not.
102
110
  *
@@ -121,6 +129,15 @@ class TrackballControls extends Controls {
121
129
  */
122
130
  this.noPan = false;
123
131
 
132
+ /**
133
+ * Whether two finger twist gesture rolls
134
+ * the camera around its view axis or not.
135
+ *
136
+ * @type {boolean}
137
+ * @default false
138
+ */
139
+ this.multiTouchRoll = false;
140
+
124
141
  /**
125
142
  * Whether damping is disabled or not.
126
143
  *
@@ -209,10 +226,14 @@ class TrackballControls extends Controls {
209
226
  this.keyState = _STATE.NONE;
210
227
 
211
228
  this._lastPosition = new Vector3();
229
+ this._lastUp = new Vector3();
212
230
  this._lastZoom = 1;
213
231
  this._touchZoomDistanceStart = 0;
214
232
  this._touchZoomDistanceEnd = 0;
233
+ this._touchRollAngle = 0;
234
+ this._touchRollPointerIds = '';
215
235
  this._lastAngle = 0;
236
+ this._lastRollAngle = 0;
216
237
 
217
238
  this._eye = new Vector3();
218
239
 
@@ -331,6 +352,12 @@ class TrackballControls extends Controls {
331
352
 
332
353
  this._rotateCamera();
333
354
 
355
+ if ( this.multiTouchRoll === true ) {
356
+
357
+ this._rollCamera();
358
+
359
+ }
360
+
334
361
  }
335
362
 
336
363
  if ( ! this.noZoom ) {
@@ -353,11 +380,15 @@ class TrackballControls extends Controls {
353
380
 
354
381
  this.object.lookAt( this.target );
355
382
 
356
- if ( this._lastPosition.distanceToSquared( this.object.position ) > _EPS ) {
383
+ const positionChanged = this._lastPosition.distanceToSquared( this.object.position ) > _EPS;
384
+ const rollChanged = this._lastUp.distanceToSquared( this.object.up ) > _EPS;
385
+
386
+ if ( positionChanged || rollChanged ) {
357
387
 
358
388
  this.dispatchEvent( _changeEvent );
359
389
 
360
390
  this._lastPosition.copy( this.object.position );
391
+ this._lastUp.copy( this.object.up );
361
392
 
362
393
  }
363
394
 
@@ -365,11 +396,16 @@ class TrackballControls extends Controls {
365
396
 
366
397
  this.object.lookAt( this.target );
367
398
 
368
- if ( this._lastPosition.distanceToSquared( this.object.position ) > _EPS || this._lastZoom !== this.object.zoom ) {
399
+ const positionChanged = this._lastPosition.distanceToSquared( this.object.position ) > _EPS;
400
+ const rollChanged = this._lastUp.distanceToSquared( this.object.up ) > _EPS;
401
+ const zoomChanged = this._lastZoom !== this.object.zoom;
402
+
403
+ if ( positionChanged || rollChanged || zoomChanged ) {
369
404
 
370
405
  this.dispatchEvent( _changeEvent );
371
406
 
372
407
  this._lastPosition.copy( this.object.position );
408
+ this._lastUp.copy( this.object.up );
373
409
  this._lastZoom = this.object.zoom;
374
410
 
375
411
  }
@@ -404,6 +440,7 @@ class TrackballControls extends Controls {
404
440
  this.dispatchEvent( _changeEvent );
405
441
 
406
442
  this._lastPosition.copy( this.object.position );
443
+ this._lastUp.copy( this.object.up );
407
444
  this._lastZoom = this.object.zoom;
408
445
 
409
446
  }
@@ -489,6 +526,76 @@ class TrackballControls extends Controls {
489
526
 
490
527
  }
491
528
 
529
+ _rollCamera() {
530
+
531
+ const angle = this._getTouchRollAngle();
532
+
533
+ if ( angle ) {
534
+
535
+ this._lastRollAngle = angle * this.rollSpeed;
536
+
537
+ } else if ( ! this.staticMoving && this._lastRollAngle ) {
538
+
539
+ this._lastRollAngle *= Math.sqrt( 1.0 - this.dynamicDampingFactor );
540
+
541
+ } else {
542
+
543
+ return;
544
+
545
+ }
546
+
547
+ _eyeDirection.copy( this._eye ).normalize();
548
+ _quaternion.setFromAxisAngle( _eyeDirection, this._lastRollAngle );
549
+
550
+ this.object.up.applyQuaternion( _quaternion );
551
+
552
+ }
553
+
554
+ _getTouchRollAngle() {
555
+
556
+ const first = this._pointers[ 0 ];
557
+ const second = this._pointers[ 1 ];
558
+
559
+ if ( second === undefined || first.pointerType !== 'touch' || second.pointerType !== 'touch' ) {
560
+
561
+ this._touchRollPointerIds = '';
562
+ return 0;
563
+
564
+ }
565
+
566
+ const pointerIds = `${ first.pointerId },${ second.pointerId }`;
567
+
568
+ const positionFirst = this._pointerPositions[ first.pointerId ];
569
+ const positionSecond = this._pointerPositions[ second.pointerId ];
570
+
571
+ const rollAngle = Math.atan2( positionSecond.y - positionFirst.y, positionSecond.x - positionFirst.x );
572
+
573
+ // fingers changed or new gesture started
574
+ if ( pointerIds !== this._touchRollPointerIds ) {
575
+
576
+ this._touchRollPointerIds = pointerIds;
577
+ this._touchRollAngle = rollAngle;
578
+ return 0;
579
+
580
+ }
581
+
582
+ let angle = rollAngle - this._touchRollAngle;
583
+ this._touchRollAngle = rollAngle;
584
+
585
+ if ( angle > Math.PI ) {
586
+
587
+ angle -= 2 * Math.PI;
588
+
589
+ } else if ( angle < - Math.PI ) {
590
+
591
+ angle += 2 * Math.PI;
592
+
593
+ }
594
+
595
+ return angle;
596
+
597
+ }
598
+
492
599
  _zoomCamera() {
493
600
 
494
601
  let factor;
@@ -839,7 +946,6 @@ function onMouseMove( event ) {
839
946
 
840
947
  if ( state === _STATE.ROTATE && ! this.noRotate ) {
841
948
 
842
- this._movePrev.copy( this._moveCurr );
843
949
  this._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );
844
950
 
845
951
  } else if ( state === _STATE.ZOOM && ! this.noZoom ) {
@@ -939,7 +1045,6 @@ function onTouchMove( event ) {
939
1045
  switch ( this._pointers.length ) {
940
1046
 
941
1047
  case 1:
942
- this._movePrev.copy( this._moveCurr );
943
1048
  this._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );
944
1049
  break;
945
1050
 
@@ -491,6 +491,16 @@ class CSMShadowNode extends ShadowBaseNode {
491
491
 
492
492
  }
493
493
 
494
+ build( builder ) {
495
+
496
+ // register before the shadow nodes so `updateBefore()` runs first
497
+
498
+ builder.addSequentialNode( this );
499
+
500
+ return super.build( builder );
501
+
502
+ }
503
+
494
504
  setup( builder ) {
495
505
 
496
506
  if ( this.camera === null ) this._init( builder );
@@ -562,6 +572,9 @@ class CSMShadowNode extends ShadowBaseNode {
562
572
  lwLight.target.position.copy( _center );
563
573
  lwLight.target.position.add( _lightDirection );
564
574
 
575
+ lwLight.updateMatrixWorld();
576
+ lwLight.target.updateMatrixWorld();
577
+
565
578
  }
566
579
 
567
580
  }
@@ -19,8 +19,8 @@ import {
19
19
  RGBAFormat,
20
20
  RepeatWrapping,
21
21
  Scene,
22
- Source,
23
22
  SRGBColorSpace,
23
+ TextureSource,
24
24
  CompressedTexture,
25
25
  Vector3,
26
26
  Quaternion,
@@ -246,7 +246,7 @@ class GLTFExporter {
246
246
  * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.
247
247
  *
248
248
  * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the
249
- * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.
249
+ * corresponding texture utils {@link module:WebGLTextureUtils} or {@link module:WebGPUTextureUtils}.
250
250
  *
251
251
  * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.
252
252
  * @return {GLTFExporter} A reference to this exporter.
@@ -616,7 +616,8 @@ class GLTFWriter {
616
616
  attributesNormalized: new Map(),
617
617
  materials: new Map(),
618
618
  textures: new Map(),
619
- images: new Map()
619
+ images: new Map(),
620
+ normalMaps: new Map()
620
621
  };
621
622
 
622
623
  this.textureUtils = null;
@@ -651,7 +652,8 @@ class GLTFWriter {
651
652
  onlyVisible: true,
652
653
  maxTextureSize: Infinity,
653
654
  animations: [],
654
- includeCustomExtensions: false
655
+ includeCustomExtensions: false,
656
+ copyright: null
655
657
  }, options );
656
658
 
657
659
  if ( this.options.animations.length > 0 ) {
@@ -686,6 +688,8 @@ class GLTFWriter {
686
688
  // Update bytelength of the single buffer.
687
689
  if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;
688
690
 
691
+ if ( options.copyright ) json.asset.copyright = options.copyright;
692
+
689
693
  if ( options.binary === true ) {
690
694
 
691
695
  // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification
@@ -1029,7 +1033,7 @@ class GLTFWriter {
1029
1033
 
1030
1034
  const texture = reference.clone();
1031
1035
 
1032
- texture.source = new Source( canvas );
1036
+ texture.source = new TextureSource( canvas );
1033
1037
  texture.colorSpace = NoColorSpace;
1034
1038
  texture.channel = ( metalnessMap || roughnessMap ).channel;
1035
1039
 
@@ -1091,7 +1095,7 @@ class GLTFWriter {
1091
1095
  context.putImageData( imageData, 0, 0 );
1092
1096
 
1093
1097
  const texture = normalMap.clone();
1094
- texture.source = new Source( canvas );
1098
+ texture.source = new TextureSource( canvas );
1095
1099
 
1096
1100
  return texture;
1097
1101
 
@@ -1750,7 +1754,18 @@ class GLTFWriter {
1750
1754
 
1751
1755
  if ( flipX || flipY ) {
1752
1756
 
1753
- normalMap = await this.buildNormalMapTextureAsync( material.normalMap, flipX, flipY );
1757
+ if ( cache.normalMaps.has( material.normalMap ) === false ) cache.normalMaps.set( material.normalMap, {} );
1758
+
1759
+ const cachedVariants = cache.normalMaps.get( material.normalMap );
1760
+ const cacheKey = `${flipX}:${flipY}`;
1761
+
1762
+ if ( cachedVariants[ cacheKey ] === undefined ) {
1763
+
1764
+ cachedVariants[ cacheKey ] = await this.buildNormalMapTextureAsync( material.normalMap, flipX, flipY );
1765
+
1766
+ }
1767
+
1768
+ normalMap = cachedVariants[ cacheKey ];
1754
1769
 
1755
1770
  }
1756
1771
 
@@ -3821,6 +3836,7 @@ GLTFExporter.Utils = {
3821
3836
  * @property {Array<AnimationClip>|Array<Array<AnimationClip>>} [animations=[]] - List of animations to be included in the export. When exporting a single 3D object or scene, this is a flat list of clips.
3822
3837
  * When exporting an array of multiple scenes, this must be a nested array with one list of clips per scene, matched to the input by index.
3823
3838
  * @property {boolean} [includeCustomExtensions=false] - Export custom glTF extensions defined on an object's `userData.gltfExtensions` property.
3839
+ * @property {string} [copyright=null] - Export with a copyright notice embedded in the glTF.
3824
3840
  **/
3825
3841
 
3826
3842
  /**
@@ -156,7 +156,7 @@ class USDZExporter {
156
156
  * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.
157
157
  *
158
158
  * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the
159
- * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.
159
+ * corresponding texture utils {@link module:WebGLTextureUtils} or {@link module:WebGPUTextureUtils}.
160
160
  *
161
161
  * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.
162
162
  */
@@ -342,7 +342,7 @@ class USDZExporter {
342
342
 
343
343
  }
344
344
 
345
- return zipSync( files, { level: 0 } );
345
+ return zipSync( files, { level: 0, mtime: new Date() } );
346
346
 
347
347
  }
348
348