super-three 0.179.0 → 0.181.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 (430) hide show
  1. package/build/three.cjs +1112 -595
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +492 -254
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6573 -2150
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6572 -2149
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +52 -43
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +3 -2
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +41 -27
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -46,10 +46,10 @@ class WebGPUTimestampQueryPool extends TimestampQueryPool {
46
46
  /**
47
47
  * Allocates a pair of queries for a given render context.
48
48
  *
49
- * @param {Object} renderContext - The render context to allocate queries for.
49
+ * @param {string} uid - A unique identifier for the render context.
50
50
  * @returns {?number} The base offset for the allocated queries, or null if allocation failed.
51
51
  */
52
- allocateQueriesForContext( renderContext ) {
52
+ allocateQueriesForContext( uid ) {
53
53
 
54
54
  if ( ! this.trackTimestamp || this.isDisposed ) return null;
55
55
 
@@ -63,7 +63,8 @@ class WebGPUTimestampQueryPool extends TimestampQueryPool {
63
63
  const baseOffset = this.currentQueryIndex;
64
64
  this.currentQueryIndex += 2;
65
65
 
66
- this.queryOffsets.set( renderContext.id, baseOffset );
66
+ this.queryOffsets.set( uid, baseOffset );
67
+
67
68
  return baseOffset;
68
69
 
69
70
  }
@@ -177,26 +178,48 @@ class WebGPUTimestampQueryPool extends TimestampQueryPool {
177
178
 
178
179
  }
179
180
 
181
+ //
182
+
180
183
  const times = new BigUint64Array( this.resultBuffer.getMappedRange( 0, bytesUsed ) );
181
- let totalDuration = 0;
184
+ const framesDuration = {};
185
+
186
+ const frames = [];
187
+
188
+ for ( const [ uid, baseOffset ] of currentOffsets ) {
189
+
190
+ const match = uid.match( /^(.*):f(\d+)$/ );
191
+ const frame = parseInt( match[ 2 ] );
192
+
193
+ if ( frames.includes( frame ) === false ) {
182
194
 
183
- for ( const [ , baseOffset ] of currentOffsets ) {
195
+ frames.push( frame );
196
+
197
+ }
198
+
199
+ if ( framesDuration[ frame ] === undefined ) framesDuration[ frame ] = 0;
184
200
 
185
201
  const startTime = times[ baseOffset ];
186
202
  const endTime = times[ baseOffset + 1 ];
187
203
  const duration = Number( endTime - startTime ) / 1e6;
188
- totalDuration += duration;
204
+
205
+ this.timestamps.set( uid, duration );
206
+
207
+ framesDuration[ frame ] += duration;
189
208
 
190
209
  }
191
210
 
211
+ // Return the total duration of the last frame
212
+ const totalDuration = framesDuration[ frames[ frames.length - 1 ] ];
213
+
192
214
  this.resultBuffer.unmap();
193
215
  this.lastValue = totalDuration;
216
+ this.frames = frames;
194
217
 
195
218
  return totalDuration;
196
219
 
197
220
  } catch ( error ) {
198
221
 
199
- console.error( 'Error resolving queries:', error );
222
+ error( 'Error resolving queries:', error );
200
223
  if ( this.resultBuffer.mapState === 'mapped' ) {
201
224
 
202
225
  this.resultBuffer.unmap();
@@ -234,7 +257,7 @@ class WebGPUTimestampQueryPool extends TimestampQueryPool {
234
257
 
235
258
  } catch ( error ) {
236
259
 
237
- console.error( 'Error waiting for pending resolve:', error );
260
+ error( 'Error waiting for pending resolve:', error );
238
261
 
239
262
  }
240
263
 
@@ -249,7 +272,7 @@ class WebGPUTimestampQueryPool extends TimestampQueryPool {
249
272
 
250
273
  } catch ( error ) {
251
274
 
252
- console.error( 'Error unmapping buffer:', error );
275
+ error( 'Error unmapping buffer:', error );
253
276
 
254
277
  }
255
278
 
@@ -83,7 +83,7 @@ class WebGPUUtils {
83
83
  const renderer = this.backend.renderer;
84
84
  const renderTarget = renderer.getRenderTarget();
85
85
 
86
- samples = renderTarget ? renderTarget.samples : renderer.samples;
86
+ samples = renderTarget ? renderTarget.samples : renderer.currentSamples;
87
87
 
88
88
  } else if ( texture.renderTarget ) {
89
89
 
@@ -124,6 +124,26 @@ class WebGPUUtils {
124
124
 
125
125
  }
126
126
 
127
+ /**
128
+ * Returns the GPU formats of all color attachments of the current render context.
129
+ *
130
+ * @param {RenderContext} renderContext - The render context.
131
+ * @return {Array<string>} The GPU texture formats of all color attachments.
132
+ */
133
+ getCurrentColorFormats( renderContext ) {
134
+
135
+ if ( renderContext.textures !== null ) {
136
+
137
+ return renderContext.textures.map( t => this.getTextureFormatGPU( t ) );
138
+
139
+ } else {
140
+
141
+ return [ this.getPreferredCanvasFormat() ]; // default context format
142
+
143
+ }
144
+
145
+ }
146
+
127
147
  /**
128
148
  * Returns the output color space of the current render context.
129
149
  *
@@ -186,7 +206,7 @@ class WebGPUUtils {
186
206
 
187
207
  }
188
208
 
189
- return this.getSampleCount( this.backend.renderer.samples );
209
+ return this.getSampleCount( this.backend.renderer.currentSamples );
190
210
 
191
211
  }
192
212
 
@@ -13,6 +13,7 @@ import { DepthTexture } from '../../textures/DepthTexture.js';
13
13
  import { ExternalTexture } from '../../textures/ExternalTexture.js';
14
14
  import { DepthFormat, DepthStencilFormat, RGBAFormat, UnsignedByteType, UnsignedIntType, UnsignedInt248Type } from '../../constants.js';
15
15
  import { WebXRDepthSensing } from './WebXRDepthSensing.js';
16
+ import { warn } from '../../utils.js';
16
17
 
17
18
  /**
18
19
  * This class represents an abstraction of the WebXR Device API and is
@@ -56,6 +57,8 @@ class WebXRManager extends EventDispatcher {
56
57
  let glBaseLayer = null;
57
58
  let xrFrame = null;
58
59
 
60
+ const supportsGlBinding = typeof XRWebGLBinding !== 'undefined';
61
+
59
62
  const depthSensing = new WebXRDepthSensing();
60
63
  const cameraAccessTextures = {};
61
64
  const attributes = gl.getContextAttributes();
@@ -287,7 +290,7 @@ class WebXRManager extends EventDispatcher {
287
290
 
288
291
  if ( scope.isPresenting === true ) {
289
292
 
290
- console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );
293
+ warn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );
291
294
 
292
295
  }
293
296
 
@@ -309,7 +312,7 @@ class WebXRManager extends EventDispatcher {
309
312
 
310
313
  if ( scope.isPresenting === true ) {
311
314
 
312
- console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );
315
+ warn( 'WebXRManager: Cannot change reference space type while presenting.' );
313
316
 
314
317
  }
315
318
 
@@ -340,6 +343,9 @@ class WebXRManager extends EventDispatcher {
340
343
  /**
341
344
  * Returns the current base layer.
342
345
  *
346
+ * This is an `XRProjectionLayer` when the targeted XR device supports the
347
+ * WebXR Layers API, or an `XRWebGLLayer` otherwise.
348
+ *
343
349
  * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.
344
350
  */
345
351
  this.getBaseLayer = function () {
@@ -351,10 +357,19 @@ class WebXRManager extends EventDispatcher {
351
357
  /**
352
358
  * Returns the current XR binding.
353
359
  *
354
- * @return {?XRWebGLBinding} The XR binding.
360
+ * Creates a new binding if needed and the browser is
361
+ * capable of doing so.
362
+ *
363
+ * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.
355
364
  */
356
365
  this.getBinding = function () {
357
366
 
367
+ if ( glBinding === null && supportsGlBinding ) {
368
+
369
+ glBinding = new XRWebGLBinding( session, gl );
370
+
371
+ }
372
+
358
373
  return glBinding;
359
374
 
360
375
  };
@@ -422,17 +437,12 @@ class WebXRManager extends EventDispatcher {
422
437
  currentPixelRatio = renderer.getPixelRatio();
423
438
  renderer.getSize( currentSize );
424
439
 
425
- if ( typeof XRWebGLBinding !== 'undefined' ) {
426
-
427
- glBinding = new XRWebGLBinding( session, gl );
428
-
429
- }
430
440
 
431
441
  // Check that the browser implements the necessary APIs to use an
432
442
  // XRProjectionLayer rather than an XRWebGLLayer
433
- const useLayers = glBinding !== null && 'createProjectionLayer' in XRWebGLBinding.prototype;
443
+ const supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;
434
444
 
435
- if ( ! useLayers ) {
445
+ if ( ! supportsLayers ) {
436
446
 
437
447
  const layerInit = {
438
448
  antialias: attributes.antialias,
@@ -491,7 +501,7 @@ class WebXRManager extends EventDispatcher {
491
501
 
492
502
  }
493
503
 
494
- glBinding = new XRWebGLBinding( session, gl );
504
+ glBinding = this.getBinding();
495
505
 
496
506
  glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
497
507
 
@@ -587,6 +597,8 @@ class WebXRManager extends EventDispatcher {
587
597
  /**
588
598
  * Returns the current depth texture computed via depth sensing.
589
599
  *
600
+ * See {@link WebXRDepthSensing#getDepthTexture}.
601
+ *
590
602
  * @return {?Texture} The depth texture.
591
603
  */
592
604
  this.getDepthTexture = function () {
@@ -763,7 +775,7 @@ class WebXRManager extends EventDispatcher {
763
775
 
764
776
  /**
765
777
  * Updates the state of the XR camera. Use this method on app level if you
766
- * set cameraAutoUpdate` to `false`. The method requires the non-XR
778
+ * set `cameraAutoUpdate` to `false`. The method requires the non-XR
767
779
  * camera of the scene as a parameter. The passed in camera's transformation
768
780
  * is automatically adjusted to the position of the XR camera when calling
769
781
  * this method.
@@ -941,6 +953,8 @@ class WebXRManager extends EventDispatcher {
941
953
  /**
942
954
  * Returns the depth sensing mesh.
943
955
  *
956
+ * See {@link WebXRDepthSensing#getMesh}.
957
+ *
944
958
  * @return {Mesh} The depth sensing mesh.
945
959
  */
946
960
  this.getDepthSensingMesh = function () {
@@ -1061,7 +1075,9 @@ class WebXRManager extends EventDispatcher {
1061
1075
  enabledFeatures.includes( 'depth-sensing' ) &&
1062
1076
  session.depthUsage == 'gpu-optimized';
1063
1077
 
1064
- if ( gpuDepthSensingEnabled && glBinding ) {
1078
+ if ( gpuDepthSensingEnabled && supportsGlBinding ) {
1079
+
1080
+ glBinding = scope.getBinding();
1065
1081
 
1066
1082
  const depthData = glBinding.getDepthInformation( views[ 0 ] );
1067
1083
 
@@ -1076,32 +1092,30 @@ class WebXRManager extends EventDispatcher {
1076
1092
  const cameraAccessEnabled = enabledFeatures &&
1077
1093
  enabledFeatures.includes( 'camera-access' );
1078
1094
 
1079
- if ( cameraAccessEnabled ) {
1095
+ if ( cameraAccessEnabled && supportsGlBinding ) {
1080
1096
 
1081
1097
  renderer.state.unbindTexture();
1082
1098
 
1083
- if ( glBinding ) {
1084
-
1085
- for ( let i = 0; i < views.length; i ++ ) {
1099
+ glBinding = scope.getBinding();
1086
1100
 
1087
- const camera = views[ i ].camera;
1101
+ for ( let i = 0; i < views.length; i ++ ) {
1088
1102
 
1089
- if ( camera ) {
1103
+ const camera = views[ i ].camera;
1090
1104
 
1091
- let cameraTex = cameraAccessTextures[ camera ];
1105
+ if ( camera ) {
1092
1106
 
1093
- if ( ! cameraTex ) {
1107
+ let cameraTex = cameraAccessTextures[ camera ];
1094
1108
 
1095
- cameraTex = new ExternalTexture();
1096
- cameraAccessTextures[ camera ] = cameraTex;
1109
+ if ( ! cameraTex ) {
1097
1110
 
1098
- }
1099
-
1100
- const glTexture = glBinding.getCameraImage( camera );
1101
- cameraTex.sourceTexture = glTexture;
1111
+ cameraTex = new ExternalTexture();
1112
+ cameraAccessTextures[ camera ] = cameraTex;
1102
1113
 
1103
1114
  }
1104
1115
 
1116
+ const glTexture = glBinding.getCameraImage( camera );
1117
+ cameraTex.sourceTexture = glTexture;
1118
+
1105
1119
  }
1106
1120
 
1107
1121
  }
@@ -1,12 +1,13 @@
1
1
  import { Texture } from './Texture.js';
2
2
 
3
3
  /**
4
- * Represents a texture created externally from the renderer context.
4
+ * Represents a texture created externally with the same renderer context.
5
5
  *
6
6
  * This may be a texture from a protected media stream, device camera feed,
7
7
  * or other data feeds like a depth sensor.
8
8
  *
9
- * Note that this class is only supported in {@link WebGLRenderer} right now.
9
+ * Note that this class is only supported in {@link WebGLRenderer}, and in
10
+ * the {@link WebGPURenderer} WebGPU backend.
10
11
  *
11
12
  * @augments Texture
12
13
  */
@@ -15,7 +16,7 @@ class ExternalTexture extends Texture {
15
16
  /**
16
17
  * Creates a new raw texture.
17
18
  *
18
- * @param {?WebGLTexture} [sourceTexture=null] - The external texture.
19
+ * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.
19
20
  */
20
21
  constructor( sourceTexture = null ) {
21
22
 
@@ -24,7 +25,7 @@ class ExternalTexture extends Texture {
24
25
  /**
25
26
  * The external source texture.
26
27
  *
27
- * @type {?WebGLTexture}
28
+ * @type {?(WebGLTexture|GPUTexture)}
28
29
  * @default null
29
30
  */
30
31
  this.sourceTexture = sourceTexture;
@@ -40,6 +41,16 @@ class ExternalTexture extends Texture {
40
41
 
41
42
  }
42
43
 
44
+ copy( source ) {
45
+
46
+ super.copy( source );
47
+
48
+ this.sourceTexture = source.sourceTexture;
49
+
50
+ return this;
51
+
52
+ }
53
+
43
54
  }
44
55
 
45
56
  export { ExternalTexture };
@@ -1,5 +1,6 @@
1
1
  import { ImageUtils } from '../extras/ImageUtils.js';
2
2
  import { generateUUID } from '../math/MathUtils.js';
3
+ import { warn } from '../utils.js';
3
4
 
4
5
  let _sourceId = 0;
5
6
 
@@ -83,7 +84,7 @@ class Source {
83
84
 
84
85
  const data = this.data;
85
86
 
86
- if ( data instanceof HTMLVideoElement ) {
87
+ if ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {
87
88
 
88
89
  target.set( data.videoWidth, data.videoHeight, 0 );
89
90
 
@@ -217,7 +218,7 @@ function serializeImage( image ) {
217
218
 
218
219
  } else {
219
220
 
220
- console.warn( 'THREE.Texture: Unable to serialize Texture.' );
221
+ warn( 'Texture: Unable to serialize Texture.' );
221
222
  return {};
222
223
 
223
224
  }
@@ -15,6 +15,7 @@ import { Vector2 } from '../math/Vector2.js';
15
15
  import { Vector3 } from '../math/Vector3.js';
16
16
  import { Matrix3 } from '../math/Matrix3.js';
17
17
  import { Source } from './Source.js';
18
+ import { warn } from '../utils.js';
18
19
 
19
20
  let _textureId = 0;
20
21
 
@@ -521,7 +522,7 @@ class Texture extends EventDispatcher {
521
522
 
522
523
  if ( newValue === undefined ) {
523
524
 
524
- console.warn( `THREE.Texture.setValues(): parameter '${ key }' has value of undefined.` );
525
+ warn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );
525
526
  continue;
526
527
 
527
528
  }
@@ -530,7 +531,7 @@ class Texture extends EventDispatcher {
530
531
 
531
532
  if ( currentValue === undefined ) {
532
533
 
533
- console.warn( `THREE.Texture.setValues(): property '${ key }' does not exist.` );
534
+ warn( `Texture.setValues(): property '${ key }' does not exist.` );
534
535
  continue;
535
536
 
536
537
  }
@@ -108,15 +108,14 @@ class VideoTexture extends Texture {
108
108
 
109
109
  }
110
110
 
111
- /**
112
- * @override
113
- */
114
111
  dispose() {
115
112
 
116
113
  if ( this._requestVideoFrameCallbackId !== 0 ) {
117
114
 
118
115
  this.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );
119
116
 
117
+ this._requestVideoFrameCallbackId = 0;
118
+
120
119
  }
121
120
 
122
121
  super.dispose();
package/src/utils.js CHANGED
@@ -78,13 +78,77 @@ function createCanvasElement() {
78
78
 
79
79
  const _cache = {};
80
80
 
81
- function warnOnce( message ) {
81
+ let _setConsoleFunction = null;
82
+
83
+ function setConsoleFunction( fn ) {
84
+
85
+ _setConsoleFunction = fn;
86
+
87
+ }
88
+
89
+ function getConsoleFunction() {
90
+
91
+ return _setConsoleFunction;
92
+
93
+ }
94
+
95
+ function log( ...params ) {
96
+
97
+ const message = 'THREE.' + params.shift();
98
+
99
+ if ( _setConsoleFunction ) {
100
+
101
+ _setConsoleFunction( 'log', message, ...params );
102
+
103
+ } else {
104
+
105
+ console.log( message, ...params );
106
+
107
+ }
108
+
109
+ }
110
+
111
+ function warn( ...params ) {
112
+
113
+ const message = 'THREE.' + params.shift();
114
+
115
+ if ( _setConsoleFunction ) {
116
+
117
+ _setConsoleFunction( 'warn', message, ...params );
118
+
119
+ } else {
120
+
121
+ console.warn( message, ...params );
122
+
123
+ }
124
+
125
+ }
126
+
127
+ function error( ...params ) {
128
+
129
+ const message = 'THREE.' + params.shift();
130
+
131
+ if ( _setConsoleFunction ) {
132
+
133
+ _setConsoleFunction( 'error', message, ...params );
134
+
135
+ } else {
136
+
137
+ console.error( message, ...params );
138
+
139
+ }
140
+
141
+ }
142
+
143
+ function warnOnce( ...params ) {
144
+
145
+ const message = params.join( ' ' );
82
146
 
83
147
  if ( message in _cache ) return;
84
148
 
85
149
  _cache[ message ] = true;
86
150
 
87
- console.warn( message );
151
+ warn( ...params );
88
152
 
89
153
  }
90
154
 
@@ -149,4 +213,4 @@ function toReversedProjectionMatrix( projectionMatrix ) {
149
213
 
150
214
  }
151
215
 
152
- export { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS, createCanvasElement, warnOnce, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix };
216
+ export { arrayMin, arrayMax, arrayNeedsUint32, getTypedArray, createElementNS, createCanvasElement, setConsoleFunction, getConsoleFunction, log, warn, error, warnOnce, probeAsync, toNormalizedProjectionMatrix, toReversedProjectionMatrix };