@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
@@ -0,0 +1,533 @@
1
+ import * as THREE from 'three';
2
+ import * as TSL from 'three/tsl';
3
+
4
+ // some helpers below are ported from Blender and converted to TSL
5
+
6
+ const mapRange = TSL.Fn( ( [ x, fromMin, fromMax, toMin, toMax, clmp ] ) => {
7
+
8
+ const factor = x.sub( fromMin ).div( fromMax.sub( fromMin ) );
9
+ const result = toMin.add( factor.mul( toMax.sub( toMin ) ) );
10
+
11
+ return TSL.select( clmp, TSL.max( TSL.min( result, toMax ), toMin ), result );
12
+
13
+ } );
14
+
15
+ const voronoi3d = TSL.wgslFn( `
16
+ fn voronoi3d(x: vec3<f32>, smoothness: f32, randomness: f32) -> f32
17
+ {
18
+ let p = floor(x);
19
+ let f = fract(x);
20
+
21
+ var res = 0.0;
22
+ var totalWeight = 0.0;
23
+
24
+ for (var k = -1; k <= 1; k++)
25
+ {
26
+ for (var j = -1; j <= 1; j++)
27
+ {
28
+ for (var i = -1; i <= 1; i++)
29
+ {
30
+ let b = vec3<f32>(f32(i), f32(j), f32(k));
31
+ let hashOffset = hash3d(p + b) * randomness;
32
+ let r = b - f + hashOffset;
33
+ let d = length(r);
34
+
35
+ let weight = exp(-d * d / max(smoothness * smoothness, 0.001));
36
+ res += d * weight;
37
+ totalWeight += weight;
38
+ }
39
+ }
40
+ }
41
+
42
+ if (totalWeight > 0.0)
43
+ {
44
+ res /= totalWeight;
45
+ }
46
+
47
+ return smoothstep(0.0, 1.0, res);
48
+ }
49
+
50
+ fn hash3d(p: vec3<f32>) -> vec3<f32>
51
+ {
52
+ var p3 = fract(p * vec3<f32>(0.1031, 0.1030, 0.0973));
53
+ p3 += dot(p3, p3.yzx + 33.33);
54
+ return fract((p3.xxy + p3.yzz) * p3.zyx);
55
+ }
56
+ ` );
57
+
58
+ // const hash3d = TSL.Fn( ( [ p ] ) => {
59
+
60
+ // const p3 = p.mul( TSL.vec3( 0.1031, 0.1030, 0.0973 ) ).fract();
61
+ // const dotProduct = p3.dot( p3.yzx.add( 33.33 ) );
62
+ // p3.addAssign( dotProduct );
63
+
64
+ // return p3.xxy.add( p3.yzz ).mul( p3.zyx ).fract();
65
+
66
+ // } );
67
+
68
+ // const voronoi3d = TSL.Fn( ( [ x, smoothness, randomness ] ) => {
69
+ // let p = TSL.floor(x);
70
+ // let f = TSL.fract(x);
71
+
72
+ // var res = TSL.float(0.0);
73
+ // var totalWeight = TSL.float(0.0);
74
+
75
+ // TSL.Loop( 3, 3, 3, ( { k, j, i } ) => {
76
+ // let b = TSL.vec3(TSL.float(i).sub(1), TSL.float(j).sub(1), TSL.float(k).sub(1));
77
+ // let hashOffset = hash3d(p.add(b)).mul(randomness);
78
+ // let r = b.sub(f).add(hashOffset);
79
+ // let d = TSL.length(r);
80
+
81
+ // let weight = TSL.exp(d.negate().mul(d).div(TSL.max(smoothness.mul(smoothness), 0.001)));
82
+ // res.addAssign(d.mul(weight));
83
+ // totalWeight.addAssign(weight);
84
+ // } );
85
+
86
+ // res.assign(TSL.select(totalWeight.greaterThan(0.0), res.div(totalWeight), res));
87
+
88
+ // return TSL.smoothstep(0.0, 1.0, res);
89
+ // } );
90
+
91
+ const softLightMix = TSL.Fn( ( [ t, col1, col2 ] ) => {
92
+
93
+ const tm = TSL.float( 1.0 ).sub( t );
94
+
95
+ const one = TSL.vec3( 1.0 );
96
+ const scr = one.sub( one.sub( col2 ).mul( one.sub( col1 ) ) );
97
+
98
+ return tm.mul( col1 ).add( t.mul( one.sub( col1 ).mul( col2 ).mul( col1 ).add( col1.mul( scr ) ) ) );
99
+
100
+ } );
101
+
102
+ const noiseFbm = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
103
+
104
+ const fscale = TSL.float( 1.0 ).toVar();
105
+ const amp = TSL.float( 1.0 ).toVar();
106
+ const maxamp = TSL.float( 0.0 ).toVar();
107
+ const sum = TSL.float( 0.0 ).toVar();
108
+
109
+ const iterations = detail.floor();
110
+
111
+ TSL.Loop( iterations, () => {
112
+
113
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
114
+ sum.addAssign( t.mul( amp ) );
115
+ maxamp.addAssign( amp );
116
+ amp.mulAssign( roughness );
117
+ fscale.mulAssign( lacunarity );
118
+
119
+ } );
120
+
121
+ const rmd = detail.sub( iterations );
122
+ const hasRemainder = rmd.greaterThan( 0.001 );
123
+
124
+ return TSL.select(
125
+ hasRemainder,
126
+ TSL.select(
127
+ useNormalize.equal( 1 ),
128
+ ( () => {
129
+
130
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
131
+ const sum2 = sum.add( t.mul( amp ) );
132
+ const maxamp2 = maxamp.add( amp );
133
+ const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
134
+ const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
135
+ return TSL.mix( normalizedSum, normalizedSum2, rmd );
136
+
137
+ } )(),
138
+ ( () => {
139
+
140
+ const t = TSL.mx_noise_float( p.mul( fscale ) );
141
+ const sum2 = sum.add( t.mul( amp ) );
142
+ return TSL.mix( sum, sum2, rmd );
143
+
144
+ } )()
145
+ ),
146
+ TSL.select(
147
+ useNormalize.equal( 1 ),
148
+ sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
149
+ sum
150
+ )
151
+ );
152
+
153
+ } );
154
+
155
+ const noiseFbm3d = TSL.Fn( ( [ p, detail, roughness, lacunarity, useNormalize ] ) => {
156
+
157
+ const fscale = TSL.float( 1.0 ).toVar();
158
+
159
+ const amp = TSL.float( 1.0 ).toVar();
160
+ const maxamp = TSL.float( 0.0 ).toVar();
161
+ const sum = TSL.vec3( 0.0 ).toVar();
162
+
163
+ const iterations = detail.floor();
164
+
165
+ TSL.Loop( iterations, () => {
166
+
167
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
168
+ sum.addAssign( t.mul( amp ) );
169
+ maxamp.addAssign( amp );
170
+ amp.mulAssign( roughness );
171
+ fscale.mulAssign( lacunarity );
172
+
173
+ } );
174
+
175
+ const rmd = detail.sub( iterations );
176
+ const hasRemainder = rmd.greaterThan( 0.001 );
177
+
178
+ return TSL.select(
179
+ hasRemainder,
180
+ TSL.select(
181
+ useNormalize.equal( 1 ),
182
+ ( () => {
183
+
184
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
185
+ const sum2 = sum.add( t.mul( amp ) );
186
+ const maxamp2 = maxamp.add( amp );
187
+ const normalizedSum = sum.div( maxamp ).mul( 0.5 ).add( 0.5 );
188
+ const normalizedSum2 = sum2.div( maxamp2 ).mul( 0.5 ).add( 0.5 );
189
+ return TSL.mix( normalizedSum, normalizedSum2, rmd );
190
+
191
+ } )(),
192
+ ( () => {
193
+
194
+ const t = TSL.mx_noise_vec3( p.mul( fscale ) );
195
+ const sum2 = sum.add( t.mul( amp ) );
196
+ return TSL.mix( sum, sum2, rmd );
197
+
198
+ } )()
199
+ ),
200
+ TSL.select(
201
+ useNormalize.equal( 1 ),
202
+ sum.div( maxamp ).mul( 0.5 ).add( 0.5 ),
203
+ sum
204
+ )
205
+ );
206
+
207
+ } );
208
+
209
+ const woodCenter = TSL.Fn( ( [ p, centerSize ] ) => {
210
+
211
+ const pxyCenter = p.mul( TSL.vec3( 1, 1, 0 ) ).length();
212
+ const center = mapRange( pxyCenter, 0, 1, 0, centerSize, true );
213
+
214
+ return center;
215
+
216
+ } );
217
+
218
+ const spaceWarp = TSL.Fn( ( [ p, warpStrength, xyScale, zScale ] ) => {
219
+
220
+ const combinedXyz = TSL.vec3( xyScale, xyScale, zScale ).mul( p );
221
+ const noise = noiseFbm3d( combinedXyz.mul( 1.6 * 1.5 ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.int( 1 ) ).sub( 0.5 ).mul( warpStrength );
222
+ const pXy = p.mul( TSL.vec3( 1, 1, 0 ) );
223
+ const normalizedXy = pXy.normalize();
224
+ const warp = noise.mul( normalizedXy ).add( pXy );
225
+
226
+ return warp;
227
+
228
+ } );
229
+
230
+ const woodRings = TSL.Fn( ( [ w, ringThickness, ringBias, ringSizeVariance, ringVarianceScale, barkThickness ] ) => {
231
+
232
+ const rings = noiseFbm( w.mul( ringVarianceScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 1 ), TSL.int( 1 ) ).mul( ringSizeVariance ).add( w ).mul( ringThickness ).fract().mul( barkThickness );
233
+
234
+ const sharpRings = TSL.min( mapRange( rings, 0, ringBias, 0, 1, TSL.bool( true ) ), mapRange( rings, ringBias, 1, 1, 0, TSL.bool( true ) ) );
235
+
236
+ const blurAmount = TSL.max( TSL.positionView.length().div( 10 ), 1 );
237
+ const blurredRings = TSL.smoothstep( blurAmount.negate(), blurAmount, sharpRings.sub( 0.5 ) ).mul( 0.5 ).add( 0.5 );
238
+
239
+ return blurredRings;
240
+
241
+ } );
242
+
243
+ const woodDetail = TSL.Fn( ( [ warp, p, y, splotchScale ] ) => {
244
+
245
+ const radialCoords = TSL.clamp( TSL.atan( warp.y, warp.x ).div( TSL.PI2 ).add( 0.5 ), 0, 1 ).mul( TSL.PI2.mul( 3 ) );
246
+ const combinedXyz = TSL.vec3( radialCoords.sin(), y, radialCoords.cos().mul( p.z ) );
247
+ const scaled = TSL.vec3( 0.1, 1.19, 0.05 ).mul( combinedXyz );
248
+
249
+ return noiseFbm( scaled.mul( splotchScale ), TSL.float( 1 ), TSL.float( 0.5 ), TSL.float( 2 ), TSL.bool( true ) );
250
+
251
+ } );
252
+
253
+ const cellStructure = TSL.Fn( ( [ p, cellScale, cellSize ] ) => {
254
+
255
+ const warp = spaceWarp( p.mul( cellScale.div( 50 ) ), cellScale.div( 1000 ), 0.1, 1.77 );
256
+ const cells = voronoi3d( warp.xy.mul( 75 ), 0.5, 1 );
257
+
258
+ return mapRange( cells, cellSize, cellSize.add( 0.21 ), 0, 1, TSL.bool( true ) );
259
+
260
+ } );
261
+
262
+ const wood = TSL.Fn( ( [
263
+ p,
264
+ centerSize,
265
+ largeWarpScale,
266
+ largeGrainStretch,
267
+ smallWarpStrength,
268
+ smallWarpScale,
269
+ fineWarpStrength,
270
+ fineWarpScale,
271
+ ringThickness,
272
+ ringBias,
273
+ ringSizeVariance,
274
+ ringVarianceScale,
275
+ barkThickness,
276
+ splotchScale,
277
+ splotchIntensity,
278
+ cellScale,
279
+ cellSize,
280
+ darkGrainColor,
281
+ lightGrainColor
282
+ ] ) => {
283
+
284
+ const center = woodCenter( p, centerSize );
285
+ const mainWarp = spaceWarp( spaceWarp( p, center, largeWarpScale, largeGrainStretch ), smallWarpStrength, smallWarpScale, 0.17 );
286
+ const detailWarp = spaceWarp( mainWarp, fineWarpStrength, fineWarpScale, 0.17 );
287
+ const rings = woodRings( detailWarp.length(), TSL.float( 1 ).div( ringThickness ), ringBias, ringSizeVariance, ringVarianceScale, barkThickness );
288
+ const detail = woodDetail( detailWarp, p, detailWarp.length(), splotchScale );
289
+ const cells = cellStructure( mainWarp, cellScale, cellSize.div( TSL.max( TSL.positionView.length().mul( 10 ), 1 ) ) );
290
+ const baseColor = TSL.mix( darkGrainColor, lightGrainColor, rings );
291
+
292
+ return softLightMix( splotchIntensity, softLightMix( 0.407, baseColor, cells ), detail );
293
+
294
+ } );
295
+
296
+ const woodParams = {
297
+ teak: {
298
+ transformationMatrix: new THREE.Matrix4().identity(),
299
+ centerSize: 1.11, largeWarpScale: 0.32, largeGrainStretch: 0.24, smallWarpStrength: 0.059,
300
+ smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1/34,
301
+ ringBias: 0.03, ringSizeVariance: 0.03, ringVarianceScale: 4.4, barkThickness: 0.3,
302
+ splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 910, cellSize: 0.1,
303
+ darkGrainColor: '#0c0504', lightGrainColor: '#926c50'
304
+ },
305
+ walnut: {
306
+ transformationMatrix: new THREE.Matrix4().identity(),
307
+ centerSize: 1.07, largeWarpScale: 0.42, largeGrainStretch: 0.34, smallWarpStrength: 0.016,
308
+ smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1/32,
309
+ ringBias: 0.08, ringSizeVariance: 0.03, ringVarianceScale: 5.5, barkThickness: 0.98,
310
+ splotchScale: 1.84, splotchIntensity: 0.97, cellScale: 710, cellSize: 0.31,
311
+ darkGrainColor: '#311e13', lightGrainColor: '#523424'
312
+ },
313
+ white_oak: {
314
+ transformationMatrix: new THREE.Matrix4().identity(),
315
+ centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.21, smallWarpStrength: 0.034,
316
+ smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1/34,
317
+ ringBias: 0.82, ringSizeVariance: 0.16, ringVarianceScale: 1.4, barkThickness: 0.7,
318
+ splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 800, cellSize: 0.28,
319
+ darkGrainColor: '#8b4c21', lightGrainColor: '#c57e43'
320
+ },
321
+ pine: {
322
+ transformationMatrix: new THREE.Matrix4().identity(),
323
+ centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.18, smallWarpStrength: 0.041,
324
+ smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1/24,
325
+ ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 5, barkThickness: 0.35,
326
+ splotchScale: 0.51, splotchIntensity: 3.32, cellScale: 1480, cellSize: 0.07,
327
+ darkGrainColor: '#c58355', lightGrainColor: '#d19d61'
328
+ },
329
+ poplar: {
330
+ transformationMatrix: new THREE.Matrix4().identity(),
331
+ centerSize: 1.43, largeWarpScale: 0.33, largeGrainStretch: 0.18, smallWarpStrength: 0.04,
332
+ smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1/37,
333
+ ringBias: 0.07, ringSizeVariance: 0.03, ringVarianceScale: 3.8, barkThickness: 0.3,
334
+ splotchScale: 1.92, splotchIntensity: 0.71, cellScale: 830, cellSize: 0.04,
335
+ darkGrainColor: '#716347', lightGrainColor: '#998966'
336
+ },
337
+ maple: {
338
+ transformationMatrix: new THREE.Matrix4().identity(),
339
+ centerSize: 1.4, largeWarpScale: 0.38, largeGrainStretch: 0.25, smallWarpStrength: 0.067,
340
+ smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1/35,
341
+ ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 4.6, barkThickness: 0.61,
342
+ splotchScale: 0.46, splotchIntensity: 1.49, cellScale: 800, cellSize: 0.03,
343
+ darkGrainColor: '#b08969', lightGrainColor: '#bc9d7d'
344
+ },
345
+ red_oak: {
346
+ transformationMatrix: new THREE.Matrix4().identity(),
347
+ centerSize: 1.21, largeWarpScale: 0.24, largeGrainStretch: 0.25, smallWarpStrength: 0.044,
348
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1/34,
349
+ ringBias: 0.92, ringSizeVariance: 0.03, ringVarianceScale: 5.6, barkThickness: 1.01,
350
+ splotchScale: 0.28, splotchIntensity: 3.48, cellScale: 800, cellSize: 0.25,
351
+ darkGrainColor: '#af613b', lightGrainColor: '#e0a27a'
352
+ },
353
+ cherry: {
354
+ transformationMatrix: new THREE.Matrix4().identity(),
355
+ centerSize: 1.33, largeWarpScale: 0.11, largeGrainStretch: 0.33, smallWarpStrength: 0.024,
356
+ smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/36,
357
+ ringBias: 0.02, ringSizeVariance: 0.04, ringVarianceScale: 6.5, barkThickness: 0.09,
358
+ splotchScale: 1.27, splotchIntensity: 1.24, cellScale: 1530, cellSize: 0.15,
359
+ darkGrainColor: '#913f27', lightGrainColor: '#b45837'
360
+ },
361
+ cedar: {
362
+ transformationMatrix: new THREE.Matrix4().identity(),
363
+ centerSize: 1.11, largeWarpScale: 0.39, largeGrainStretch: 0.12, smallWarpStrength: 0.061,
364
+ smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1/25,
365
+ ringBias: 0.01, ringSizeVariance: 0.07, ringVarianceScale: 6.7, barkThickness: 0.1,
366
+ splotchScale: 0.61, splotchIntensity: 2.54, cellScale: 630, cellSize: 0.19,
367
+ darkGrainColor: '#9a5b49', lightGrainColor: '#ae745e'
368
+ },
369
+ mahogany: {
370
+ transformationMatrix: new THREE.Matrix4().identity(),
371
+ centerSize: 1.25, largeWarpScale: 0.26, largeGrainStretch: 0.29, smallWarpStrength: 0.044,
372
+ smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/38,
373
+ ringBias: 0.01, ringSizeVariance: 0.33, ringVarianceScale: 1.2, barkThickness: 0.07,
374
+ splotchScale: 0.77, splotchIntensity: 1.39, cellScale: 1400, cellSize: 0.23,
375
+ darkGrainColor: '#501d12', lightGrainColor: '#6d3722'
376
+ }
377
+ };
378
+
379
+ export const WoodGenuses = [ 'teak', 'walnut', 'white_oak', 'pine', 'poplar', 'maple', 'red_oak', 'cherry', 'cedar', 'mahogany' ];
380
+ export const Finishes = [ 'raw', 'matte', 'semigloss', 'gloss' ];
381
+
382
+ export function GetWoodPreset( genus, finish ) {
383
+
384
+ const params = woodParams[ genus ];
385
+
386
+ let clearcoat, clearcoatRoughness, clearcoatDarken;
387
+
388
+ switch ( finish ) {
389
+
390
+ case 'gloss':
391
+ clearcoatDarken = 0.2; clearcoatRoughness = 0.1; clearcoat = 1;
392
+ break;
393
+
394
+ case 'semigloss':
395
+ clearcoatDarken = 0.4; clearcoatRoughness = 0.4; clearcoat = 1;
396
+ break;
397
+
398
+ case 'matte':
399
+ clearcoatDarken = 0.6; clearcoatRoughness = 1; clearcoat = 1;
400
+ break;
401
+
402
+ case 'raw':
403
+ default:
404
+ clearcoatDarken = 1; clearcoatRoughness = 0; clearcoat = 0;
405
+
406
+ }
407
+
408
+ return { ...params, transformationMatrix: new THREE.Matrix4().copy( params.transformationMatrix ), genus, finish, clearcoat, clearcoatRoughness, clearcoatDarken };
409
+
410
+ }
411
+
412
+ const params = GetWoodPreset( WoodGenuses[ 0 ], Finishes[ 0 ] );
413
+ const uniforms = {};
414
+
415
+ uniforms.centerSize = TSL.uniform( params.centerSize ).onObjectUpdate( ( { material } ) => material.centerSize );
416
+ uniforms.largeWarpScale = TSL.uniform( params.largeWarpScale ).onObjectUpdate( ( { material } ) => material.largeWarpScale );
417
+ uniforms.largeGrainStretch = TSL.uniform( params.largeGrainStretch ).onObjectUpdate( ( { material } ) => material.largeGrainStretch );
418
+ uniforms.smallWarpStrength = TSL.uniform( params.smallWarpStrength ).onObjectUpdate( ( { material } ) => material.smallWarpStrength );
419
+ uniforms.smallWarpScale = TSL.uniform( params.smallWarpScale ).onObjectUpdate( ( { material } ) => material.smallWarpScale );
420
+ uniforms.fineWarpStrength = TSL.uniform( params.fineWarpStrength ).onObjectUpdate( ( { material } ) => material.fineWarpStrength );
421
+ uniforms.fineWarpScale = TSL.uniform( params.fineWarpScale ).onObjectUpdate( ( { material } ) => material.fineWarpScale );
422
+ uniforms.ringThickness = TSL.uniform( params.ringThickness ).onObjectUpdate( ( { material } ) => material.ringThickness );
423
+ uniforms.ringBias = TSL.uniform( params.ringBias ).onObjectUpdate( ( { material } ) => material.ringBias );
424
+ uniforms.ringSizeVariance = TSL.uniform( params.ringSizeVariance ).onObjectUpdate( ( { material } ) => material.ringSizeVariance );
425
+ uniforms.ringVarianceScale = TSL.uniform( params.ringVarianceScale ).onObjectUpdate( ( { material } ) => material.ringVarianceScale );
426
+ uniforms.barkThickness = TSL.uniform( params.barkThickness ).onObjectUpdate( ( { material } ) => material.barkThickness );
427
+ uniforms.splotchScale = TSL.uniform( params.splotchScale ).onObjectUpdate( ( { material } ) => material.splotchScale );
428
+ uniforms.splotchIntensity = TSL.uniform( params.splotchIntensity ).onObjectUpdate( ( { material } ) => material.splotchIntensity );
429
+ uniforms.cellScale = TSL.uniform( params.cellScale ).onObjectUpdate( ( { material } ) => material.cellScale );
430
+ uniforms.cellSize = TSL.uniform( params.cellSize ).onObjectUpdate( ( { material } ) => material.cellSize );
431
+ uniforms.darkGrainColor = TSL.uniform( new THREE.Color( params.darkGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.darkGrainColor ) );
432
+ uniforms.lightGrainColor = TSL.uniform( new THREE.Color( params.lightGrainColor ) ).onObjectUpdate( ( { material }, self ) => self.value.set( material.lightGrainColor ) );
433
+ uniforms.transformationMatrix = TSL.uniform( new THREE.Matrix4().copy( params.transformationMatrix ) ).onObjectUpdate( ( { material } ) => material.transformationMatrix );
434
+
435
+ const colorNode = wood(
436
+ uniforms.transformationMatrix.mul( TSL.vec4(TSL.positionLocal, 1) ).xyz,
437
+ uniforms.centerSize,
438
+ uniforms.largeWarpScale,
439
+ uniforms.largeGrainStretch,
440
+ uniforms.smallWarpStrength,
441
+ uniforms.smallWarpScale,
442
+ uniforms.fineWarpStrength,
443
+ uniforms.fineWarpScale,
444
+ uniforms.ringThickness,
445
+ uniforms.ringBias,
446
+ uniforms.ringSizeVariance,
447
+ uniforms.ringVarianceScale,
448
+ uniforms.barkThickness,
449
+ uniforms.splotchScale,
450
+ uniforms.splotchIntensity,
451
+ uniforms.cellScale,
452
+ uniforms.cellSize,
453
+ uniforms.darkGrainColor,
454
+ uniforms.lightGrainColor
455
+ ).mul( params.clearcoatDarken );
456
+
457
+ /**
458
+ * Procedural wood material using TSL (Three.js Shading Language).
459
+ *
460
+ * Usage examples:
461
+ *
462
+ * // Using presets (recommended for common wood types)
463
+ * const material = WoodNodeMaterial.fromPreset('walnut', 'gloss');
464
+ *
465
+ * // Using custom parameters (for advanced customization)
466
+ * const material = new WoodNodeMaterial({
467
+ * centerSize: 1.2,
468
+ * ringThickness: 1/40,
469
+ * darkGrainColor: new THREE.Color('#2a1a0a'),
470
+ * lightGrainColor: new THREE.Color('#8b4513'),
471
+ * clearcoat: 1,
472
+ * clearcoatRoughness: 0.3
473
+ * });
474
+ *
475
+ * // Mixing presets with custom overrides
476
+ * const walnutParams = GetWoodPreset('walnut', 'raw');
477
+ * const material = new WoodNodeMaterial({
478
+ * ...walnutParams,
479
+ * ringThickness: 1/50, // Override specific parameter
480
+ * clearcoat: 1 // Add finish
481
+ * });
482
+ */
483
+ export class WoodNodeMaterial extends THREE.MeshPhysicalMaterial {
484
+
485
+ static get type() {
486
+
487
+ return 'WoodNodeMaterial';
488
+
489
+ }
490
+
491
+ constructor( params = {} ) {
492
+
493
+ super();
494
+
495
+ this.isWoodNodeMaterial = true;
496
+
497
+ // Get default parameters from teak/raw preset
498
+ const defaultParams = GetWoodPreset( 'teak', 'raw' );
499
+
500
+ // Merge default params with provided params
501
+ const finalParams = { ...defaultParams, ...params };
502
+
503
+ for ( const key in finalParams ) {
504
+
505
+ if ( key === 'genus' || key === 'finish' ) continue;
506
+
507
+ if ( typeof finalParams[ key ] === 'string' ) {
508
+
509
+ this[ key ] = new THREE.Color( finalParams[ key ] );
510
+
511
+ } else {
512
+
513
+ this[ key ] = finalParams[ key ];
514
+
515
+ }
516
+
517
+ }
518
+
519
+ this.colorNode = colorNode;
520
+ this.clearcoatNode = finalParams.clearcoat;
521
+ this.clearcoatRoughness = finalParams.clearcoatRoughness;
522
+
523
+ }
524
+
525
+ // Static method to create material from preset
526
+ static fromPreset( genus = 'teak', finish = 'raw' ) {
527
+
528
+ const params = GetWoodPreset( genus, finish );
529
+ return new WoodNodeMaterial( params );
530
+
531
+ }
532
+
533
+ }
@@ -1,4 +1,4 @@
1
- import { LinearTransfer, Matrix3, SRGBTransfer } from 'three';
1
+ import { LinearTransfer, Matrix3, SRGBTransfer, SRGBColorSpace, ColorManagement } from 'three';
2
2
 
3
3
  /** @module ColorSpaces */
4
4
 
@@ -114,6 +114,24 @@ export const LinearRec2020ColorSpaceImpl = {
114
114
  luminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,
115
115
  };
116
116
 
117
+ /**
118
+ * Extended-sRGB color space.
119
+ *
120
+ * @type {string}
121
+ * @constant
122
+ */
123
+ export const ExtendedSRGBColorSpace = 'extended-srgb';
124
+
125
+ /**
126
+ * Implementation object for the Extended-sRGB color space.
127
+ *
128
+ * @type {module:ColorSpaces~ColorSpaceImpl}
129
+ * @constant
130
+ */
131
+ export const ExtendedSRGBColorSpaceImpl = {
132
+ ...ColorManagement.spaces[ SRGBColorSpace ],
133
+ outputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace, toneMappingMode: 'extended' }
134
+ };
117
135
 
