@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
@@ -1,9 +1,17 @@
1
- import { TempNode, NodeUpdateType } from 'three/webgpu';
2
- import { convertToTexture, nodeObject, Fn, uv, uniform, vec2, vec4, clamp } from 'three/tsl';
1
+ import { TempNode, NodeMaterial, NodeUpdateType, RenderTarget, Vector2, HalfFloatType, RedFormat, QuadMesh, RendererUtils } from 'three/webgpu';
2
+ import { convertToTexture, nodeObject, Fn, uniform, smoothstep, step, texture, max, uniformArray, outputStruct, property, vec4, vec3, uv, Loop, min, mix } from 'three/tsl';
3
+ import { gaussianBlur } from './GaussianBlurNode.js';
4
+
5
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
6
+ let _rendererState;
3
7
 
4
8
  /**
5
9
  * Post processing node for creating depth of field (DOF) effect.
6
10
  *
11
+ * References:
12
+ * - {@link https://pixelmischiefblog.wordpress.com/2016/11/25/bokeh-depth-of-field/}
13
+ * - {@link https://www.adriancourreges.com/blog/2016/09/09/doom-2016-graphics-study/}
14
+ *
7
15
  * @augments TempNode
8
16
  * @three_import import { dof } from 'three/addons/tsl/display/DepthOfFieldNode.js';
9
17
  */
