super-three 0.169.1 → 0.170.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 (255) hide show
  1. package/build/three.cjs +24628 -24228
  2. package/build/three.core.js +37002 -0
  3. package/build/three.core.min.js +6 -0
  4. package/build/three.module.js +10519 -47108
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +533 -0
  7. package/build/three.tsl.min.js +6 -0
  8. package/build/three.webgpu.js +17071 -53583
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +17134 -53623
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +3 -3
  13. package/examples/jsm/animation/MMDAnimationHelper.js +2 -0
  14. package/examples/jsm/animation/MMDPhysics.js +2 -0
  15. package/examples/jsm/capabilities/WebGPU.js +1 -10
  16. package/examples/jsm/controls/ArcballControls.js +25 -21
  17. package/examples/jsm/controls/OrbitControls.js +41 -9
  18. package/examples/jsm/controls/PointerLockControls.js +2 -5
  19. package/examples/jsm/controls/TransformControls.js +22 -6
  20. package/examples/jsm/csm/CSM.js +2 -2
  21. package/examples/jsm/csm/CSMFrustum.js +7 -4
  22. package/examples/jsm/csm/CSMHelper.js +2 -0
  23. package/examples/jsm/csm/CSMShadowNode.js +437 -0
  24. package/examples/jsm/curves/NURBSCurve.js +34 -3
  25. package/examples/jsm/exporters/GLTFExporter.js +138 -71
  26. package/examples/jsm/exporters/KTX2Exporter.js +35 -12
  27. package/examples/jsm/exporters/MMDExporter.js +6 -0
  28. package/examples/jsm/exporters/USDZExporter.js +21 -3
  29. package/examples/jsm/geometries/DecalGeometry.js +70 -21
  30. package/examples/jsm/geometries/InstancedPointsGeometry.js +2 -0
  31. package/examples/jsm/helpers/TextureHelperGPU.js +175 -0
  32. package/examples/jsm/interactive/HTMLMesh.js +1 -0
  33. package/examples/jsm/lighting/TiledLighting.js +18 -0
  34. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  35. package/examples/jsm/lines/LineGeometry.js +25 -0
  36. package/examples/jsm/lines/LineMaterial.js +0 -1
  37. package/examples/jsm/lines/LineSegmentsGeometry.js +2 -0
  38. package/examples/jsm/lines/webgpu/Line2.js +2 -1
  39. package/examples/jsm/lines/webgpu/LineSegments2.js +2 -16
  40. package/examples/jsm/lines/webgpu/Wireframe.js +57 -0
  41. package/examples/jsm/loaders/3DMLoader.js +1 -0
  42. package/examples/jsm/loaders/3MFLoader.js +91 -0
  43. package/examples/jsm/loaders/FBXLoader.js +12 -2
  44. package/examples/jsm/loaders/GLTFLoader.js +2 -0
  45. package/examples/jsm/loaders/KTX2Loader.js +143 -49
  46. package/examples/jsm/loaders/LDrawLoader.js +22 -136
  47. package/examples/jsm/loaders/LottieLoader.js +1 -0
  48. package/examples/jsm/loaders/MMDLoader.js +3 -0
  49. package/examples/jsm/loaders/MaterialXLoader.js +2 -2
  50. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +143 -0
  51. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +114 -0
  52. package/examples/jsm/math/ColorSpaces.js +76 -0
  53. package/examples/jsm/misc/ProgressiveLightMap.js +52 -40
  54. package/examples/jsm/misc/ProgressiveLightMapGPU.js +293 -0
  55. package/examples/jsm/misc/VolumeSlice.js +1 -0
  56. package/examples/jsm/objects/InstancedPoints.js +2 -4
  57. package/examples/jsm/objects/LensflareMesh.js +4 -2
  58. package/examples/jsm/objects/SkyMesh.js +5 -3
  59. package/examples/jsm/objects/Water2Mesh.js +7 -3
  60. package/examples/jsm/objects/WaterMesh.js +12 -10
  61. package/examples/jsm/postprocessing/AfterimagePass.js +14 -3
  62. package/examples/jsm/postprocessing/SSRPass.js +6 -0
  63. package/examples/jsm/renderers/CSS2DRenderer.js +6 -3
  64. package/examples/jsm/renderers/CSS3DRenderer.js +7 -4
  65. package/examples/jsm/shaders/FXAAShader.js +225 -224
  66. package/examples/jsm/transpiler/AST.js +2 -2
  67. package/examples/jsm/transpiler/GLSLDecoder.js +57 -25
  68. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  69. package/examples/jsm/transpiler/TSLEncoder.js +11 -6
  70. package/{src/nodes → examples/jsm/tsl}/display/AfterImageNode.js +18 -21
  71. package/{src/nodes → examples/jsm/tsl}/display/AnaglyphPassNode.js +2 -6
  72. package/{src/nodes → examples/jsm/tsl}/display/AnamorphicNode.js +12 -18
  73. package/{src/nodes → examples/jsm/tsl}/display/BleachBypass.js +1 -3
  74. package/{src/nodes → examples/jsm/tsl}/display/BloomNode.js +12 -41
  75. package/{src/nodes → examples/jsm/tsl}/display/DenoiseNode.js +60 -47
  76. package/{src/nodes → examples/jsm/tsl}/display/DepthOfFieldNode.js +4 -9
  77. package/{src/nodes → examples/jsm/tsl}/display/DotScreenNode.js +2 -9
  78. package/examples/jsm/tsl/display/FXAANode.js +316 -0
  79. package/{src/nodes → examples/jsm/tsl}/display/FilmNode.js +4 -7
  80. package/{src/nodes → examples/jsm/tsl}/display/GTAONode.js +73 -78
  81. package/{src/nodes → examples/jsm/tsl}/display/GaussianBlurNode.js +78 -42
  82. package/examples/jsm/tsl/display/LensflareNode.js +161 -0
  83. package/{src/nodes → examples/jsm/tsl}/display/Lut3DNode.js +3 -5
  84. package/{src/nodes → examples/jsm/tsl}/display/MotionBlur.js +2 -3
  85. package/examples/jsm/tsl/display/OutlineNode.js +434 -0
  86. package/{src/nodes → examples/jsm/tsl}/display/ParallaxBarrierPassNode.js +2 -5
  87. package/{src/nodes → examples/jsm/tsl}/display/PixelationPassNode.js +5 -17
  88. package/{src/nodes → examples/jsm/tsl}/display/RGBShiftNode.js +2 -6
  89. package/examples/jsm/tsl/display/SMAANode.js +620 -0
  90. package/{src/nodes → examples/jsm/tsl}/display/SSAAPassNode.js +10 -25
  91. package/examples/jsm/tsl/display/SSRNode.js +366 -0
  92. package/{src/nodes → examples/jsm/tsl}/display/Sepia.js +1 -2
  93. package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +4 -12
  94. package/{src/nodes → examples/jsm/tsl}/display/StereoCompositePassNode.js +9 -11
  95. package/{src/nodes → examples/jsm/tsl}/display/StereoPassNode.js +10 -11
  96. package/examples/jsm/tsl/display/TRAAPassNode.js +355 -0
  97. package/{src/nodes → examples/jsm/tsl}/display/TransitionNode.js +3 -7
  98. package/examples/jsm/tsl/display/hashBlur.js +24 -0
  99. package/examples/jsm/tsl/lighting/TiledLightsNode.js +389 -0
  100. package/examples/jsm/utils/SceneOptimizer.js +410 -0
  101. package/examples/jsm/utils/UVsDebug.js +1 -1
  102. package/examples/jsm/utils/{TextureUtilsGPU.js → WebGPUTextureUtils.js} +2 -1
  103. package/examples/jsm/webxr/OculusHandPointerModel.js +21 -21
  104. package/examples/jsm/webxr/Text2D.js +6 -6
  105. package/package.json +4 -4
  106. package/src/Three.Core.js +178 -0
  107. package/src/Three.TSL.js +526 -0
  108. package/src/Three.WebGPU.Nodes.js +9 -186
  109. package/src/Three.WebGPU.js +8 -186
  110. package/src/Three.js +1 -177
  111. package/src/animation/AnimationClip.js +2 -2
  112. package/src/animation/AnimationObjectGroup.js +2 -2
  113. package/src/audio/Audio.js +38 -0
  114. package/src/cameras/PerspectiveCamera.js +6 -6
  115. package/src/cameras/StereoCamera.js +2 -2
  116. package/src/constants.js +1 -6
  117. package/src/core/BufferGeometry.js +48 -8
  118. package/src/core/InterleavedBuffer.js +4 -4
  119. package/src/core/Object3D.js +2 -2
  120. package/src/extras/core/Curve.js +3 -3
  121. package/src/extras/core/Shape.js +2 -2
  122. package/src/geometries/CylinderGeometry.js +2 -2
  123. package/src/geometries/EdgesGeometry.js +2 -2
  124. package/src/geometries/LatheGeometry.js +2 -2
  125. package/src/lights/SpotLightShadow.js +2 -2
  126. package/src/materials/LineDashedMaterial.js +0 -1
  127. package/src/materials/Material.js +2 -2
  128. package/src/materials/MeshPhongMaterial.js +1 -1
  129. package/src/materials/MeshPhysicalMaterial.js +2 -2
  130. package/src/materials/MeshStandardMaterial.js +2 -2
  131. package/src/materials/nodes/Line2NodeMaterial.js +32 -13
  132. package/src/materials/nodes/LineDashedNodeMaterial.js +4 -2
  133. package/src/materials/nodes/NodeMaterial.js +93 -23
  134. package/src/materials/nodes/SpriteNodeMaterial.js +11 -2
  135. package/src/materials/nodes/manager/NodeMaterialObserver.js +119 -7
  136. package/src/math/ColorManagement.js +143 -102
  137. package/src/math/Line3.js +2 -2
  138. package/src/math/Quaternion.js +2 -2
  139. package/src/math/Spherical.js +3 -3
  140. package/src/math/Vector2.js +7 -7
  141. package/src/math/Vector3.js +9 -9
  142. package/src/math/Vector4.js +22 -9
  143. package/src/nodes/Nodes.js +2 -21
  144. package/src/nodes/TSL.js +9 -25
  145. package/src/nodes/accessors/Arrays.js +27 -0
  146. package/src/nodes/accessors/BuiltinNode.js +26 -0
  147. package/src/nodes/accessors/Camera.js +0 -1
  148. package/src/nodes/accessors/ClippingNode.js +76 -42
  149. package/src/nodes/accessors/InstanceNode.js +17 -20
  150. package/src/nodes/accessors/InstancedMeshNode.js +26 -0
  151. package/src/nodes/accessors/Lights.js +32 -0
  152. package/src/nodes/accessors/SceneNode.js +35 -1
  153. package/src/nodes/accessors/StorageBufferNode.js +61 -19
  154. package/src/nodes/accessors/StorageTextureNode.js +10 -4
  155. package/src/nodes/accessors/TextureNode.js +1 -1
  156. package/src/nodes/accessors/VelocityNode.js +13 -3
  157. package/src/nodes/code/FunctionCallNode.js +16 -5
  158. package/src/nodes/code/ScriptableNode.js +4 -4
  159. package/src/nodes/core/Node.js +1 -0
  160. package/src/nodes/core/NodeBuilder.js +31 -14
  161. package/src/nodes/core/NodeUtils.js +28 -0
  162. package/src/nodes/core/VarNode.js +15 -3
  163. package/src/nodes/core/constants.js +6 -0
  164. package/src/nodes/display/BlendModes.js +99 -0
  165. package/src/nodes/display/ColorAdjustment.js +53 -4
  166. package/src/nodes/display/ColorSpaceFunctions.js +5 -5
  167. package/src/nodes/display/ColorSpaceNode.js +27 -39
  168. package/src/nodes/display/PassNode.js +6 -4
  169. package/src/nodes/display/ToneMappingNode.js +1 -1
  170. package/src/nodes/display/ToonOutlinePassNode.js +3 -3
  171. package/src/nodes/display/ViewportDepthNode.js +48 -1
  172. package/src/nodes/functions/PhysicalLightingModel.js +21 -15
  173. package/src/nodes/functions/material/getAlphaHashThreshold.js +70 -0
  174. package/src/nodes/functions/material/getGeometryRoughness.js +8 -2
  175. package/src/nodes/functions/material/getParallaxCorrectNormal.js +22 -0
  176. package/src/nodes/gpgpu/ComputeNode.js +9 -1
  177. package/src/nodes/lighting/AnalyticLightNode.js +23 -419
  178. package/src/nodes/lighting/LightsNode.js +24 -12
  179. package/src/nodes/lighting/PointLightNode.js +41 -22
  180. package/src/nodes/lighting/PointShadowNode.js +254 -0
  181. package/src/nodes/lighting/RectAreaLightNode.js +3 -0
  182. package/src/nodes/lighting/ShadowNode.js +593 -0
  183. package/src/nodes/lighting/SpotLightNode.js +14 -2
  184. package/src/nodes/utils/LoopNode.js +2 -2
  185. package/src/nodes/utils/Oscillators.js +6 -0
  186. package/src/nodes/utils/PostProcessingUtils.js +89 -0
  187. package/src/nodes/utils/RTTNode.js +9 -1
  188. package/src/nodes/utils/ReflectorNode.js +101 -15
  189. package/src/nodes/utils/StorageArrayElementNode.js +2 -2
  190. package/src/nodes/utils/Timer.js +29 -0
  191. package/src/objects/BatchedMesh.js +472 -296
  192. package/src/objects/ClippingGroup.js +19 -0
  193. package/src/objects/Skeleton.js +2 -2
  194. package/src/renderers/WebGLRenderer.js +183 -109
  195. package/src/renderers/common/Animation.js +23 -11
  196. package/src/renderers/common/Attributes.js +4 -0
  197. package/src/renderers/common/Backend.js +2 -0
  198. package/src/renderers/common/Background.js +15 -5
  199. package/src/renderers/common/Bindings.js +23 -6
  200. package/src/renderers/common/ClippingContext.js +77 -85
  201. package/src/renderers/common/Constants.js +2 -1
  202. package/src/renderers/common/Geometries.js +20 -0
  203. package/src/renderers/common/IndirectStorageBufferAttribute.js +15 -0
  204. package/src/renderers/common/Lighting.js +45 -0
  205. package/src/renderers/common/PostProcessingUtils.js +86 -0
  206. package/src/renderers/common/RenderList.js +48 -17
  207. package/src/renderers/common/RenderLists.js +4 -2
  208. package/src/renderers/common/RenderObject.js +45 -28
  209. package/src/renderers/common/RenderObjects.js +12 -6
  210. package/src/renderers/common/Renderer.js +222 -77
  211. package/src/renderers/common/Textures.js +41 -17
  212. package/src/renderers/common/UniformsGroup.js +16 -4
  213. package/src/renderers/common/extras/PMREMGenerator.js +89 -13
  214. package/src/renderers/common/nodes/NodeLibrary.js +2 -15
  215. package/src/renderers/common/nodes/NodeStorageBuffer.js +2 -3
  216. package/src/renderers/common/nodes/NodeUniform.js +42 -0
  217. package/src/renderers/common/nodes/Nodes.js +2 -2
  218. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
  219. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
  220. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +2 -2
  221. package/src/renderers/webgl/WebGLBackground.js +20 -1
  222. package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
  223. package/src/renderers/webgl/WebGLCapabilities.js +0 -7
  224. package/src/renderers/webgl/WebGLGeometries.js +0 -28
  225. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
  226. package/src/renderers/webgl/WebGLProgram.js +24 -28
  227. package/src/renderers/webgl/WebGLPrograms.js +5 -2
  228. package/src/renderers/webgl/WebGLState.js +37 -1
  229. package/src/renderers/webgl/WebGLTextures.js +29 -12
  230. package/src/renderers/webgl-fallback/WebGLBackend.js +111 -37
  231. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +2 -7
  232. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +43 -12
  233. package/src/renderers/webgl-fallback/utils/WebGLState.js +26 -1
  234. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +37 -9
  235. package/src/renderers/webgpu/WebGPUBackend.js +152 -56
  236. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -1
  237. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  238. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +0 -8
  239. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +13 -34
  240. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +192 -92
  241. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +12 -4
  242. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -2
  243. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +72 -7
  244. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +29 -9
  245. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +29 -7
  246. package/src/renderers/webgpu/utils/WebGPUUtils.js +0 -1
  247. package/src/renderers/webxr/WebXRManager.js +4 -4
  248. package/src/textures/Source.js +2 -2
  249. package/src/textures/Texture.js +2 -2
  250. package/examples/jsm/cameras/CinematicCamera.js +0 -208
  251. package/src/nodes/display/BlendMode.js +0 -54
  252. package/src/nodes/display/FXAANode.js +0 -332
  253. package/src/nodes/utils/OscNode.js +0 -85
  254. package/src/nodes/utils/TimerNode.js +0 -97
  255. /package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +0 -0