118
136
  /**
119
137
  * An object holding the color space implementation.
@@ -18,7 +18,7 @@ const _triangle = new Triangle();
18
18
  * Can be used to compute the convex hull in 3D space for a given set of points. It
19
19
  * is primarily intended for {@link ConvexGeometry}.
20
20
  *
21
- * This Quickhull 3D implementation is a port of [quickhull3d]{@link https://github.com/maurizzzio/quickhull3d/}
21
+ * This Quickhull 3D implementation is a port of [quickhull3d](https://github.com/maurizzzio/quickhull3d/)
22
22
  * by Mauricio Poppe.
23
23
  *
24
24
  * @three_import import { ConvexHull } from 'three/addons/math/ConvexHull.js';
@@ -152,7 +152,7 @@ class ConvexHull {
152
152
  *
153
153
  * @param {Ray} ray - The ray to test.
154
154
  * @param {Vector3} target - The target vector that is used to store the method's result.
155
- * @return {Vector3|null} The intersection point. Returns `null` if not intersection was detected.
155
+ * @return {?Vector3} The intersection point. Returns `null` if not intersection was detected.
156
156
  */
157
157
  intersectRay( ray, target ) {
158
158
 
@@ -1298,7 +1298,7 @@ class HalfEdge {
1298
1298
  * Returns the origin vertex.
1299
1299
  *
1300
1300
  * @private
1301
- * @return {VertexNode} The destination vertex.
1301
+ * @return {?VertexNode} The destination vertex.
1302
1302
  */
1303
1303
  tail() {
1304
1304
 
@@ -36,7 +36,7 @@ function grad( hash, x, y, z ) {
36
36
  /**
37
37
  * A utility class providing a 3D noise function.
38
38
  *
39
- * The code is based on [IMPROVED NOISE]{@link https://cs.nyu.edu/~perlin/noise/}
39
+ * The code is based on [IMPROVED NOISE](https://cs.nyu.edu/~perlin/noise/)
40
40
  * by Ken Perlin, 2002.
41
41
  *
42
42
  * @three_import import { ImprovedNoise } from 'three/addons/math/ImprovedNoise.js';
@@ -45,7 +45,7 @@ class Lut {
45
45
  /**
46
46
  * The currently selected color map.
47
47
  *
48
- * @type {Array}
48
+ * @type {Array<Array<number>>}
49
49
  */
50
50
  this.map = [];
51
51
 
@@ -219,7 +219,7 @@ class Lut {
219
219
  * Adds a color map to this Lut instance.
220
220
  *
221
221
  * @param {string} name - The name of the color map.
222
- * @param {Array} arrayOfColors - An array of color values. Each value is an array
222
+ * @param {Array<Array<number>>} arrayOfColors - An array of color values. Each value is an array
223
223
  * holding a threshold and the actual color value as a hexadecimal number.
224
224
  * @return {Lut} A reference to this LUT.
225
225
  */
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * A utility class providing noise functions.
3
3
  *
4
- * The code is based on [Simplex noise demystified]{@link https://web.archive.org/web/20210210162332/http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf}
4
+ * The code is based on [Simplex noise demystified](https://web.archive.org/web/20210210162332/http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf)
5
5
  * by Stefan Gustavson, 2005.
6
6
  *
7
7
  * @three_import import { SimplexNoise } from 'three/addons/math/SimplexNoise.js';
@@ -121,7 +121,7 @@ class MD2CharacterComplex {
121
121
  /**
122
122
  * The movement controls.
123
123
  *
124
- * @type {Object}
124
+ * @type {?Object}
125
125
  * @default null
126
126
  */
127
127
  this.controls = null;
@@ -2,7 +2,7 @@ import { DoubleSide, FloatType, HalfFloatType, Mesh, MeshBasicMaterial, MeshPhon
2
2
  import { potpack } from '../libs/potpack.module.js';
3
3
 
4
4
  /**
5
- * Progressive Light Map Accumulator, by [zalo]{@link https://github.com/zalo/}.
5
+ * Progressive Light Map Accumulator, by [zalo](https://github.com/zalo/).
6
6
  *
7
7
  * To use, simply construct a `ProgressiveLightMap` object,
8
8
  * `plmap.addObjectsToLightMap(object)` an array of semi-static
@@ -123,6 +123,12 @@ class ProgressiveLightMap {
123
123
 
124
124
  }
125
125
 
126
+ if ( object.geometry.hasAttribute( 'normal' ) === false ) {
127
+
128
+ console.warn( 'THREE.ProgressiveLightMap: All lightmap objects need normals.' ); continue;
129
+
130
+ }
131
+
126
132
  if ( this.blurringPlane === null ) {
127
133
 
128
134
  this._initializeBlurPlane( this.res, this.progressiveLightMap1 );
@@ -280,9 +286,9 @@ class ProgressiveLightMap {
280
286
  *
281
287
  * @private
282
288
  * @param {number} res - The square resolution of this object's lightMap.
283
- * @param {WebGLRenderTarget} [lightMap] - The lightmap to initialize the plane with.
289
+ * @param {WebGLRenderTarget} lightMap - The lightmap to initialize the plane with.
284
290
  */
285
- _initializeBlurPlane( res, lightMap = null ) {
291
+ _initializeBlurPlane( res, lightMap ) {
286
292
 
287
293
  const blurMaterial = new MeshBasicMaterial();
288
294
  blurMaterial.uniforms = { previousShadowMap: { value: null },
@@ -4,7 +4,7 @@ import { add, float, mix, output, sub, texture, uniform, uv, vec2, vec4 } from '
4
4
  import { potpack } from '../libs/potpack.module.js';
5
5
 
6
6
  /**
7
- * Progressive Light Map Accumulator, by [zalo]{@link https://github.com/zalo/}.
7
+ * Progressive Light Map Accumulator, by [zalo](https://github.com/zalo/).
8
8
  *
9
9
  * To use, simply construct a `ProgressiveLightMap` object,
10
10
  * `plmap.addObjectsToLightMap(object)` an array of semi-static
@@ -101,6 +101,12 @@ class ProgressiveLightMap {
101
101
 
102
102
  }
103
103
 
104
+ if ( object.geometry.hasAttribute( 'normal' ) === false ) {
105
+
106
+ console.warn( 'THREE.ProgressiveLightMap: All lightmap objects need normals.' ); continue;
107
+
108
+ }
109
+
104
110
  if ( this._blurringPlane === null ) {
105
111
 
106
112
  this._initializeBlurPlane();