@@ -20,11 +28,11 @@ class DepthOfFieldNode extends TempNode {
20
28
  *
21
29
  * @param {TextureNode} textureNode - The texture node that represents the input of the effect.
22
30
  * @param {Node<float>} viewZNode - Represents the viewZ depth values of the scene.
23
- * @param {Node<float>} focusNode - Defines the effect's focus which is the distance along the camera's look direction in world units.
24
- * @param {Node<float>} apertureNode - Defines the effect's aperture.
25
- * @param {Node<float>} maxblurNode - Defines the effect's maximum blur.
31
+ * @param {Node<float>} focusDistanceNode - Defines the effect's focus which is the distance along the camera's look direction in world units.
32
+ * @param {Node<float>} focalLengthNode - How far an object can be from the focal plane before it goes completely out-of-focus in world units.
33
+ * @param {Node<float>} bokehScaleNode - A unitless value for artistic purposes to adjust the size of the bokeh.
26
34
  */
27
- constructor( textureNode, viewZNode, focusNode, apertureNode, maxblurNode ) {
35
+ constructor( textureNode, viewZNode, focusDistanceNode, focalLengthNode, bokehScaleNode ) {
28
36
 
29
37
  super( 'vec4' );
30
38
 
@@ -47,29 +55,164 @@ class DepthOfFieldNode extends TempNode {
47
55
  *
48
56
  * @type {Node<float>}
49
57
  */
50
- this.focusNode = focusNode;
58
+ this.focusDistanceNode = focusDistanceNode;
51
59
 
52
60
  /**
53
- * Defines the effect's aperture.
61
+ * How far an object can be from the focal plane before it goes completely out-of-focus in world units.
54
62
  *
55
63
  * @type {Node<float>}
56
64
  */
57
- this.apertureNode = apertureNode;
65
+ this.focalLengthNode = focalLengthNode;
58
66
 
59
67
  /**
60
- * Defines the effect's maximum blur.
68
+ * A unitless value for artistic purposes to adjust the size of the bokeh.
61
69
  *
62
70
  * @type {Node<float>}
63
71
  */
64
- this.maxblurNode = maxblurNode;
72
+ this.bokehScaleNode = bokehScaleNode;
73
+
74
+ /**
75
+ * The inverse size of the resolution.
76
+ *
77
+ * @private
78
+ * @type {UniformNode<vec2>}
79
+ */
80
+ this._invSize = uniform( new Vector2() );
81
+
82
+ /**
83
+ * The render target used for the near and far field.
84
+ *
85
+ * @private
86
+ * @type {RenderTarget}
87
+ */
88
+ this._CoCRT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, format: RedFormat, count: 2 } );
89
+ this._CoCRT.textures[ 0 ].name = 'DepthOfField.NearField';
90
+ this._CoCRT.textures[ 1 ].name = 'DepthOfField.FarField';
91
+
92
+ /**
93
+ * The render target used for blurring the near field.
94
+ *
95
+ * @private
96
+ * @type {RenderTarget}
97
+ */
98
+ this._CoCBlurredRT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, format: RedFormat } );
99
+ this._CoCBlurredRT.texture.name = 'DepthOfField.NearFieldBlurred';
100
+
101
+ /**
102
+ * The render target used for the first blur pass.
103
+ *
104
+ * @private
105
+ * @type {RenderTarget}
106
+ */
107
+ this._blur64RT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
108
+ this._blur64RT.texture.name = 'DepthOfField.Blur64';
109
+
110
+ /**
111
+ * The render target used for the near field's second blur pass.
112
+ *
113
+ * @private
114
+ * @type {RenderTarget}
115
+ */
116
+ this._blur16NearRT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
117
+ this._blur16NearRT.texture.name = 'DepthOfField.Blur16Near';
118
+
119
+ /**
120
+ * The render target used for the far field's second blur pass.
121
+ *
122
+ * @private
123
+ * @type {RenderTarget}
124
+ */
125
+ this._blur16FarRT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
126
+ this._blur16FarRT.texture.name = 'DepthOfField.Blur16Far';
127
+
128
+ /**
129
+ * The render target used for the composite
130
+ *
131
+ * @private
132
+ * @type {RenderTarget}
133
+ */
134
+ this._compositeRT = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
135
+ this._compositeRT.texture.name = 'DepthOfField.Composite';
136
+
137
+ /**
138
+ * The material used for the CoC/near and far fields.
139
+ *
140
+ * @private
141
+ * @type {NodeMaterial}
142
+ */
143
+ this._CoCMaterial = new NodeMaterial();
144
+
145
+ /**
146
+ * The material used for blurring the near field.
147
+ *
148
+ * @private
149
+ * @type {NodeMaterial}
150
+ */
151
+ this._CoCBlurredMaterial = new NodeMaterial();
152
+
153
+ /**
154
+ * The material used for the 64 tap blur.
155
+ *
156
+ * @private
157
+ * @type {NodeMaterial}
158
+ */
159
+ this._blur64Material = new NodeMaterial();
160
+
161
+ /**
162
+ * The material used for the 16 tap blur.
163
+ *
164
+ * @private
165
+ * @type {NodeMaterial}
166
+ */
167
+ this._blur16Material = new NodeMaterial();
168
+
169
+ /**
170
+ * The material used for the final composite.
171
+ *
172
+ * @private
173
+ * @type {NodeMaterial}
174
+ */
175
+ this._compositeMaterial = new NodeMaterial();
176
+
177
+ /**
178
+ * The result of the effect is represented as a separate texture node.
179
+ *
180
+ * @private
181
+ * @type {TextureNode}
182
+ */
183
+ this._textureNode = texture( this._compositeRT.texture );
184
+
185
+ /**
186
+ * The result of the CoC pass as a texture node.
187
+ *
188
+ * @private
189
+ * @type {TextureNode}
190
+ */
191
+ this._CoCTextureNode = texture( this._CoCRT.texture );
192
+
193
+ /**
194
+ * The result of the blur64 pass as a texture node.
195
+ *
196
+ * @private
197
+ * @type {TextureNode}
198
+ */
199
+ this._blur64TextureNode = texture( this._blur64RT.texture );
65
200
 
66
201
  /**
67
- * Represents the input's aspect ratio.
202
+ * The result of the near field's blur16 pass as a texture node.
68
203
  *
69
204
  * @private
70
- * @type {UniformNode<float>}
205
+ * @type {TextureNode}
71
206
  */
72
- this._aspect = uniform( 0 );
207
+ this._blur16NearTextureNode = texture( this._blur16NearRT.texture );
208
+
209
+ /**
210
+ * The result of the far field's blur16 pass as a texture node.
211
+ *
212
+ * @private
213
+ * @type {TextureNode}
214
+ */
215
+ this._blur16FarTextureNode = texture( this._blur16FarRT.texture );
73
216
 
