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
@@ -0,0 +1,434 @@
1
+ import { Color, DepthTexture, FloatType, RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, PostProcessingUtils, NodeUpdateType } from 'three/webgpu';
2
+ import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+ const _size = /*@__PURE__*/ new Vector2();
6
+ const _BLUR_DIRECTION_X = /*@__PURE__*/ new Vector2( 1.0, 0.0 );
7
+ const _BLUR_DIRECTION_Y = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
8
+
9
+ let _rendererState;
10
+
11
+ class OutlineNode extends TempNode {
12
+
13
+ static get type() {
14
+
15
+ return 'OutlineNode';
16
+
17
+ }
18
+
19
+ constructor( scene, camera, params = {} ) {
20
+
21
+ super( 'vec4' );
22
+
23
+ const {
24
+ selectedObjects = [],
25
+ edgeThickness = float( 1 ),
26
+ edgeGlow = float( 0 ),
27
+ downSampleRatio = 2
28
+ } = params;
29
+
30
+ this.scene = scene;
31
+ this.camera = camera;
32
+ this.selectedObjects = selectedObjects;
33
+ this.edgeThicknessNode = nodeObject( edgeThickness );
34
+ this.edgeGlowNode = nodeObject( edgeGlow );
35
+ this.downSampleRatio = downSampleRatio;
36
+
37
+ this.updateBeforeType = NodeUpdateType.FRAME;
38
+
39
+ // render targets
40
+
41
+ this._renderTargetDepthBuffer = new RenderTarget();
42
+ this._renderTargetDepthBuffer.depthTexture = new DepthTexture();
43
+ this._renderTargetDepthBuffer.depthTexture.type = FloatType;
44
+
45
+ this._renderTargetMaskBuffer = new RenderTarget();
46
+ this._renderTargetMaskDownSampleBuffer = new RenderTarget( 1, 1, { depthBuffer: false } );
47
+ this._renderTargetEdgeBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
48
+ this._renderTargetEdgeBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
49
+ this._renderTargetBlurBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
50
+ this._renderTargetBlurBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
51
+ this._renderTargetComposite = new RenderTarget( 1, 1, { depthBuffer: false } );
52
+
53
+ // uniforms
54
+
55
+ this._cameraNear = uniform( camera.near );
56
+ this._cameraFar = uniform( camera.far );
57
+ this._blurDirection = uniform( new Vector2() );
58
+
59
+ this._depthTextureUniform = texture( this._renderTargetDepthBuffer.depthTexture );
60
+ this._maskTextureUniform = texture( this._renderTargetMaskBuffer.texture );
61
+ this._maskTextureDownsSampleUniform = texture( this._renderTargetMaskDownSampleBuffer.texture );
62
+ this._edge1TextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
63
+ this._edge2TextureUniform = texture( this._renderTargetEdgeBuffer2.texture );
64
+ this._blurColorTextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
65
+
66
+ // constants
67
+
68
+ this._visibleEdgeColor = vec3( 1, 0, 0 );
69
+ this._hiddenEdgeColor = vec3( 0, 1, 0 );
70
+
71
+ // materials
72
+
73
+ this._depthMaterial = new NodeMaterial();
74
+ this._depthMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
75
+ this._depthMaterial.name = 'OutlineNode.depth';
76
+
77
+ this._prepareMaskMaterial = new NodeMaterial();
78
+ this._prepareMaskMaterial.name = 'OutlineNode.prepareMask';
79
+
80
+ this._materialCopy = new NodeMaterial();
81
+ this._materialCopy.name = 'OutlineNode.copy';
82
+
83
+ this._edgeDetectionMaterial = new NodeMaterial();
84
+ this._edgeDetectionMaterial.name = 'OutlineNode.edgeDetection';
85
+
86
+ this._separableBlurMaterial = new NodeMaterial();
87
+ this._separableBlurMaterial.name = 'OutlineNode.separableBlur';
88
+
89
+ this._separableBlurMaterial2 = new NodeMaterial();
90
+ this._separableBlurMaterial2.name = 'OutlineNode.separableBlur2';
91
+
92
+ this._compositeMaterial = new NodeMaterial();
93
+ this._compositeMaterial.name = 'OutlineNode.composite';
94
+
95
+ //
96
+
97
+ this._selectionCache = new Set();
98
+ this._tempPulseColor1 = new Color();
99
+ this._tempPulseColor2 = new Color();
100
+
101
+ //
102
+
103
+ this._textureNode = passTexture( this, this._renderTargetComposite.texture );
104
+
105
+ }
106
+
107
+ get visibleEdge() {
108
+
109
+ return this.r;
110
+
111
+ }
112
+
113
+ get hiddenEdge() {
114
+
115
+ return this.g;
116
+
117
+ }
118
+
119
+ getTextureNode() {
120
+
121
+ return this._textureNode;
122
+
123
+ }
124
+
125
+ setSize( width, height ) {
126
+
127
+ this._renderTargetDepthBuffer.setSize( width, height );
128
+ this._renderTargetMaskBuffer.setSize( width, height );
129
+ this._renderTargetComposite.setSize( width, height );
130
+
131
+ // downsample 1
132
+
133
+ let resx = Math.round( width / this.downSampleRatio );
134
+ let resy = Math.round( height / this.downSampleRatio );
135
+
136
+ this._renderTargetMaskDownSampleBuffer.setSize( resx, resy );
137
+ this._renderTargetEdgeBuffer1.setSize( resx, resy );
138
+ this._renderTargetBlurBuffer1.setSize( resx, resy );
139
+
140
+ // downsample 2
141
+
142
+ resx = Math.round( resx / 2 );
143
+ resy = Math.round( resy / 2 );
144
+
145
+ this._renderTargetEdgeBuffer2.setSize( resx, resy );
146
+ this._renderTargetBlurBuffer2.setSize( resx, resy );
147
+
148
+ }
149
+
150
+ updateBefore( frame ) {
151
+
152
+ const { renderer } = frame;
153
+ const { camera, scene } = this;
154
+
155
+ _rendererState = PostProcessingUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
156
+
157
+ //
158
+
159
+ const size = renderer.getDrawingBufferSize( _size );
160
+ this.setSize( size.width, size.height );
161
+
162
+ //
163
+
164
+ renderer.setClearColor( 0xffffff, 1 );
165
+
166
+ this._updateSelectionCache();
167
+
168
+ // 1. Draw non-selected objects in the depth buffer
169
+
170
+ scene.overrideMaterial = this._depthMaterial;
171
+
172
+ renderer.setRenderTarget( this._renderTargetDepthBuffer );
173
+ renderer.setRenderObjectFunction( ( object, ...params ) => {
174
+
175
+ if ( this._selectionCache.has( object ) === false ) {
176
+
177
+ renderer.renderObject( object, ...params );
178
+
179
+ }
180
+
181
+ } );
182
+
183
+ renderer.render( scene, camera );
184
+
185
+ // 2. Draw only the selected objects by comparing the depth buffer of non-selected objects
186
+
187
+ scene.overrideMaterial = this._prepareMaskMaterial;
188
+
189
+ renderer.setRenderTarget( this._renderTargetMaskBuffer );
190
+ renderer.setRenderObjectFunction( ( object, ...params ) => {
191
+
192
+ if ( this._selectionCache.has( object ) === true ) {
193
+
194
+ renderer.renderObject( object, ...params );
195
+
196
+ }
197
+
198
+ } );
199
+
200
+ renderer.render( scene, camera );
201
+
202
+ //
203
+
204
+ renderer.setRenderObjectFunction( _rendererState.renderObjectFunction );
205
+
206
+ this._selectionCache.clear();
207
+
208
+ // 3. Downsample to (at least) half resolution
209
+
210
+ _quadMesh.material = this._materialCopy;
211
+ renderer.setRenderTarget( this._renderTargetMaskDownSampleBuffer );
212
+ _quadMesh.render( renderer );
213
+
214
+ // 4. Perform edge detection (half resolution)
215
+
216
+ _quadMesh.material = this._edgeDetectionMaterial;
217
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
218
+ _quadMesh.render( renderer );
219
+
220
+ // 5. Apply blur (half resolution)
221
+
222
+ this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
223
+ this._blurDirection.value.copy( _BLUR_DIRECTION_X );
224
+
225
+ _quadMesh.material = this._separableBlurMaterial;
226
+ renderer.setRenderTarget( this._renderTargetBlurBuffer1 );
227
+ _quadMesh.render( renderer );
228
+
229
+ this._blurColorTextureUniform.value = this._renderTargetBlurBuffer1.texture;
230
+ this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
231
+
232
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer1 );
233
+ _quadMesh.render( renderer );
234
+
235
+ // 6. Apply blur (quarter resolution)
236
+
237
+ this._blurColorTextureUniform.value = this._renderTargetEdgeBuffer1.texture;
238
+ this._blurDirection.value.copy( _BLUR_DIRECTION_X );
239
+
240
+ _quadMesh.material = this._separableBlurMaterial2;
241
+ renderer.setRenderTarget( this._renderTargetBlurBuffer2 );
242
+ _quadMesh.render( renderer );
243
+
244
+ this._blurColorTextureUniform.value = this._renderTargetBlurBuffer2.texture;
245
+ this._blurDirection.value.copy( _BLUR_DIRECTION_Y );
246
+
247
+ renderer.setRenderTarget( this._renderTargetEdgeBuffer2 );
248
+ _quadMesh.render( renderer );
249
+
250
+ // 7. Composite
251
+
252
+ _quadMesh.material = this._compositeMaterial;
253
+ renderer.setRenderTarget( this._renderTargetComposite );
254
+ _quadMesh.render( renderer );
255
+
256
+ // restore
257
+
258
+ PostProcessingUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
259
+
260
+ }
261
+
262
+ setup() {
263
+
264
+ // prepare mask material
265
+
266
+ const prepareMask = () => {
267
+
268
+ const depth = this._depthTextureUniform.uv( screenUV );
269
+
270
+ let viewZNode;
271
+
272
+ if ( this.camera.isPerspectiveCamera ) {
273
+
274
+ viewZNode = perspectiveDepthToViewZ( depth, this._cameraNear, this._cameraFar );
275
+
276
+ } else {
277
+
278
+ viewZNode = orthographicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
279
+
280
+ }
281
+
282
+ const depthTest = positionView.z.lessThanEqual( viewZNode ).select( 1, 0 );
283
+ return vec4( 0.0, depthTest, 1.0, 1.0 );
284
+
285
+ };
286
+
287
+ this._prepareMaskMaterial.fragmentNode = prepareMask();
288
+ this._prepareMaskMaterial.needsUpdate = true;
289
+
290
+ // copy material
291
+
292
+ this._materialCopy.fragmentNode = this._maskTextureUniform;
293
+ this._materialCopy.needsUpdate = true;
294
+
295
+ // edge detection material
296
+
297
+ const edgeDetection = Fn( () => {
298
+
299
+ const resolution = textureSize( this._maskTextureDownsSampleUniform );
300
+ const invSize = vec2( 1 ).div( resolution ).toVar();
301
+ const uvOffset = vec4( 1.0, 0.0, 0.0, 1.0 ).mul( vec4( invSize, invSize ) );
302
+
303
+ const uvNode = uv();
304
+ const c1 = this._maskTextureDownsSampleUniform.uv( uvNode.add( uvOffset.xy ) ).toVar();
305
+ const c2 = this._maskTextureDownsSampleUniform.uv( uvNode.sub( uvOffset.xy ) ).toVar();
306
+ const c3 = this._maskTextureDownsSampleUniform.uv( uvNode.add( uvOffset.yw ) ).toVar();
307
+ const c4 = this._maskTextureDownsSampleUniform.uv( uvNode.sub( uvOffset.yw ) ).toVar();
308
+
309
+ const diff1 = mul( c1.r.sub( c2.r ), 0.5 );
310
+ const diff2 = mul( c3.r.sub( c4.r ), 0.5 );
311
+ const d = vec2( diff1, diff2 ).length();
312
+ const a1 = min( c1.g, c2.g );
313
+ const a2 = min( c3.g, c4.g );
314
+ const visibilityFactor = min( a1, a2 );
315
+ const edgeColor = visibilityFactor.oneMinus().greaterThan( 0.001 ).select( this._visibleEdgeColor, this._hiddenEdgeColor );
316
+ return vec4( edgeColor, 1 ).mul( d );
317
+
318
+ } );
319
+
320
+ this._edgeDetectionMaterial.fragmentNode = edgeDetection();
321
+ this._edgeDetectionMaterial.needsUpdate = true;
322
+
323
+ // seperable blur material
324
+
325
+ const MAX_RADIUS = 4;
326
+
327
+ const gaussianPdf = Fn( ( [ x, sigma ] ) => {
328
+
329
+ return float( 0.39894 ).mul( exp( float( - 0.5 ).mul( x ).mul( x ).div( sigma.mul( sigma ) ) ).div( sigma ) );
330
+
331
+ } );
332
+
333
+ const seperableBlur = Fn( ( [ kernelRadius ] ) => {
334
+
335
+ const resolution = textureSize( this._maskTextureDownsSampleUniform );
336
+ const invSize = vec2( 1 ).div( resolution ).toVar();
337
+ const uvNode = uv();
338
+
339
+ const sigma = kernelRadius.div( 2 ).toVar();
340
+ const weightSum = gaussianPdf( 0, sigma ).toVar();
341
+ const diffuseSum = this._blurColorTextureUniform.uv( uvNode ).mul( weightSum ).toVar();
342
+ const delta = this._blurDirection.mul( invSize ).mul( kernelRadius ).div( MAX_RADIUS ).toVar();
343
+
344
+ const uvOffset = delta.toVar();
345
+
346
+ Loop( { start: int( 1 ), end: int( MAX_RADIUS ), type: 'int', condition: '<=' }, ( { i } ) => {
347
+
348
+ const x = kernelRadius.mul( float( i ) ).div( MAX_RADIUS );
349
+ const w = gaussianPdf( x, sigma );
350
+ const sample1 = this._blurColorTextureUniform.uv( uvNode.add( uvOffset ) );
351
+ const sample2 = this._blurColorTextureUniform.uv( uvNode.sub( uvOffset ) );
352
+
353
+ diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
354
+ weightSum.addAssign( w.mul( 2 ) );
355
+ uvOffset.addAssign( delta );
356
+
357
+ } );
358
+
359
+ return diffuseSum.div( weightSum );
360
+
361
+ } );
362
+
363
+ this._separableBlurMaterial.fragmentNode = seperableBlur( this.edgeThicknessNode );
364
+ this._separableBlurMaterial.needsUpdate = true;
365
+
366
+ this._separableBlurMaterial2.fragmentNode = seperableBlur( MAX_RADIUS );
367
+ this._separableBlurMaterial2.needsUpdate = true;
368
+
369
+ // composite material
370
+
371
+ const composite = Fn( () => {
372
+
373
+ const edgeValue1 = this._edge1TextureUniform;
374
+ const edgeValue2 = this._edge2TextureUniform;
375
+ const maskColor = this._maskTextureUniform;
376
+
377
+ const edgeValue = edgeValue1.add( edgeValue2.mul( this.edgeGlowNode ) );
378
+
379
+ return maskColor.r.mul( edgeValue );
380
+
381
+ } );
382
+
383
+ this._compositeMaterial.fragmentNode = composite();
384
+ this._compositeMaterial.needsUpdate = true;
385
+
386
+ return this._textureNode;
387
+
388
+ }
389
+
390
+ dispose() {
391
+
392
+ this.selectedObjects.length = 0;
393
+
394
+ this._renderTargetDepthBuffer.dispose();
395
+ this._renderTargetMaskBuffer.dispose();
396
+ this._renderTargetMaskDownSampleBuffer.dispose();
397
+ this._renderTargetEdgeBuffer1.dispose();
398
+ this._renderTargetEdgeBuffer2.dispose();
399
+ this._renderTargetBlurBuffer1.dispose();
400
+ this._renderTargetBlurBuffer2.dispose();
401
+ this._renderTargetComposite.dispose();
402
+
403
+ this._depthMaterial.dispose();
404
+ this._prepareMaskMaterial.dispose();
405
+ this._materialCopy.dispose();
406
+ this._edgeDetectionMaterial.dispose();
407
+ this._separableBlurMaterial.dispose();
408
+ this._separableBlurMaterial2.dispose();
409
+ this._compositeMaterial.dispose();
410
+
411
+ }
412
+
413
+ //
414
+
415
+ _updateSelectionCache() {
416
+
417
+ for ( let i = 0; i < this.selectedObjects.length; i ++ ) {
418
+
419
+ const selectedObject = this.selectedObjects[ i ];
420
+ selectedObject.traverse( ( object ) => {
421
+
422
+ if ( object.isMesh ) this._selectionCache.add( object );
423
+
424
+ } );
425
+
426
+ }
427
+
428
+ }
429
+
430
+ }
431
+
432
+ export default OutlineNode;
433
+
434
+ export const outline = ( scene, camera, params ) => nodeObject( new OutlineNode( scene, camera, params ) );
@@ -1,9 +1,6 @@
1
- import { Fn, If, nodeObject, vec4 } from '../tsl/TSLBase.js';
2
- import { uv } from '../accessors/UV.js';
3
- import { mod } from '../math/MathNode.js';
4
- import { screenCoordinate } from './ScreenNode.js';
1
+ import { NodeMaterial } from 'three/webgpu';
2
+ import { nodeObject, Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
5
3
  import StereoCompositePassNode from './StereoCompositePassNode.js';
6
- import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
7
4
 
8
5
  class ParallaxBarrierPassNode extends StereoCompositePassNode {
9
6
 
@@ -1,17 +1,5 @@
1
- import TempNode from '../core/TempNode.js';
2
- import { uv } from '../accessors/UV.js';
3
- import { Fn, nodeObject, vec2, vec3, float, If } from '../tsl/TSLBase.js';
4
- import { NodeUpdateType } from '../core/constants.js';
5
- import { uniform } from '../core/UniformNode.js';
6
- import { dot, clamp, smoothstep, sign, step, floor } from '../math/MathNode.js';
7
- import { Vector4 } from '../../math/Vector4.js';
8
- import { output, property } from '../core/PropertyNode.js';
9
- import PassNode from './PassNode.js';
10
- import { mrt } from '../core/MRTNode.js';
11
- import { normalView } from '../accessors/Normal.js';
12
- import { convertToTexture } from '../utils/RTTNode.js';
13
-
14
- import { NearestFilter } from '../../constants.js';
1
+ import { NearestFilter, Vector4, TempNode, NodeUpdateType, PassNode } from 'three/webgpu';
2
+ import { nodeObject, Fn, float, uv, uniform, convertToTexture, vec2, vec3, clamp, floor, dot, smoothstep, If, sign, step, mrt, output, normalView, property } from 'three/tsl';
15
3
 
16
4
  class PixelationNode extends TempNode {
17
5
 
@@ -23,7 +11,7 @@ class PixelationNode extends TempNode {
23
11
 
24
12
  constructor( textureNode, depthNode, normalNode, pixelSize, normalEdgeStrength, depthEdgeStrength ) {
25
13
 
26
- super();
14
+ super( 'vec4' );
27
15
 
28
16
  // Input textures
29
17
 
@@ -41,7 +29,7 @@ class PixelationNode extends TempNode {
41
29
 
42
30
  this._resolution = uniform( new Vector4() );
43
31
 
44
- this.updateBeforeType = NodeUpdateType.RENDER;
32
+ this.updateBeforeType = NodeUpdateType.FRAME;
45
33
 
46
34
  }
47
35
 
@@ -170,7 +158,7 @@ class PixelationPassNode extends PassNode {
170
158
 
171
159
  constructor( scene, camera, pixelSize = 6, normalEdgeStrength = 0.3, depthEdgeStrength = 0.4 ) {
172
160
 
173
- super( 'color', scene, camera, { minFilter: NearestFilter, magFilter: NearestFilter } );
161
+ super( PassNode.COLOR, scene, camera, { minFilter: NearestFilter, magFilter: NearestFilter } );
174
162
 
175
163
  this.pixelSize = pixelSize;
176
164
  this.normalEdgeStrength = normalEdgeStrength;
@@ -1,9 +1,5 @@
1
- import TempNode from '../core/TempNode.js';
2
- import { nodeObject, Fn, vec2, vec4 } from '../tsl/TSLBase.js';
3
- import { uniform } from '../core/UniformNode.js';
4
- import { uv } from '../accessors/UV.js';
5
- import { sin, cos } from '../math/MathNode.js';
6
- import { convertToTexture } from '../utils/RTTNode.js';
1
+ import { TempNode } from 'three/webgpu';
2
+ import { nodeObject, Fn, uv, uniform, vec2, sin, cos, vec4, convertToTexture } from 'three/tsl';
7
3
 
8
4
  class RGBShiftNode extends TempNode {
9
5