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,16 +1,10 @@
1
- import { nodeObject } from '../tsl/TSLBase.js';
2
- import PassNode from './PassNode.js';
3
- import { Color } from '../../math/Color.js';
4
- import { Vector2 } from '../../math/Vector2.js';
5
- import { AdditiveBlending } from '../../constants.js';
6
- import { uniform } from '../core/UniformNode.js';
7
- import QuadMesh from '../../renderers/common/QuadMesh.js';
8
- import { texture } from '../accessors/TextureNode.js';
9
- import { mrt, getTextureIndex } from '../core/MRTNode.js';
10
- import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
1
+ import { AdditiveBlending, Color, Vector2, PostProcessingUtils, PassNode, QuadMesh, NodeMaterial } from 'three/webgpu';
2
+ import { nodeObject, uniform, mrt, texture, getTextureIndex } from 'three/tsl';
11
3
 
12
4
  const _size = /*@__PURE__*/ new Vector2();
13
5
 
6
+ let _rendererState;
7
+
14
8
  /**
15
9
  *
16
10
  * Supersample Anti-Aliasing Render Pass
@@ -40,8 +34,6 @@ class SSAAPassNode extends PassNode {
40
34
  this.clearColor = new Color( 0x000000 );
41
35
  this.clearAlpha = 0;
42
36
 
43
- this._currentClearColor = new Color();
44
-
45
37
  this.sampleWeight = uniform( 1 );
46
38
 
47
39
  this.sampleRenderTarget = null;
@@ -55,6 +47,10 @@ class SSAAPassNode extends PassNode {
55
47
  const { renderer } = frame;
56
48
  const { scene, camera } = this;
57
49
 
50
+ _rendererState = PostProcessingUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
51
+
52
+ //
53
+
58
54
  this._pixelRatio = renderer.getPixelRatio();
59
55
 
60
56
  const size = renderer.getSize( _size );
@@ -62,14 +58,6 @@ class SSAAPassNode extends PassNode {
62
58
  this.setSize( size.width, size.height );
63
59
  this.sampleRenderTarget.setSize( this.renderTarget.width, this.renderTarget.height );
64
60
 
65
- // save current renderer settings
66
-
67
- renderer.getClearColor( this._currentClearColor );
68
- const currentClearAlpha = renderer.getClearAlpha();
69
- const currentRenderTarget = renderer.getRenderTarget();
70
- const currentMRT = renderer.getMRT();
71
- const currentAutoClear = renderer.autoClear;
72
-
73
61
  //
74
62
 
75
63
  this._cameraNear.value = camera.near;
@@ -173,11 +161,9 @@ class SSAAPassNode extends PassNode {
173
161
 
174
162
  }
175
163
 
176
- renderer.setRenderTarget( currentRenderTarget );
177
- renderer.setMRT( currentMRT );
164
+ //
178
165
 
179
- renderer.autoClear = currentAutoClear;
180
- renderer.setClearColor( this._currentClearColor, currentClearAlpha );
166
+ PostProcessingUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
181
167
 
182
168
  }
183
169
 
@@ -224,7 +210,6 @@ class SSAAPassNode extends PassNode {
224
210
  this._quadMesh.material.depthWrite = false;
225
211
  this._quadMesh.material.premultipliedAlpha = true;
226
212
  this._quadMesh.material.blending = AdditiveBlending;
227
- this._quadMesh.material.normals = false;
228
213
  this._quadMesh.material.name = 'SSAA';
229
214
 
230
215
  return super.setup( builder );
@@ -0,0 +1,366 @@
1
+ import { NearestFilter, RenderTarget, Vector2, PostProcessingUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType } from 'three/webgpu';
2
+ import { reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, sqrt, mul, div, cross, float, Continue, Break, Loop, int, max, abs, sub, If, dot, reflect, normalize, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, vec3, vec4 } 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://lettier.github.io/3d-game-shaders-for-beginners/screen-space-reflection.html
11
+ */
12
+ class SSRNode extends TempNode {
13
+
14
+ static get type() {
15
+
16
+ return 'SSRNode';
17
+
18
+ }
19
+
20
+ constructor( colorNode, depthNode, normalNode, metalnessNode, camera ) {
21
+
22
+ super( 'vec4' );
23
+
24
+ this.colorNode = colorNode;
25
+ this.depthNode = depthNode;
26
+ this.normalNode = normalNode;
27
+ this.metalnessNode = metalnessNode;
28
+ this.camera = camera;
29
+
30
+ this.resolutionScale = 0.5;
31
+
32
+ this.updateBeforeType = NodeUpdateType.FRAME;
33
+
34
+ // render targets
35
+
36
+ this._ssrRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, minFilter: NearestFilter, magFilter: NearestFilter } );
37
+ this._ssrRenderTarget.texture.name = 'SSRNode.SSR';
38
+
39
+ // uniforms
40
+
41
+ this.maxDistance = uniform( 1 ); // controls how far a fragment can reflect
42
+ this.thickness = uniform( 0.1 ); // controls the cutoff between what counts as a possible reflection hit and what does not
43
+ this.opacity = uniform( 1 ); // controls the transparency of the reflected colors
44
+
45
+ this._cameraProjectionMatrix = uniform( camera.projectionMatrix );
46
+ this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
47
+ this._cameraNear = reference( 'near', 'float', camera );
48
+ this._cameraFar = reference( 'far', 'float', camera );
49
+ this._isPerspectiveCamera = uniform( camera.isPerspectiveCamera ? 1 : 0 );
50
+ this._resolution = uniform( new Vector2() );
51
+ this._maxStep = uniform( 0 );
52
+
53
+ // materials
54
+
55
+ this._material = new NodeMaterial();
56
+ this._material.name = 'SSRNode.SSR';
57
+
58
+ //
59
+
60
+ this._textureNode = passTexture( this, this._ssrRenderTarget.texture );
61
+
62
+ }
63
+
64
+ getTextureNode() {
65
+
66
+ return this._textureNode;
67
+
68
+ }
69
+
70
+ setSize( width, height ) {
71
+
72
+ width = Math.round( this.resolutionScale * width );
73
+ height = Math.round( this.resolutionScale * height );
74
+
75
+ this._resolution.value.set( width, height );
76
+ this._maxStep.value = Math.round( Math.sqrt( width * width + height * height ) );
77
+
78
+ this._ssrRenderTarget.setSize( width, height );
79
+
80
+ }
81
+
82
+ updateBefore( frame ) {
83
+
84
+ const { renderer } = frame;
85
+
86
+ _rendererState = PostProcessingUtils.resetRendererState( renderer, _rendererState );
87
+
88
+ const size = renderer.getDrawingBufferSize( _size );
89
+
90
+ _quadMesh.material = this._material;
91
+
92
+ this.setSize( size.width, size.height );
93
+
94
+ // clear
95
+
96
+ renderer.setMRT( null );
97
+ renderer.setClearColor( 0x000000, 0 );
98
+
99
+ // ssr
100
+
101
+ renderer.setRenderTarget( this._ssrRenderTarget );
102
+ _quadMesh.render( renderer );
103
+
104
+ // restore
105
+
106
+ PostProcessingUtils.restoreRendererState( renderer, _rendererState );
107
+
108
+ }
109
+
110
+ setup( builder ) {
111
+
112
+ const uvNode = uv();
113
+
114
+ const pointToLineDistance = Fn( ( [ point, linePointA, linePointB ] )=> {
115
+
116
+ // https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
117
+
118
+ return cross( point.sub( linePointA ), point.sub( linePointB ) ).length().div( linePointB.sub( linePointA ).length() );
119
+
120
+ } );
121
+
122
+ const pointPlaneDistance = Fn( ( [ point, planePoint, planeNormal ] )=> {
123
+
124
+ // https://mathworld.wolfram.com/Point-PlaneDistance.html
125
+ // https://en.wikipedia.org/wiki/Plane_(geometry)
126
+ // http://paulbourke.net/geometry/pointlineplane/
127
+
128
+ const d = mul( planeNormal.x, planePoint.x ).add( mul( planeNormal.y, planePoint.y ) ).add( mul( planeNormal.z, planePoint.z ) ).negate().toVar();
129
+
130
+ const denominator = sqrt( mul( planeNormal.x, planeNormal.x, ).add( mul( planeNormal.y, planeNormal.y ) ).add( mul( planeNormal.z, planeNormal.z ) ) ).toVar();
131
+ const distance = div( mul( planeNormal.x, point.x ).add( mul( planeNormal.y, point.y ) ).add( mul( planeNormal.z, point.z ) ).add( d ), denominator );
132
+ return distance;
133
+
134
+ } );
135
+
136
+ const getViewZ = Fn( ( [ depth ] ) => {
137
+
138
+ let viewZNode;
139
+
140
+ if ( this.camera.isPerspectiveCamera ) {
141
+
142
+ viewZNode = perspectiveDepthToViewZ( depth, this._cameraNear, this._cameraFar );
143
+
144
+ } else {
145
+
146
+ viewZNode = orthographicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
147
+
148
+ }
149
+
150
+ return viewZNode;
151
+
152
+ } );
153
+
154
+ const sampleDepth = ( uv ) => {
155
+
156
+ const depth = this.depthNode.uv( uv ).r;
157
+
158
+ if ( builder.renderer.logarithmicDepthBuffer === true ) {
159
+
160
+ const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
161
+
162
+ return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
163
+
164
+ }
165
+
166
+ return depth;
167
+
168
+ };
169
+
170
+ const ssr = Fn( () => {
171
+
172
+ const metalness = this.metalnessNode.uv( uvNode ).r;
173
+
174
+ // fragments with no metalness do not reflect their environment
175
+ metalness.equal( 0.0 ).discard();
176
+
177
+ // compute some standard FX entities
178
+ const depth = sampleDepth( uvNode ).toVar();
179
+ const viewPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toVar();
180
+ const viewNormal = this.normalNode.rgb.normalize().toVar();
181
+
182
+ // compute the direction from the position in view space to the camera
183
+ const viewIncidentDir = ( ( this.camera.isPerspectiveCamera ) ? normalize( viewPosition ) : vec3( 0, 0, - 1 ) ).toVar();
184
+
185
+ // compute the direction in which the light is reflected on the surface
186
+ const viewReflectDir = reflect( viewIncidentDir, viewNormal ).toVar();
187
+
188
+ // adapt maximum distance to the local geometry (see https://www.mathsisfun.com/algebra/vectors-dot-product.html)
189
+ const maxReflectRayLen = this.maxDistance.div( dot( viewIncidentDir.negate(), viewNormal ) ).toVar();
190
+
191
+ // compute the maximum point of the reflection ray in view space
192
+ const d1viewPosition = viewPosition.add( viewReflectDir.mul( maxReflectRayLen ) ).toVar();
193
+
194
+ // check if d1viewPosition lies behind the camera near plane
195
+ If( this._isPerspectiveCamera.equal( float( 1 ) ).and( d1viewPosition.z.greaterThan( this._cameraNear.negate() ) ), () => {
196
+
197
+ // if so, ensure d1viewPosition is clamped on the near plane.
198
+ // this prevents artifacts during the ray marching process
199
+ const t = sub( this._cameraNear.negate(), viewPosition.z ).div( viewReflectDir.z );
200
+ d1viewPosition.assign( viewPosition.add( viewReflectDir.mul( t ) ) );
201
+
202
+ } );
203
+
204
+ // d0 and d1 are the start and maximum points of the reflection ray in screen space
205
+ const d0 = screenCoordinate.xy.toVar();
206
+ const d1 = getScreenPosition( d1viewPosition, this._cameraProjectionMatrix ).mul( this._resolution ).toVar();
207
+
208
+ // below variables are used to control the raymarching process
209
+
210
+ // total length of the ray
211
+ const totalLen = d1.sub( d0 ).length().toVar();
212
+
213
+ // offset in x and y direction
214
+ const xLen = d1.x.sub( d0.x ).toVar();
215
+ const yLen = d1.y.sub( d0.y ).toVar();
216
+
217
+ // determine the larger delta
218
+ // The larger difference will help to determine how much to travel in the X and Y direction each iteration and
219
+ // how many iterations are needed to travel the entire ray
220
+ const totalStep = max( abs( xLen ), abs( yLen ) ).toVar();
221
+
222
+ // step sizes in the x and y directions
223
+ const xSpan = xLen.div( totalStep ).toVar();
224
+ const ySpan = yLen.div( totalStep ).toVar();
225
+
226
+ const output = vec4( 0 ).toVar();
227
+
228
+ // the actual ray marching loop
229
+ // starting from d0, the code gradually travels along the ray and looks for an intersection with the geometry.
230
+ // it does not exceed d1 (the maximum ray extend)
231
+ Loop( { start: int( 0 ), end: int( this._maxStep ), type: 'int', condition: '<' }, ( { i } ) => {
232
+
233
+ // TODO: Remove this when Chrome is fixed, see https://issues.chromium.org/issues/372714384#comment14
234
+ If( metalness.equal( 0 ), () => {
235
+
236
+ Break();
237
+
238
+ } );
239
+
240
+ // stop if the maximum number of steps is reached for this specific ray
241
+ If( float( i ).greaterThanEqual( totalStep ), () => {
242
+
243
+ Break();
244
+
245
+ } );
246
+
247
+ // advance on the ray by computing a new position in screen space
248
+ const xy = vec2( d0.x.add( xSpan.mul( float( i ) ) ), d0.y.add( ySpan.mul( float( i ) ) ) ).toVar();
249
+
250
+ // stop processing if the new position lies outside of the screen
251
+ If( xy.x.lessThan( 0 ).or( xy.x.greaterThan( this._resolution.x ) ).or( xy.y.lessThan( 0 ) ).or( xy.y.greaterThan( this._resolution.y ) ), () => {
252
+
253
+ Break();
254
+
255
+ } );
256
+
257
+ // compute new uv, depth, viewZ and viewPosition for the new location on the ray
258
+ const uvNode = xy.div( this._resolution );
259
+ const d = sampleDepth( uvNode ).toVar();
260
+ const vZ = getViewZ( d ).toVar();
261
+ const vP = getViewPosition( uvNode, d, this._cameraProjectionMatrixInverse ).toVar();
262
+
263
+ const viewReflectRayZ = float( 0 ).toVar();
264
+
265
+ // normalized distance between the current position xy and the starting point d0
266
+ const s = xy.sub( d0 ).length().div( totalLen );
267
+
268
+ // depending on the camera type, we now compute the z-coordinate of the reflected ray at the current step in view space
269
+ If( this._isPerspectiveCamera.equal( float( 1 ) ), () => {
270
+
271
+ const recipVPZ = float( 1 ).div( viewPosition.z ).toVar();
272
+ viewReflectRayZ.assign( float( 1 ).div( recipVPZ.add( s.mul( float( 1 ).div( d1viewPosition.z ).sub( recipVPZ ) ) ) ) );
273
+
274
+ } ).Else( () => {
275
+
276
+ viewReflectRayZ.assign( viewPosition.z.add( s.mul( d1viewPosition.z.sub( viewPosition.z ) ) ) );
277
+
278
+ } );
279
+
280
+ // if viewReflectRayZ is less or equal than the real z-coordinate at this place, it potentially intersects the geometry
281
+ If( viewReflectRayZ.lessThanEqual( vZ ), () => {
282
+
283
+ // compute the distance of the new location to the ray in view space
284
+ // to clarify vP is the fragment's view position which is not an exact point on the ray
285
+ const away = pointToLineDistance( vP, viewPosition, d1viewPosition ).toVar();
286
+
287
+ // compute the minimum thickness between the current fragment and its neighbor in the x-direction.
288
+ const xyNeighbor = vec2( xy.x.add( 1 ), xy.y ).toVar(); // move one pixel
289
+ const uvNeighbor = xyNeighbor.div( this._resolution );
290
+ const vPNeighbor = getViewPosition( uvNeighbor, d, this._cameraProjectionMatrixInverse ).toVar();
291
+ const minThickness = vPNeighbor.x.sub( vP.x ).toVar();
292
+ minThickness.mulAssign( 3 ); // expand a bit to avoid errors
293
+
294
+ const tk = max( minThickness, this.thickness ).toVar();
295
+
296
+ If( away.lessThanEqual( tk ), () => { // hit
297
+
298
+ const vN = this.normalNode.uv( uvNode ).rgb.normalize().toVar();
299
+
300
+ If( dot( viewReflectDir, vN ).greaterThanEqual( 0 ), () => {
301
+
302
+ // the reflected ray is pointing towards the same side as the fragment's normal (current ray position),
303
+ // which means it wouldn't reflect off the surface. The loop continues to the next step for the next ray sample.
304
+ Continue();
305
+
306
+ } );
307
+
308
+ // this distance represents the depth of the intersection point between the reflected ray and the scene.
309
+ const distance = pointPlaneDistance( vP, viewPosition, viewNormal ).toVar();
310
+
311
+ If( distance.greaterThan( this.maxDistance ), () => {
312
+
313
+ // Distance exceeding limit: The reflection is potentially too far away and
314
+ // might not contribute significantly to the final color
315
+ Break();
316
+
317
+ } );
318
+
319
+ const op = this.opacity.mul( metalness ).toVar();
320
+
321
+ // distance attenuation (the reflection should fade out the farther it is away from the surface)
322
+ const ratio = float( 1 ).sub( distance.div( this.maxDistance ) ).toVar();
323
+ const attenuation = ratio.mul( ratio );
324
+ op.mulAssign( attenuation );
325
+
326
+ // fresnel (reflect more light on surfaces that are viewed at grazing angles)
327
+ const fresnelCoe = div( dot( viewIncidentDir, viewReflectDir ).add( 1 ), 2 );
328
+ op.mulAssign( fresnelCoe );
329
+
330
+ // output
331
+ const reflectColor = this.colorNode.uv( uvNode );
332
+ output.assign( vec4( reflectColor.rgb, op ) );
333
+ Break();
334
+
335
+ } );
336
+
337
+ } );
338
+
339
+ } );
340
+
341
+ return output;
342
+
343
+ } );
344
+
345
+ this._material.fragmentNode = ssr().context( builder.getSharedContext() );
346
+ this._material.needsUpdate = true;
347
+
348
+ //
349
+
350
+ return this._textureNode;
351
+
352
+ }
353
+
354
+ dispose() {
355
+
356
+ this._ssrRenderTarget.dispose();
357
+
358
+ this._material.dispose();
359
+
360
+ }
361
+
362
+ }
363
+
364
+ export default SSRNode;
365
+
366
+ export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, camera ) => nodeObject( new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), camera ) );
@@ -1,5 +1,4 @@
1
- import { Fn, vec3, vec4 } from '../tsl/TSLBase.js';
2
- import { dot } from '../math/MathNode.js';
1
+ import { dot, Fn, vec3, vec4 } from 'three/tsl';
3
2
 