74
217
  /**
75
218
  * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node updates
@@ -82,16 +225,121 @@ class DepthOfFieldNode extends TempNode {
82
225
 
83
226
  }
84
227
 
228
+ /**
229
+ * Sets the size of the effect.
230
+ *
231
+ * @param {number} width - The width of the effect.
232
+ * @param {number} height - The height of the effect.
233
+ */
234
+ setSize( width, height ) {
235
+
236
+ this._invSize.value.set( 1 / width, 1 / height );
237
+
238
+ this._CoCRT.setSize( width, height );
239
+ this._compositeRT.setSize( width, height );
240
+
241
+ // blur runs in half resolution
242
+
243
+ const halfResX = Math.round( width / 2 );
244
+ const halfResY = Math.round( height / 2 );
245
+
246
+ this._CoCBlurredRT.setSize( halfResX, halfResY );
247
+ this._blur64RT.setSize( halfResX, halfResY );
248
+ this._blur16NearRT.setSize( halfResX, halfResY );
249
+ this._blur16FarRT.setSize( halfResX, halfResY );
250
+
251
+ }
252
+
253
+ /**
254
+ * Returns the result of the effect as a texture node.
255
+ *
256
+ * @return {PassTextureNode} A texture node that represents the result of the effect.
257
+ */
258
+ getTextureNode() {
259
+
260
+ return this._textureNode;
261
+
262
+ }
263
+
85
264
  /**
86
265
  * This method is used to update the effect's uniforms once per frame.
87
266
  *
88
267
  * @param {NodeFrame} frame - The current node frame.
89
268
  */