@@ -1,22 +1,38 @@
1
- import TempNode from '../core/TempNode.js';
2
- import { nodeObject, Fn, float, vec2, vec4 } from '../tsl/TSLBase.js';
3
- import { NodeUpdateType } from '../core/constants.js';
4
- import { mul } from '../math/OperatorNode.js';
5
- import { uv } from '../accessors/UV.js';
6
- import { passTexture } from './PassNode.js';
7
- import { uniform } from '../core/UniformNode.js';
8
- import { convertToTexture } from '../utils/RTTNode.js';
9
- import QuadMesh from '../../renderers/common/QuadMesh.js';
10
-
11
- import { Vector2 } from '../../math/Vector2.js';
12
- import { RenderTarget } from '../../core/RenderTarget.js';
13
- import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
1
+ import { RenderTarget, Vector2, NodeMaterial, PostProcessingUtils, QuadMesh, TempNode, NodeUpdateType } from 'three/webgpu';
2
+ import { nodeObject, Fn, If, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, mul } from 'three/tsl';
14
3
 
15
4
  // WebGPU: The use of a single QuadMesh for both gaussian blur passes results in a single RenderObject with a SampledTexture binding that
16
5
  // alternates between source textures and triggers creation of new BindGroups and BindGroupLayouts every frame.
