@plastic-software/three 0.179.0 → 0.181.1

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 +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  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 +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  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 +48 -41
  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 +2 -1
  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 +42 -26
  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
 
@@ -12,6 +12,7 @@ import { DepthTexture } from '../../textures/DepthTexture.js';
12
12
  import { ExternalTexture } from '../../textures/ExternalTexture.js';
13
13
  import { DepthFormat, DepthStencilFormat, RGBAFormat, UnsignedByteType, UnsignedIntType, UnsignedInt248Type } from '../../constants.js';
14
14
  import { WebXRDepthSensing } from './WebXRDepthSensing.js';
15
+ import { warn } from '../../utils.js';
15
16
 
16
17
  /**
17
18
  * This class represents an abstraction of the WebXR Device API and is
@@ -52,6 +53,8 @@ class WebXRManager extends EventDispatcher {
52
53
  let glBaseLayer = null;
53
54
  let xrFrame = null;
54
55
 
56
+ const supportsGlBinding = typeof XRWebGLBinding !== 'undefined';
57
+
55
58
  const depthSensing = new WebXRDepthSensing();
56
59
  const cameraAccessTextures = {};
57
60
  const attributes = gl.getContextAttributes();
@@ -276,7 +279,7 @@ class WebXRManager extends EventDispatcher {
276
279
 
277
280
  if ( scope.isPresenting === true ) {
278
281
 
279
- console.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );
282
+ warn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );
280
283
 
281
284
  }
282
285
 
@@ -298,7 +301,7 @@ class WebXRManager extends EventDispatcher {
298
301
 
299
302
  if ( scope.isPresenting === true ) {
300
303
 
301
- console.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );
304
+ warn( 'WebXRManager: Cannot change reference space type while presenting.' );
302
305
 
303
306
  }
304
307
 
@@ -329,6 +332,9 @@ class WebXRManager extends EventDispatcher {
329
332
  /**
330
333
  * Returns the current base layer.
331
334
  *
335
+ * This is an `XRProjectionLayer` when the targeted XR device supports the
336
+ * WebXR Layers API, or an `XRWebGLLayer` otherwise.
337
+ *
332
338
  * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.
333
339
  */