4
3
  export const sepia = /*@__PURE__*/ Fn( ( [ color ] ) => {
5
4
 
@@ -1,13 +1,5 @@
1
- import TempNode from '../core/TempNode.js';
2
- import { uv } from '../accessors/UV.js';
3
- import { luminance } from './ColorAdjustment.js';
4
- import { Fn, nodeObject, vec2, vec3, vec4, mat3 } from '../tsl/TSLBase.js';
5
- import { NodeUpdateType } from '../core/constants.js';
6
- import { uniform } from '../core/UniformNode.js';
7
- import { add } from '../math/OperatorNode.js';
8
- import { convertToTexture } from '../utils/RTTNode.js';
9
-
10
- import { Vector2 } from '../../math/Vector2.js';
1
+ import { Vector2, TempNode, NodeUpdateType } from 'three/webgpu';
2
+ import { nodeObject, Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3, luminance, add } from 'three/tsl';
11
3
 
12
4
  class SobelOperatorNode extends TempNode {
13
5
 
@@ -19,11 +11,11 @@ class SobelOperatorNode extends TempNode {
19
11
 
20
12
  constructor( textureNode ) {
21
13
 
22
- super();
14
+ super( 'vec4' );
23
15
 
24
16
  this.textureNode = textureNode;
25
17
 
26
- this.updateBeforeType = NodeUpdateType.RENDER;
18
+ this.updateBeforeType = NodeUpdateType.FRAME;
27
19
 
28
20
  this._invSize = uniform( new Vector2() );
29
21
 
@@ -1,15 +1,11 @@
1
-
2
- import PassNode from './PassNode.js';
3
- import { StereoCamera } from '../../cameras/StereoCamera.js';
4
- import { HalfFloatType, LinearFilter, NearestFilter } from '../../constants.js';
5
- import { RenderTarget } from '../../core/RenderTarget.js';
6
- import { texture } from '../accessors/TextureNode.js';
7
- import { Vector2 } from '../../math/Vector2.js';
8
- import QuadMesh from '../../renderers/common/QuadMesh.js';
1
+ import { RenderTarget, StereoCamera, HalfFloatType, LinearFilter, NearestFilter, Vector2, PassNode, QuadMesh, PostProcessingUtils } from 'three/webgpu';
2
+ import { texture } from 'three/tsl';
9
3
 
10
4
  const _size = /*@__PURE__*/ new Vector2();
11
5
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
12
6
 
7
+ let _rendererState;
8
+
13
9
  class StereoCompositePassNode extends PassNode {
14
10
 
15
11
  static get type() {
@@ -59,6 +55,10 @@ class StereoCompositePassNode extends PassNode {
59
55
  const { renderer } = frame;
60
56
  const { scene, stereo, renderTarget } = this;
61
57
 
58
+ _rendererState = PostProcessingUtils.resetRendererState( renderer, _rendererState );
59
+
60
+ //
61
+
62
62
  this._pixelRatio = renderer.getPixelRatio();
63
63
 
64
64
  this.updateStereoCamera( renderer.coordinateSystem );
@@ -66,8 +66,6 @@ class StereoCompositePassNode extends PassNode {
66
66
  const size = renderer.getSize( _size );
67
67
  this.setSize( size.width, size.height );
68
68
 
69
- const currentRenderTarget = renderer.getRenderTarget();
70
-
71
69
  // left
72
70
 
73
71
  renderer.setRenderTarget( this._renderTargetL );
@@ -86,7 +84,7 @@ class StereoCompositePassNode extends PassNode {
86
84
 
87
85
  // restore
88
86
 
89
- renderer.setRenderTarget( currentRenderTarget );
87
+ PostProcessingUtils.restoreRendererState( renderer, _rendererState );
90
88
 
91
89
  }
92
90
 
@@ -1,10 +1,10 @@
1
- import { nodeObject } from '../tsl/TSLBase.js';
2
- import PassNode from './PassNode.js';
3
- import { Vector2 } from '../../math/Vector2.js';
4
- import { StereoCamera } from '../../cameras/StereoCamera.js';
1
+ import { StereoCamera, Vector2, PassNode, PostProcessingUtils } from 'three/webgpu';
2
+ import { nodeObject } from 'three/tsl';
5
3
 
6
4
  const _size = /*@__PURE__*/ new Vector2();
7
5
 
6
+ let _rendererState;
7
+
8
8
  class StereoPassNode extends PassNode {
9
9
 
10
10
  static get type() {
@@ -29,6 +29,10 @@ class StereoPassNode extends PassNode {
29
29
  const { renderer } = frame;
30
30
  const { scene, camera, stereo, renderTarget } = this;
31
31
 
32
+ _rendererState = PostProcessingUtils.resetRendererState( renderer, _rendererState );
33
+
34
+ //
35
+
32
36
  this._pixelRatio = renderer.getPixelRatio();
33
37
 
34
38
  stereo.cameraL.coordinateSystem = renderer.coordinateSystem;
@@ -38,12 +42,8 @@ class StereoPassNode extends PassNode {
38
42
  const size = renderer.getSize( _size );
39
43
  this.setSize( size.width, size.height );
40
44
 
41
- const currentAutoClear = renderer.autoClear;
42
45
  renderer.autoClear = false;
43
46
 
44
- const currentRenderTarget = renderer.getRenderTarget();
45
- const currentMRT = renderer.getMRT();
46
-
47
47
  this._cameraNear.value = camera.near;
48
48
  this._cameraFar.value = camera.far;
49
49
 
@@ -69,10 +69,9 @@ class StereoPassNode extends PassNode {
69
69
 
70
70
  renderTarget.scissorTest = false;
71
71
 
72
- renderer.setRenderTarget( currentRenderTarget );
73
- renderer.setMRT( currentMRT );
72
+ // restore
74
73
 
75
- renderer.autoClear = currentAutoClear;
74
+ PostProcessingUtils.restoreRendererState( renderer, _rendererState );
76
75
 
77
76
  }
78
77