17
6
 
18
- const _quadMesh1 = /*@__PURE__*/ new QuadMesh();
19
- const _quadMesh2 = /*@__PURE__*/ new QuadMesh();
7
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
8
+
9
+ let _rendererState;
10
+
11
+ const premult = /*@__PURE__*/ Fn( ( [ color ] ) => {
12
+
13
+ return vec4( color.rgb.mul( color.a ), color.a );
14
+
15
+ } ).setLayout( {
16
+ name: 'premult',
17
+ type: 'vec4',
18
+ inputs: [
19
+ { name: 'color', type: 'vec4' }
20
+ ]
21
+ } );
22
+
23
+ const unpremult = /*@__PURE__*/ Fn( ( [ color ] ) => {
24
+
25
+ If( color.a.equal( 0.0 ), () => vec4( 0.0 ) );
26
+
27
+ return vec4( color.rgb.div( color.a ), color.a );
28
+
29
+ } ).setLayout( {
30
+ name: 'unpremult',
31
+ type: 'vec4',
32
+ inputs: [
33
+ { name: 'color', type: 'vec4' }
34
+ ]
35
+ } );
20
36
 
21
37
  class GaussianBlurNode extends TempNode {
22
38
 
@@ -37,17 +53,34 @@ class GaussianBlurNode extends TempNode {
37
53
  this._invSize = uniform( new Vector2() );
38
54
  this._passDirection = uniform( new Vector2() );
39
55
 
40
- this._horizontalRT = new RenderTarget();
56
+ this._horizontalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
41
57
  this._horizontalRT.texture.name = 'GaussianBlurNode.horizontal';
42
- this._verticalRT = new RenderTarget();
58
+ this._verticalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
43
59
  this._verticalRT.texture.name = 'GaussianBlurNode.vertical';
44
60
 
45
61
  this._textureNode = passTexture( this, this._verticalRT.texture );
62
+ this._textureNode.uvNode = textureNode.uvNode;
46
63
 
47
- this.updateBeforeType = NodeUpdateType.RENDER;
64
+ this.updateBeforeType = NodeUpdateType.FRAME;
48
65
 
49
66
  this.resolution = new Vector2( 1, 1 );
50
67
 
68
+ this.premultipliedAlpha = false;
69
+
70
+ }
71
+
72
+ setPremultipliedAlpha( value ) {
73
+
74
+ this.premultipliedAlpha = value;
75
+
76
+ return this;
77
+
78
+ }
79
+
80
+ getPremultipliedAlpha() {
81
+
82
+ return this.premultipliedAlpha;
83
+
51
84
  }
52
85
 
53
86
  setSize( width, height ) {
@@ -65,16 +98,16 @@ class GaussianBlurNode extends TempNode {
65
98
 
66
99
  const { renderer } = frame;
67
100
 
101
+ _rendererState = PostProcessingUtils.resetRendererState( renderer, _rendererState );
102
+
103
+ //
104
+
68
105
  const textureNode = this.textureNode;
69
106
  const map = textureNode.value;
70
107
 
71
- const currentRenderTarget = renderer.getRenderTarget();
72
- const currentMRT = renderer.getMRT();
73
-
74
108
  const currentTexture = textureNode.value;
75
109
 
76
- _quadMesh1.material = this._material;
77
- _quadMesh2.material = this._material;
110
+ _quadMesh.material = this._material;
78
111
 
79
112
  this.setSize( map.image.width, map.image.height );
80
113
 
@@ -83,17 +116,13 @@ class GaussianBlurNode extends TempNode {
83
116
  this._horizontalRT.texture.type = textureType;
84
117
  this._verticalRT.texture.type = textureType;
85
118
 
86
- // clear
87
-
88
- renderer.setMRT( null );
89
-
90
119
  // horizontal
91
120
 
92
121
  renderer.setRenderTarget( this._horizontalRT );
93
122
 
94
123
  this._passDirection.value.set( 1, 0 );
95
124
 
96
- _quadMesh1.render( renderer );
125
+ _quadMesh.render( renderer );
97
126
 
98
127
  // vertical
99
128
 
@@ -102,14 +131,14 @@ class GaussianBlurNode extends TempNode {
102
131
 
103
132
  this._passDirection.value.set( 0, 1 );
104
133
 
105
- _quadMesh2.render( renderer );
134
+ _quadMesh.render( renderer );
106
135
 
107
136
  // restore
108
137
 
109
- renderer.setRenderTarget( currentRenderTarget );
110
- renderer.setMRT( currentMRT );
111
138
  textureNode.value = currentTexture;
112
139
 
140
+ PostProcessingUtils.restoreRendererState( renderer, _rendererState );
141
+
113
142
  }
114
143
 
115
144
  getTextureNode() {
@@ -122,20 +151,26 @@ class GaussianBlurNode extends TempNode {
122
151
 
123
152
  const textureNode = this.textureNode;
124
153
 
125
- if ( textureNode.isTextureNode !== true ) {
154
+ //
126
155
 
127
- console.error( 'GaussianBlurNode requires a TextureNode.' );
156
+ const uvNode = textureNode.uvNode || uv();
157
+ const directionNode = vec2( this.directionNode || 1 );
128
158
 
129
- return vec4();
159
+ let sampleTexture, output;
130
160
 
131
- }
161
+ if ( this.premultipliedAlpha ) {
132
162
 
133
- //
163
+ // https://lisyarus.github.io/blog/posts/blur-coefficients-generator.html
134
164
 
135
- const uvNode = textureNode.uvNode || uv();
136
- const directionNode = vec2( this.directionNode || 1 );
165
+ sampleTexture = ( uv ) => premult( textureNode.uv( uv ) );
166
+ output = ( color ) => unpremult( color );
167
+
168
+ } else {
137
169
 
138
- const sampleTexture = ( uv ) => textureNode.uv( uv );
170
+ sampleTexture = ( uv ) => textureNode.uv( uv );
171
+ output = ( color ) => color;
172
+
173
+ }
139
174
 
140
175
  const blur = Fn( () => {
141
176
 
@@ -155,15 +190,15 @@ class GaussianBlurNode extends TempNode {
155
190
 
156
191
  const uvOffset = vec2( direction.mul( invSize.mul( x ) ) ).toVar();
157
192
 
158
- const sample1 = vec4( sampleTexture( uvNode.add( uvOffset ) ) );
159
- const sample2 = vec4( sampleTexture( uvNode.sub( uvOffset ) ) );
193
+ const sample1 = sampleTexture( uvNode.add( uvOffset ) );
194
+ const sample2 = sampleTexture( uvNode.sub( uvOffset ) );
160
195
 
161
196
  diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
162
197
  weightSum.addAssign( mul( 2.0, w ) );
163
198
 
164
199
  }
165
200
 
166
- return diffuseSum.div( weightSum );
201
+ return output( diffuseSum.div( weightSum ) );
167
202
 
168
203
  } );
169
204
 
@@ -211,3 +246,4 @@ class GaussianBlurNode extends TempNode {
211
246
  export default GaussianBlurNode;
212
247
 
213
248
  export const gaussianBlur = ( node, directionNode, sigma ) => nodeObject( new GaussianBlurNode( convertToTexture( node ), directionNode, sigma ) );
249
+ export const premultipliedGaussianBlur = ( node, directionNode, sigma ) => nodeObject( new GaussianBlurNode( convertToTexture( node ), directionNode, sigma ).setPremultipliedAlpha( true ) );
@@ -0,0 +1,161 @@
1
+ import { RenderTarget, Vector2, TempNode, NodeUpdateType, QuadMesh, PostProcessingUtils, NodeMaterial } from 'three/webgpu';
2
+ import { convertToTexture, nodeObject, Fn, passTexture, uv, vec2, vec3, vec4, max, float, sub, int, Loop, fract, pow, distance } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+ const _size = /*@__PURE__*/ new Vector2();
6
+ let _rendererState;
7
+
8
+ /**
9
+ * References:
10
+ * https://john-chapman-graphics.blogspot.com/2013/02/pseudo-lens-flare.html
11
+ * https://john-chapman.github.io/2017/11/05/pseudo-lens-flare.html
12
+ */
13
+ class LensflareNode extends TempNode {
14
+
15
+ static get type() {
16
+
17
+ return 'LensflareNode';
18
+
19
+ }
20
+
21
+ constructor( textureNode, params = {} ) {
22
+
23
+ super( 'vec4' );
24
+
25
+ this.textureNode = textureNode;
26
+
27
+ const {
28
+ ghostTint = vec3( 1, 1, 1 ),
29
+ threshold = float( 0.5 ),
30
+ ghostSamples = float( 4 ),
31
+ ghostSpacing = float( 0.25 ),
32
+ ghostAttenuationFactor = float( 25 ),
33
+ downSampleRatio = 4
34
+ } = params;
35
+
36
+ this.ghostTintNode = nodeObject( ghostTint );
37
+ this.thresholdNode = nodeObject( threshold );
38
+ this.ghostSamplesNode = nodeObject( ghostSamples );
39
+ this.ghostSpacingNode = nodeObject( ghostSpacing );
40
+ this.ghostAttenuationFactorNode = nodeObject( ghostAttenuationFactor );
41
+ this.downSampleRatio = downSampleRatio;
42
+
43
+ this.updateBeforeType = NodeUpdateType.FRAME;
44
+
45
+ // render targets
46
+
47
+ this._renderTarget = new RenderTarget( 1, 1, { depthBuffer: false } );
48
+ this._renderTarget.texture.name = 'LensflareNode';
49
+
50
+ // materials
51
+
52
+ this._material = new NodeMaterial();
53
+ this._material.name = 'LensflareNode';
54
+
55
+ //
56
+
57
+ this._textureNode = passTexture( this, this._renderTarget.texture );
58
+
59
+ }
60
+
61
+ getTextureNode() {
62
+
63
+ return this._textureNode;
64
+
65
+ }
66
+
67
+ setSize( width, height ) {
68
+
69
+ const resx = Math.round( width / this.downSampleRatio );
70
+ const resy = Math.round( height / this.downSampleRatio );
71
+
72
+ this._renderTarget.setSize( resx, resy );
73
+
74
+ }
75
+
76
+ updateBefore( frame ) {
77
+
78
+ const { renderer } = frame;
79
+
80
+ const size = renderer.getDrawingBufferSize( _size );
81
+ this.setSize( size.width, size.height );
82
+
83
+ _rendererState = PostProcessingUtils.resetRendererState( renderer, _rendererState );
84
+
85
+ _quadMesh.material = this._material;
86
+
87
+ // clear
88
+
89
+ renderer.setMRT( null );
90
+
91
+ // lensflare
92
+
93
+ renderer.setRenderTarget( this._renderTarget );
94
+ _quadMesh.render( renderer );
95
+
96
+ // restore
97
+
98
+ PostProcessingUtils.restoreRendererState( renderer, _rendererState );
99
+
100
+ }
101
+
102
+ setup( builder ) {
103
+
104
+ const lensflare = Fn( () => {
105
+
106
+ // flip uvs so lens flare pivot around the image center
107
+
108
+ const texCoord = uv().oneMinus().toVar();
109
+
110
+ // ghosts are positioned along this vector
111
+
112
+ const ghostVec = sub( vec2( 0.5 ), texCoord ).mul( this.ghostSpacingNode ).toVar();
113
+
114
+ // sample ghosts
115
+
116
+ const result = vec4().toVar();
117
+
118
+ Loop( { start: int( 0 ), end: int( this.ghostSamplesNode ), type: 'int', condition: '<' }, ( { i } ) => {
119
+
120
+ // use fract() to ensure that the texture coordinates wrap around
121
+
122
+ const sampleUv = fract( texCoord.add( ghostVec.mul( float( i ) ) ) ).toVar();
123
+
124
+ // reduce contributions from samples at the screen edge
125
+
126
+ const d = distance( sampleUv, vec2( 0.5 ) );
127
+ const weight = pow( d.oneMinus(), this.ghostAttenuationFactorNode );
128
+
129
+ // accumulate
130
+
131
+ let sample = this.textureNode.uv( sampleUv ).rgb;
132
+
133
+ sample = max( sample.sub( this.thresholdNode ), vec3( 0 ) ).mul( this.ghostTintNode );
134
+
135
+ result.addAssign( sample.mul( weight ) );
136
+
137
+ } );
138
+
139
+ return result;
140
+
141
+ } );
142
+
143
+ this._material.fragmentNode = lensflare().context( builder.getSharedContext() );
144
+ this._material.needsUpdate = true;
145
+
146
+ return this._textureNode;
147
+
148
+ }
149
+
150
+ dispose() {
151
+
152
+ this._renderTarget.dispose();
153
+ this._material.dispose();
154
+
155
+ }
156
+
157
+ }
158
+
159
+ export default LensflareNode;
160
+
161
+ export const lensflare = ( inputNode, params ) => nodeObject( new LensflareNode( convertToTexture( inputNode ), params ) );
@@ -1,7 +1,5 @@
1
- import TempNode from '../core/TempNode.js';
2
- import { Fn, nodeObject, vec3, vec4, float } from '../tsl/TSLBase.js';
3
- import { uniform } from '../core/UniformNode.js';
4
- import { mix } from '../math/MathNode.js';
1
+ import { TempNode } from 'three/webgpu';
2
+ import { nodeObject, Fn, float, uniform, vec3, vec4, mix } from 'three/tsl';
5
3
 
6
4
  class Lut3DNode extends TempNode {
7
5
 
@@ -13,7 +11,7 @@ class Lut3DNode extends TempNode {
13
11
 
14
12
  constructor( inputNode, lutNode, size, intensityNode ) {
15
13
 
16
- super();
14
+ super( 'vec4' );
17
15
 
18
16
  this.inputNode = inputNode;
19
17
  this.lutNode = lutNode;
@@ -1,6 +1,5 @@
1
- import { float, int, Fn } from '../tsl/TSLBase.js';
2
- import { Loop } from '../utils/LoopNode.js';
3
- import { uv } from '../accessors/UV.js';
1
+
2
+ import { Fn, float, uv, Loop, int } from 'three/tsl';
4
3
 
5
4
  export const motionBlur = /*@__PURE__*/ Fn( ( [ inputNode, velocity, numSamples = int( 16 ) ] ) => {
6
5