90
- updateBefore() {
269
+ updateBefore( frame ) {
270
+
271
+ const { renderer } = frame;
272
+
273
+ // resize
91
274
 
92
275
  const map = this.textureNode.value;
276
+ this.setSize( map.image.width, map.image.height );
277
+
278
+ // save state
279
+
280
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
281
+
282
+ renderer.setClearColor( 0x000000, 0 );
283
+
284
+ // coc
285
+
286
+ _quadMesh.material = this._CoCMaterial;
287
+ renderer.setRenderTarget( this._CoCRT );
288
+ _quadMesh.name = 'DoF [ CoC ]';
289
+ _quadMesh.render( renderer );
290
+
291
+ // blur near field to avoid visible aliased edges when the near field
292
+ // is blended with the background
293
+
294
+ this._CoCTextureNode.value = this._CoCRT.textures[ 0 ];
295
+
296
+ _quadMesh.material = this._CoCBlurredMaterial;
297
+ renderer.setRenderTarget( this._CoCBlurredRT );
298
+ _quadMesh.name = 'DoF [ CoC Blur ]';
299
+ _quadMesh.render( renderer );
300
+
301
+ // blur64 near
302
+
303
+ this._CoCTextureNode.value = this._CoCBlurredRT.texture;
304
+
305
+ _quadMesh.material = this._blur64Material;
306
+ renderer.setRenderTarget( this._blur64RT );
307
+ _quadMesh.name = 'DoF [ Blur64 Near ]';
308
+ _quadMesh.render( renderer );
309
+
310
+ // blur16 near
311
+
312
+ _quadMesh.material = this._blur16Material;
313
+ renderer.setRenderTarget( this._blur16NearRT );
314
+ _quadMesh.name = 'DoF [ Blur16 Near ]';
315
+ _quadMesh.render( renderer );
316
+
317
+ // blur64 far
318
+
319
+ this._CoCTextureNode.value = this._CoCRT.textures[ 1 ];
320
+
321
+ _quadMesh.material = this._blur64Material;
322
+ renderer.setRenderTarget( this._blur64RT );
323
+ _quadMesh.name = 'DoF [ Blur64 Far ]';
324
+ _quadMesh.render( renderer );
325
+
326
+ // blur16 far
327
+
328
+ _quadMesh.material = this._blur16Material;
329
+ renderer.setRenderTarget( this._blur16FarRT );
330
+ _quadMesh.name = 'DoF [ Blur16 Far ]';
331
+ _quadMesh.render( renderer );
93
332
 
94
- this._aspect.value = map.image.width / map.image.height;
333
+ // composite
334
+
335
+ _quadMesh.material = this._compositeMaterial;
336
+ renderer.setRenderTarget( this._compositeRT );
337
+ _quadMesh.name = 'DoF [ Composite ]';
338
+ _quadMesh.render( renderer );
339
+
340
+ // restore
341
+
342
+ RendererUtils.restoreRendererState( renderer, _rendererState );
95
343
 
96
344
  }
97
345
 
@@ -101,81 +349,189 @@ class DepthOfFieldNode extends TempNode {
101
349
  * @param {NodeBuilder} builder - The current node builder.
102
350
  * @return {ShaderCallNodeInternal}
103
351
  */
104
- setup() {
105
-
106
- const textureNode = this.textureNode;
107
- const uvNode = textureNode.uvNode || uv();
108
-
109
- const sampleTexture = ( uv ) => textureNode.sample( uv );
110
-
111
- const dof = Fn( () => {
112
-
113
- const aspectcorrect = vec2( 1.0, this._aspect );
114
-
115
- const factor = this.focusNode.add( this.viewZNode );
116
-
117
- const dofblur = vec2( clamp( factor.mul( this.apertureNode ), this.maxblurNode.negate(), this.maxblurNode ) );
118
-
119
- const dofblur9 = dofblur.mul( 0.9 );
120
- const dofblur7 = dofblur.mul( 0.7 );
121
- const dofblur4 = dofblur.mul( 0.4 );
122
-
123
- let col = vec4( 0.0 );
124
-
125
- col = col.add( sampleTexture( uvNode ) );
126
-
127
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, 0.4 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
128
- col = col.add( sampleTexture( uvNode.add( vec2( 0.15, 0.37 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
129
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
130
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.37, 0.15 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
131
- col = col.add( sampleTexture( uvNode.add( vec2( 0.40, 0.0 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
132
- col = col.add( sampleTexture( uvNode.add( vec2( 0.37, - 0.15 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
133
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
134
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.15, - 0.37 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
135
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, - 0.4 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
136
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.15, 0.37 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
137
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
138
- col = col.add( sampleTexture( uvNode.add( vec2( 0.37, 0.15 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
139
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.4, 0.0 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
140
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.37, - 0.15 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
141
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
142
- col = col.add( sampleTexture( uvNode.add( vec2( 0.15, - 0.37 ).mul( aspectcorrect ).mul( dofblur ) ) ) );
143
- col = col.add( sampleTexture( uvNode.add( vec2( 0.15, 0.37 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
144
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.37, 0.15 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
145
- col = col.add( sampleTexture( uvNode.add( vec2( 0.37, - 0.15 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
146
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.15, - 0.37 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
147
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.15, 0.37 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
148
- col = col.add( sampleTexture( uvNode.add( vec2( 0.37, 0.15 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
149
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.37, - 0.15 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
150
- col = col.add( sampleTexture( uvNode.add( vec2( 0.15, - 0.37 ).mul( aspectcorrect ).mul( dofblur9 ) ) ) );
151
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
152
- col = col.add( sampleTexture( uvNode.add( vec2( 0.40, 0.0 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
153
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
154
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, - 0.4 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
155
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
156
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.4, 0.0 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
157
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
158
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, 0.4 ).mul( aspectcorrect ).mul( dofblur7 ) ) ) );
159
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
160
- col = col.add( sampleTexture( uvNode.add( vec2( 0.4, 0.0 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
161
- col = col.add( sampleTexture( uvNode.add( vec2( 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
162
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, - 0.4 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
163
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, 0.29 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
164
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.4, 0.0 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
165
- col = col.add( sampleTexture( uvNode.add( vec2( - 0.29, - 0.29 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
166
- col = col.add( sampleTexture( uvNode.add( vec2( 0.0, 0.4 ).mul( aspectcorrect ).mul( dofblur4 ) ) ) );
167
-
168
- col = col.div( 41 );
169
- col.a = 1;
170
-
171
- return vec4( col );
352
+ setup( builder ) {
353
+
354
+ const kernels = this._generateKernels();
355
+
356
+ // CoC, near and far fields
357
+
358
+ const nearField = property( 'float' );
359
+ const farField = property( 'float' );
360
+
361
+ const outputNode = outputStruct( nearField, farField );
172
362
 
363
+ const CoC = Fn( () => {
364
+
365
+ const signedDist = this.viewZNode.negate().sub( this.focusDistanceNode );
366
+ const CoC = smoothstep( 0, this.focalLengthNode, signedDist.abs() );
367
+
368
+ nearField.assign( step( signedDist, 0 ).mul( CoC ) );
369
+ farField.assign( step( 0, signedDist ).mul( CoC ) );
370
+
371
+ return vec4( 0 );
173
372
 
174
373
  } );
175
374
 
176
- const outputNode = dof();
375
+ this._CoCMaterial.colorNode = CoC().context( builder.getSharedContext() );
376
+ this._CoCMaterial.outputNode = outputNode;
377
+ this._CoCMaterial.needsUpdate = true;
378
+
379
+ // blurred CoC for near field
380
+
381
+ this._CoCBlurredMaterial.colorNode = gaussianBlur( this._CoCTextureNode, 1, 2 );
382
+ this._CoCBlurredMaterial.needsUpdate = true;
383
+
384
+ // bokeh 64 blur pass
385
+
386
+ const bokeh64 = uniformArray( kernels.points64 );
387
+
388
+ const blur64 = Fn( () => {
389
+
390
+ const acc = vec3();
391
+ const uvNode = uv();
392
+
393
+ const CoC = this._CoCTextureNode.sample( uvNode ).r;
394
+ const sampleStep = this._invSize.mul( this.bokehScaleNode ).mul( CoC );
395
+
396
+ Loop( 64, ( { i } ) => {
397
+
398
+ const sUV = uvNode.add( sampleStep.mul( bokeh64.element( i ) ) );
399
+ const tap = this.textureNode.sample( sUV );
400
+
401
+ acc.addAssign( tap.rgb );
402
+
403
+ } );
404
+
405
+ acc.divAssign( 64 );
406
+
407
+ return vec4( acc, CoC );
408
+
409
+ } );
410
+
411
+ this._blur64Material.fragmentNode = blur64().context( builder.getSharedContext() );
412
+ this._blur64Material.needsUpdate = true;
413
+
414
+ // bokeh 16 blur pass
415
+
416
+ const bokeh16 = uniformArray( kernels.points16 );
417
+
418
+ const blur16 = Fn( () => {
419
+
420
+ const uvNode = uv();
421
+
422
+ const col = this._blur64TextureNode.sample( uvNode ).toVar();
423
+ const maxVal = col.rgb;
424
+ const CoC = col.a;
425
+ const sampleStep = this._invSize.mul( this.bokehScaleNode ).mul( CoC );
426
+
427
+ Loop( 16, ( { i } ) => {
428
+
429
+ const sUV = uvNode.add( sampleStep.mul( bokeh16.element( i ) ) );
430
+ const tap = this._blur64TextureNode.sample( sUV );
431
+
432
+ maxVal.assign( max( tap.rgb, maxVal ) );
433
+
434
+ } );
435
+
436
+ return vec4( maxVal, CoC );
437
+
438
+ } );
439
+
440
+ this._blur16Material.fragmentNode = blur16().context( builder.getSharedContext() );
441
+ this._blur16Material.needsUpdate = true;
442
+
443
+ // composite
444
+
445
+ const composite = Fn( () => {
446
+
447
+ const uvNode = uv();
448
+
449
+ const near = this._blur16NearTextureNode.sample( uvNode );
450
+ const far = this._blur16FarTextureNode.sample( uvNode );
451
+ const beauty = this.textureNode.sample( uvNode );
452
+
453
+ // TODO: applying the bokeh scale to the near field CoC value introduces blending
454
+ // issues around edges of blurred foreground objects when their are rendered above
455
+ // the background. for now, don't apply the bokeh scale to the blend factors. that
456
+ // will cause less blur for objects which are partly out-of-focus (CoC between 0 and 1).
457
+
458
+ const blendNear = min( near.a, 0.5 ).mul( 2 );
459
+ const blendFar = min( far.a, 0.5 ).mul( 2 );
460
+
461
+ const result = vec4( 0, 0, 0, 1 ).toVar();
462
+ result.rgb = mix( beauty.rgb, far.rgb, blendFar );
463
+ result.rgb = mix( result.rgb, near.rgb, blendNear );
464
+
465
+ return result;
466
+
467
+ } );
468
+
469
+ this._compositeMaterial.fragmentNode = composite().context( builder.getSharedContext() );
470
+ this._compositeMaterial.needsUpdate = true;
471
+
472
+ return this._textureNode;
473
+
474
+ }
475
+
476
+ _generateKernels() {
477
+
478
+ // Vogel's method, see https://www.shadertoy.com/view/4fBXRG
479
+ // this approach allows to generate uniformly distributed sample
480
+ // points in a disc-shaped pattern. Blurring with these samples
481
+ // produces a typical optical lens blur
482
+
483
+ const GOLDEN_ANGLE = 2.39996323;
484
+ const SAMPLES = 80;
485
+
486
+ const points64 = [];
487
+ const points16 = [];
488
+
489
+ let idx64 = 0;
490
+ let idx16 = 0;
491
+
492
+ for ( let i = 0; i < SAMPLES; i ++ ) {
493
+
494
+ const theta = i * GOLDEN_ANGLE;
495
+ const r = Math.sqrt( i ) / Math.sqrt( SAMPLES );
496
+
497
+ const p = new Vector2( r * Math.cos( theta ), r * Math.sin( theta ) );
498
+
499
+ if ( i % 5 === 0 ) {
500
+
501
+ points16[ idx16 ] = p;
502
+ idx16 ++;
503
+
504
+ } else {
505
+
506
+ points64[ idx64 ] = p;
507
+ idx64 ++;
508
+
509
+ }
510
+
511
+ }
512
+
513
+ return { points16, points64 };
514
+
515
+ }
516
+
517
+ /**
518
+ * Frees internal resources. This method should be called
519
+ * when the effect is no longer required.
520
+ */
521
+ dispose() {
522
+
523
+ this._CoCRT.dispose();
524
+ this._CoCBlurredRT.dispose();
525
+ this._blur64RT.dispose();
526
+ this._blur16NearRT.dispose();
527
+ this._blur16FarRT.dispose();
528
+ this._compositeRT.dispose();
177
529
 
178
- return outputNode;
530
+ this._CoCMaterial.dispose();
531
+ this._CoCBlurredMaterial.dispose();
532
+ this._blur64Material.dispose();
533
+ this._blur16Material.dispose();
534
+ this._compositeMaterial.dispose();
179
535
 
180
536
  }
181
537
 
@@ -190,9 +546,9 @@ export default DepthOfFieldNode;
190
546
  * @function
191
547
  * @param {Node<vec4>} node - The node that represents the input of the effect.
192
548
  * @param {Node<float>} viewZNode - Represents the viewZ depth values of the scene.
193
- * @param {Node<float> | number} focus - Defines the effect's focus which is the distance along the camera's look direction in world units.
194
- * @param {Node<float> | number} aperture - Defines the effect's aperture.
195
- * @param {Node<float> | number} maxblur - Defines the effect's maximum blur.
549
+ * @param {Node<float> | number} focusDistance - Defines the effect's focus which is the distance along the camera's look direction in world units.
550
+ * @param {Node<float> | number} focalLength - How far an object can be from the focal plane before it goes completely out-of-focus in world units.
551
+ * @param {Node<float> | number} bokehScale - A unitless value for artistic purposes to adjust the size of the bokeh.
196
552
  * @returns {DepthOfFieldNode}
197
553
  */
198
- export const dof = ( node, viewZNode, focus = 1, aperture = 0.025, maxblur = 1 ) => nodeObject( new DepthOfFieldNode( convertToTexture( node ), nodeObject( viewZNode ), nodeObject( focus ), nodeObject( aperture ), nodeObject( maxblur ) ) );
554
+ export const dof = ( node, viewZNode, focusDistance = 1, focalLength = 1, bokehScale = 1 ) => nodeObject( new DepthOfFieldNode( convertToTexture( node ), nodeObject( viewZNode ), nodeObject( focusDistance ), nodeObject( focalLength ), nodeObject( bokehScale ) ) );