334
340
  this.getBaseLayer = function () {
@@ -340,10 +346,19 @@ class WebXRManager extends EventDispatcher {
340
346
  /**
341
347
  * Returns the current XR binding.
342
348
  *
343
- * @return {?XRWebGLBinding} The XR binding.
349
+ * Creates a new binding if needed and the browser is
350
+ * capable of doing so.
351
+ *
352
+ * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.
344
353
  */
345
354
  this.getBinding = function () {
346
355
 
356
+ if ( glBinding === null && supportsGlBinding ) {
357
+
358
+ glBinding = new XRWebGLBinding( session, gl );
359
+
360
+ }
361
+
347
362
  return glBinding;
348
363
 
349
364
  };
@@ -405,17 +420,12 @@ class WebXRManager extends EventDispatcher {
405
420
  currentPixelRatio = renderer.getPixelRatio();
406
421
  renderer.getSize( currentSize );
407
422
 
408
- if ( typeof XRWebGLBinding !== 'undefined' ) {
409
-
410
- glBinding = new XRWebGLBinding( session, gl );
411
-
412
- }
413
423
 
414
424
  // Check that the browser implements the necessary APIs to use an
415
425
  // XRProjectionLayer rather than an XRWebGLLayer
416
- const useLayers = glBinding !== null && 'createProjectionLayer' in XRWebGLBinding.prototype;
426
+ const supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;
417
427
 
418
- if ( ! useLayers ) {
428
+ if ( ! supportsLayers ) {
419
429
 
420
430
  const layerInit = {
421
431
  antialias: attributes.antialias,
@@ -466,6 +476,8 @@ class WebXRManager extends EventDispatcher {
466
476
  scaleFactor: framebufferScaleFactor
467
477
  };
468
478
 
479
+ glBinding = this.getBinding();
480
+
469
481
  glProjLayer = glBinding.createProjectionLayer( projectionlayerInit );
470
482
 
471
483
  session.updateRenderState( { layers: [ glProjLayer ] } );
@@ -525,6 +537,8 @@ class WebXRManager extends EventDispatcher {
525
537
  /**
526
538
  * Returns the current depth texture computed via depth sensing.
527
539
  *
540
+ * See {@link WebXRDepthSensing#getDepthTexture}.
541
+ *
528
542
  * @return {?Texture} The depth texture.
529
543
  */
530
544
  this.getDepthTexture = function () {
@@ -695,7 +709,7 @@ class WebXRManager extends EventDispatcher {
695
709
 
696
710
  /**
697
711
  * Updates the state of the XR camera. Use this method on app level if you
698
- * set cameraAutoUpdate` to `false`. The method requires the non-XR
712
+ * set `cameraAutoUpdate` to `false`. The method requires the non-XR
699
713
  * camera of the scene as a parameter. The passed in camera's transformation
700
714
  * is automatically adjusted to the position of the XR camera when calling
701
715
  * this method.
@@ -872,6 +886,8 @@ class WebXRManager extends EventDispatcher {
872
886
  /**
873
887
  * Returns the depth sensing mesh.
874
888
  *
889
+ * See {@link WebXRDepthSensing#getMesh}.
890
+ *
875
891
  * @return {Mesh} The depth sensing mesh.
876
892
  */
877
893
  this.getDepthSensingMesh = function () {
@@ -992,7 +1008,9 @@ class WebXRManager extends EventDispatcher {
992
1008
  enabledFeatures.includes( 'depth-sensing' ) &&
993
1009
  session.depthUsage == 'gpu-optimized';
994
1010
 
995
- if ( gpuDepthSensingEnabled && glBinding ) {
1011
+ if ( gpuDepthSensingEnabled && supportsGlBinding ) {
1012
+
1013
+ glBinding = scope.getBinding();
996
1014
 
997
1015
  const depthData = glBinding.getDepthInformation( views[ 0 ] );
998
1016
 
@@ -1007,32 +1025,30 @@ class WebXRManager extends EventDispatcher {
1007
1025
  const cameraAccessEnabled = enabledFeatures &&
1008
1026
  enabledFeatures.includes( 'camera-access' );
1009
1027
 
1010
- if ( cameraAccessEnabled ) {
1028
+ if ( cameraAccessEnabled && supportsGlBinding ) {
1011
1029
 
1012
1030
  renderer.state.unbindTexture();
1013
1031
 
1014
- if ( glBinding ) {
1015
-
1016
- for ( let i = 0; i < views.length; i ++ ) {
1032
+ glBinding = scope.getBinding();
1017
1033
 
1018
- const camera = views[ i ].camera;
1034
+ for ( let i = 0; i < views.length; i ++ ) {
1019
1035
 
1020
- if ( camera ) {
1036
+ const camera = views[ i ].camera;
1021
1037
 
1022
- let cameraTex = cameraAccessTextures[ camera ];
1038
+ if ( camera ) {
1023
1039
 
1024
- if ( ! cameraTex ) {
1040
+ let cameraTex = cameraAccessTextures[ camera ];
1025
1041
 
1026
- cameraTex = new ExternalTexture();
1027
- cameraAccessTextures[ camera ] = cameraTex;
1042
+ if ( ! cameraTex ) {
1028
1043
 
1029
- }
1030
-
1031
- const glTexture = glBinding.getCameraImage( camera );
1032
- cameraTex.sourceTexture = glTexture;
1044
+ cameraTex = new ExternalTexture();
1045
+ cameraAccessTextures[ camera ] = cameraTex;
1033
1046
 
1034
1047
  }
1035
1048
 
1049
+ const glTexture = glBinding.getCameraImage( camera );
1050
+ cameraTex.sourceTexture = glTexture;
1051
+
1036
1052
  }
1037
1053
 
1038
1054
  }
@@ -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 };