super-three 0.154.1 → 0.156.0

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 (172) hide show
  1. package/build/three.cjs +360 -160
  2. package/build/three.js +360 -160
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +355 -161
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +155 -25
  7. package/examples/jsm/csm/CSMShader.js +35 -1
  8. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  9. package/examples/jsm/exporters/USDZExporter.js +1 -0
  10. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  11. package/examples/jsm/libs/tween.module.js +790 -735
  12. package/examples/jsm/libs/utif.module.js +1644 -1558
  13. package/examples/jsm/loaders/DDSLoader.js +46 -3
  14. package/examples/jsm/loaders/EXRLoader.js +4 -4
  15. package/examples/jsm/loaders/FBXLoader.js +3 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +25 -10
  17. package/examples/jsm/loaders/KTX2Loader.js +128 -79
  18. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  19. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  20. package/examples/jsm/loaders/MMDLoader.js +10 -7
  21. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  22. package/examples/jsm/loaders/PLYLoader.js +1 -1
  23. package/examples/jsm/loaders/RGBELoader.js +48 -66
  24. package/examples/jsm/loaders/STLLoader.js +7 -0
  25. package/examples/jsm/loaders/TGALoader.js +10 -10
  26. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  27. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  28. package/examples/jsm/misc/Volume.js +4 -6
  29. package/examples/jsm/nodes/Nodes.js +8 -6
  30. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
  31. package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
  32. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
  33. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  34. package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
  35. package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
  36. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
  40. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  41. package/examples/jsm/nodes/core/AttributeNode.js +2 -2
  42. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  43. package/examples/jsm/nodes/core/Node.js +28 -3
  44. package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
  45. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  46. package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
  47. package/examples/jsm/nodes/core/PropertyNode.js +6 -0
  48. package/examples/jsm/nodes/core/StackNode.js +4 -4
  49. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  51. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  52. package/examples/jsm/nodes/display/ViewportNode.js +19 -5
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  54. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  55. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  56. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  57. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  58. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  59. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  61. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  62. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  63. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  65. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  66. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  67. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  68. package/examples/jsm/nodes/materials/Materials.js +2 -0
  69. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  70. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  71. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  72. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  73. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  74. package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
  75. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  76. package/examples/jsm/nodes/math/HashNode.js +35 -0
  77. package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
  78. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  79. package/examples/jsm/objects/Reflector.js +1 -9
  80. package/examples/jsm/objects/Refractor.js +0 -8
  81. package/examples/jsm/offscreen/scene.js +0 -1
  82. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  83. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  84. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  85. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  86. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  87. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  88. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  89. package/examples/jsm/renderers/common/Backend.js +11 -8
  90. package/examples/jsm/renderers/common/Background.js +22 -20
  91. package/examples/jsm/renderers/common/Binding.js +14 -0
  92. package/examples/jsm/renderers/common/Bindings.js +7 -10
  93. package/examples/jsm/renderers/common/Geometries.js +1 -1
  94. package/examples/jsm/renderers/common/Pipelines.js +96 -47
  95. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  96. package/examples/jsm/renderers/common/RenderContexts.js +41 -5
  97. package/examples/jsm/renderers/common/RenderList.js +12 -4
  98. package/examples/jsm/renderers/common/RenderObject.js +26 -6
  99. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  100. package/examples/jsm/renderers/common/Renderer.js +82 -42
  101. package/examples/jsm/renderers/common/SampledTexture.js +2 -1
  102. package/examples/jsm/renderers/common/Sampler.js +1 -1
  103. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  104. package/examples/jsm/renderers/common/Textures.js +172 -20
  105. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
  106. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
  107. package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
  108. package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  111. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  113. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
  114. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  115. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  116. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
  117. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
  118. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  119. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
  120. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  121. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  122. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
  123. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  124. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
  127. package/examples/jsm/shaders/FilmShader.js +11 -54
  128. package/examples/jsm/shaders/OutputShader.js +19 -2
  129. package/examples/jsm/shaders/SAOShader.js +0 -13
  130. package/examples/jsm/shaders/SSAOShader.js +33 -26
  131. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  132. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  133. package/package.json +2 -2
  134. package/src/Three.js +3 -0
  135. package/src/animation/PropertyBinding.js +1 -1
  136. package/src/audio/Audio.js +6 -0
  137. package/src/cameras/CubeCamera.js +1 -4
  138. package/src/constants.js +4 -1
  139. package/src/core/BufferAttribute.js +20 -0
  140. package/src/core/Object3D.js +2 -15
  141. package/src/core/RenderTarget.js +122 -0
  142. package/src/core/UniformsGroup.js +2 -2
  143. package/src/geometries/CapsuleGeometry.js +1 -1
  144. package/src/loaders/DataTextureLoader.js +19 -2
  145. package/src/materials/Material.js +2 -2
  146. package/src/math/Vector2.js +2 -2
  147. package/src/math/Vector3.js +3 -3
  148. package/src/math/Vector4.js +4 -4
  149. package/src/objects/Line.js +1 -1
  150. package/src/objects/Mesh.js +1 -1
  151. package/src/objects/Points.js +1 -1
  152. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  153. package/src/renderers/WebGLRenderTarget.js +3 -110
  154. package/src/renderers/WebGLRenderer.js +83 -57
  155. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  156. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  157. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  158. package/src/renderers/webgl/WebGLBackground.js +5 -14
  159. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  160. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  161. package/src/renderers/webgl/WebGLProgram.js +2 -0
  162. package/src/renderers/webgl/WebGLPrograms.js +19 -3
  163. package/src/renderers/webgl/WebGLTextures.js +101 -16
  164. package/src/renderers/webgl/WebGLUtils.js +27 -20
  165. package/src/textures/CompressedCubeTexture.js +19 -0
  166. package/src/textures/Texture.js +2 -2
  167. package/src/utils.js +9 -1
  168. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  169. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  170. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
  171. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
  172. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
@@ -37,6 +37,10 @@ const shaderNodeHandler = {
37
37
 
38
38
  return ( ...params ) => nodeElement( nodeObj, ...params );
39
39
 
40
+ } else if ( prop === 'self' ) {
41
+
42
+ return node;
43
+
40
44
  } else if ( prop.endsWith( 'Assign' ) && NodeElements.has( prop.slice( 0, prop.length - 'Assign'.length ) ) ) {
41
45
 
42
46
  const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) );
@@ -261,7 +265,7 @@ const safeGetNodeType = ( node ) => {
261
265
 
262
266
  return node.getNodeType();
263
267
 
264
- } catch {
268
+ } catch ( _ ) {
265
269
 
266
270
  return undefined;
267
271
 
@@ -322,7 +326,7 @@ export const nodeImmutable = ( ...params ) => new ShaderNodeImmutable( ...params
322
326
 
323
327
  export const shader = ( jsFunc ) => { // @deprecated, r154
324
328
 
325
- console.warn( 'TSL: shader() is deprecated. Use fn() instead.' );
329
+ console.warn( 'TSL: shader() is deprecated. Use tslFn() instead.' );
326
330
 
327
331
  return new ShaderNode( jsFunc );
328
332
 
@@ -59,7 +59,7 @@ class SplitNode extends Node {
59
59
 
60
60
  if ( this.components.length === nodeTypeLength && this.components === stringVectorComponents.slice( 0, this.components.length ) ) {
61
61
 
62
- // unecessary swizzle
62
+ // unnecessary swizzle
63
63
 
64
64
  snippet = builder.format( nodeSnippet, type, output );
65
65
 
@@ -9,9 +9,7 @@ import {
9
9
  Vector3,
10
10
  Vector4,
11
11
  WebGLRenderTarget,
12
- HalfFloatType,
13
- NoToneMapping,
14
- LinearSRGBColorSpace
12
+ HalfFloatType
15
13
  } from 'three';
16
14
 
17
15
  class Reflector extends Mesh {
@@ -147,13 +145,9 @@ class Reflector extends Mesh {
147
145
 
148
146
  const currentXrEnabled = renderer.xr.enabled;
149
147
  const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;
150
- const currentOutputColorSpace = renderer.outputColorSpace;
151
- const currentToneMapping = renderer.toneMapping;
152
148
 
153
149
  renderer.xr.enabled = false; // Avoid camera modification
154
150
  renderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows
155
- renderer.outputColorSpace = LinearSRGBColorSpace;
156
- renderer.toneMapping = NoToneMapping;
157
151
 
158
152
  renderer.setRenderTarget( renderTarget );
159
153
 
@@ -164,8 +158,6 @@ class Reflector extends Mesh {
164
158
 
165
159
  renderer.xr.enabled = currentXrEnabled;
166
160
  renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
167
- renderer.outputColorSpace = currentOutputColorSpace;
168
- renderer.toneMapping = currentToneMapping;
169
161
 
170
162
  renderer.setRenderTarget( currentRenderTarget );
171
163
 
@@ -10,8 +10,6 @@ import {
10
10
  Vector3,
11
11
  Vector4,
12
12
  WebGLRenderTarget,
13
- LinearSRGBColorSpace,
14
- NoToneMapping,
15
13
  HalfFloatType
16
14
  } from 'three';
17
15
 
@@ -194,13 +192,9 @@ class Refractor extends Mesh {
194
192
  const currentRenderTarget = renderer.getRenderTarget();
195
193
  const currentXrEnabled = renderer.xr.enabled;
196
194
  const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;
197
- const currentOutputColorSpace = renderer.outputColorSpace;
198
- const currentToneMapping = renderer.toneMapping;
199
195
 
200
196
  renderer.xr.enabled = false; // avoid camera modification
201
197
  renderer.shadowMap.autoUpdate = false; // avoid re-computing shadows
202
- renderer.outputColorSpace = LinearSRGBColorSpace;
203
- renderer.toneMapping = NoToneMapping;
204
198
 
205
199
  renderer.setRenderTarget( renderTarget );
206
200
  if ( renderer.autoClear === false ) renderer.clear();
@@ -208,8 +202,6 @@ class Refractor extends Mesh {
208
202
 
209
203
  renderer.xr.enabled = currentXrEnabled;
210
204
  renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;
211
- renderer.outputColorSpace = currentOutputColorSpace;
212
- renderer.toneMapping = currentToneMapping;
213
205
  renderer.setRenderTarget( currentRenderTarget );
214
206
 
215
207
  // restore viewport
@@ -45,7 +45,6 @@ function init( canvas, width, height, pixelRatio, path ) {
45
45
  renderer = new THREE.WebGLRenderer( { antialias: true, canvas: canvas } );
46
46
  renderer.setPixelRatio( pixelRatio );
47
47
  renderer.setSize( width, height, false );
48
- renderer.useLegacyLights = false;
49
48
 
50
49
  animate();
51
50
 
@@ -7,7 +7,7 @@ import { FilmShader } from '../shaders/FilmShader.js';
7
7
 
8
8
  class FilmPass extends Pass {
9
9
 
10
- constructor( noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale ) {
10
+ constructor( intensity = 0.5, grayscale = false ) {
11
11
 
12
12
  super();
13
13
 
@@ -24,10 +24,8 @@ class FilmPass extends Pass {
24
24
 
25
25
  } );
26
26
 
27
- if ( grayscale !== undefined ) this.uniforms.grayscale.value = grayscale;
28
- if ( noiseIntensity !== undefined ) this.uniforms.nIntensity.value = noiseIntensity;
29
- if ( scanlinesIntensity !== undefined ) this.uniforms.sIntensity.value = scanlinesIntensity;
30
- if ( scanlinesCount !== undefined ) this.uniforms.sCount.value = scanlinesCount;
27
+ this.uniforms.intensity.value = intensity; // (0 = no effect, 1 = full effect)
28
+ this.uniforms.grayscale.value = grayscale;
31
29
 
32
30
  this.fsQuad = new FullScreenQuad( this.material );
33
31
 
@@ -63,11 +63,14 @@ class MaskPass extends Pass {
63
63
  if ( this.clear ) renderer.clear();
64
64
  renderer.render( this.scene, this.camera );
65
65
 
66
- // unlock color and depth buffer for subsequent rendering
66
+ // unlock color and depth buffer and make them writable for subsequent rendering/clearing
67
67
 
68
68
  state.buffers.color.setLocked( false );
69
69
  state.buffers.depth.setLocked( false );
70
70
 
71
+ state.buffers.color.setMask( true );
72
+ state.buffers.depth.setMask( true );
73
+
71
74
  // only render where stencil is set to 1
72
75
 
73
76
  state.buffers.stencil.setLocked( false );
@@ -1,49 +1,68 @@
1
1
  import {
2
- ShaderMaterial,
2
+ RawShaderMaterial,
3
3
  UniformsUtils,
4
- NoToneMapping,
5
4
  LinearToneMapping,
6
5
  ReinhardToneMapping,
7
6
  CineonToneMapping,
8
- ACESFilmicToneMapping
7
+ ACESFilmicToneMapping,
8
+ SRGBColorSpace
9
9
  } from 'three';
10
10
  import { Pass, FullScreenQuad } from './Pass.js';
11
11
  import { OutputShader } from '../shaders/OutputShader.js';
12
12
 
13
13
  class OutputPass extends Pass {
14
14
 
15
- constructor( toneMapping = NoToneMapping, toneMappingExposure = 1 ) {
15
+ constructor() {
16
16
 
17
17
  super();
18
18
 
19
- this.toneMapping = toneMapping;
20
- this.toneMappingExposure = toneMappingExposure;
21
-
22
19
  //
23
20
 
24
21
  const shader = OutputShader;
25
22
 
26
23
  this.uniforms = UniformsUtils.clone( shader.uniforms );
27
24
 
28
- this.material = new ShaderMaterial( {
25
+ this.material = new RawShaderMaterial( {
29
26
  uniforms: this.uniforms,
30
27
  vertexShader: shader.vertexShader,
31
28
  fragmentShader: shader.fragmentShader
32
29
  } );
33
30
 
34
- if ( toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';
35
- else if ( toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
36
- else if ( toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
37
- else if ( toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
38
-
39
31
  this.fsQuad = new FullScreenQuad( this.material );
40
32
 
33
+ // internal cache
34
+
35
+ this._outputColorSpace = null;
36
+ this._toneMapping = null;
37
+
41
38
  }
42
39
 
43
40
  render( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {
44
41
 
45
42
  this.uniforms[ 'tDiffuse' ].value = readBuffer.texture;
46
- this.uniforms[ 'toneMappingExposure' ].value = this.toneMappingExposure;
43
+ this.uniforms[ 'toneMappingExposure' ].value = renderer.toneMappingExposure;
44
+
45
+ // rebuild defines if required
46
+
47
+ if ( this._outputColorSpace !== renderer.outputColorSpace || this._toneMapping !== renderer.toneMapping ) {
48
+
49
+ this._outputColorSpace = renderer.outputColorSpace;
50
+ this._toneMapping = renderer.toneMapping;
51
+
52
+ this.material.defines = {};
53
+
54
+ if ( this._outputColorSpace == SRGBColorSpace ) this.material.defines.SRGB_COLOR_SPACE = '';
55
+
56
+ if ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';
57
+ else if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';
58
+ else if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';
59
+ else if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';
60
+
61
+ this.material.needsUpdate = true;
62
+
63
+ }
64
+
65
+ //
47
66
 
48
67
  if ( this.renderToScreen === true ) {
49
68
 
@@ -5,7 +5,7 @@ import { Pass } from './Pass.js';
5
5
 
6
6
  class RenderPass extends Pass {
7
7
 
8
- constructor( scene, camera, overrideMaterial, clearColor, clearAlpha ) {
8
+ constructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {
9
9
 
10
10
  super();
11
11
 
@@ -15,7 +15,7 @@ class RenderPass extends Pass {
15
15
  this.overrideMaterial = overrideMaterial;
16
16
 
17
17
  this.clearColor = clearColor;
18
- this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;
18
+ this.clearAlpha = clearAlpha;
19
19
 
20
20
  this.clear = true;
21
21
  this.clearDepth = false;
@@ -31,7 +31,7 @@ class RenderPass extends Pass {
31
31
 
32
32
  let oldClearAlpha, oldOverrideMaterial;
33
33
 
34
- if ( this.overrideMaterial !== undefined ) {
34
+ if ( this.overrideMaterial !== null ) {
35
35
 
36
36
  oldOverrideMaterial = this.scene.overrideMaterial;
37
37
 
@@ -39,16 +39,21 @@ class RenderPass extends Pass {
39
39
 
40
40
  }
41
41
 
42
- if ( this.clearColor ) {
42
+ if ( this.clearColor !== null ) {
43
43
 
44
44
  renderer.getClearColor( this._oldClearColor );
45
- oldClearAlpha = renderer.getClearAlpha();
45
+ renderer.setClearColor( this.clearColor );
46
+
47
+ }
46
48
 
47
- renderer.setClearColor( this.clearColor, this.clearAlpha );
49
+ if ( this.clearAlpha !== null ) {
50
+
51
+ oldClearAlpha = renderer.getClearAlpha();
52
+ renderer.setClearAlpha( this.clearAlpha );
48
53
 
49
54
  }
50
55
 
51
- if ( this.clearDepth ) {
56
+ if ( this.clearDepth == true ) {
52
57
 
53
58
  renderer.clearDepth();
54
59
 
@@ -56,17 +61,30 @@ class RenderPass extends Pass {
56
61
 
57
62
  renderer.setRenderTarget( this.renderToScreen ? null : readBuffer );
58
63
 
59
- // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600
60
- if ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
64
+ if ( this.clear === true ) {
65
+
66
+ // TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600
67
+ renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
68
+
69
+ }
70
+
61
71
  renderer.render( this.scene, this.camera );
62
72
 
63
- if ( this.clearColor ) {
73
+ // restore
74
+
75
+ if ( this.clearColor !== null ) {
76
+
77
+ renderer.setClearColor( this._oldClearColor );
78
+
79
+ }
80
+
81
+ if ( this.clearAlpha !== null ) {
64
82
 
65
- renderer.setClearColor( this._oldClearColor, oldClearAlpha );
83
+ renderer.setClearAlpha( oldClearAlpha );
66
84
 
67
85
  }
68
86
 
69
- if ( this.overrideMaterial !== undefined ) {
87
+ if ( this.overrideMaterial !== null ) {
70
88
 
71
89
  this.scene.overrideMaterial = oldOverrideMaterial;
72
90
 
@@ -6,14 +6,13 @@ import {
6
6
  DstAlphaFactor,
7
7
  DstColorFactor,
8
8
  HalfFloatType,
9
- MeshDepthMaterial,
10
9
  MeshNormalMaterial,
11
10
  NearestFilter,
12
11
  NoBlending,
13
- RGBADepthPacking,
14
12
  ShaderMaterial,
15
13
  UniformsUtils,
16
- UnsignedShortType,
14
+ DepthStencilFormat,
15
+ UnsignedInt248Type,
17
16
  Vector2,
18
17
  WebGLRenderTarget,
19
18
  ZeroFactor
@@ -23,7 +22,6 @@ import { SAOShader } from '../shaders/SAOShader.js';
23
22
  import { DepthLimitedBlurShader } from '../shaders/DepthLimitedBlurShader.js';
24
23
  import { BlurShaderUtils } from '../shaders/DepthLimitedBlurShader.js';
25
24
  import { CopyShader } from '../shaders/CopyShader.js';
26
- import { UnpackDepthRGBAShader } from '../shaders/UnpackDepthRGBAShader.js';
27
25
 
28
26
  /**
29
27
  * SAO implementation inspired from bhouston previous SAO work
@@ -31,7 +29,7 @@ import { UnpackDepthRGBAShader } from '../shaders/UnpackDepthRGBAShader.js';
31
29
 
32
30
  class SAOPass extends Pass {
33
31
 
34
- constructor( scene, camera, useDepthTexture = false, useNormals = false, resolution = new Vector2( 256, 256 ) ) {
32
+ constructor( scene, camera, resolution = new Vector2( 256, 256 ) ) {
35
33
 
36
34
  super();
37
35
 
@@ -41,9 +39,6 @@ class SAOPass extends Pass {
41
39
  this.clear = true;
42
40
  this.needsSwap = false;
43
41
 
44
- this.supportsDepthTextureExtension = useDepthTexture;
45
- this.supportsNormalTexture = useNormals;
46
-
47
42
  this.originalClearColor = new Color();
48
43
  this._oldClearColor = new Color();
49
44
  this.oldClearAlpha = 1;
@@ -65,30 +60,17 @@ class SAOPass extends Pass {
65
60
 
66
61
  this.saoRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, { type: HalfFloatType } );
67
62
  this.blurIntermediateRenderTarget = this.saoRenderTarget.clone();
68
- this.beautyRenderTarget = this.saoRenderTarget.clone();
63
+
64
+ const depthTexture = new DepthTexture();
65
+ depthTexture.format = DepthStencilFormat;
66
+ depthTexture.type = UnsignedInt248Type;
69
67
 
70
68
  this.normalRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, {
71
69
  minFilter: NearestFilter,
72
70
  magFilter: NearestFilter,
73
- type: HalfFloatType
71
+ type: HalfFloatType,
72
+ depthTexture: depthTexture
74
73
  } );
75
- this.depthRenderTarget = this.normalRenderTarget.clone();
76
-
77
- let depthTexture;
78
-
79
- if ( this.supportsDepthTextureExtension ) {
80
-
81
- depthTexture = new DepthTexture();
82
- depthTexture.type = UnsignedShortType;
83
-
84
- this.beautyRenderTarget.depthTexture = depthTexture;
85
- this.beautyRenderTarget.depthBuffer = true;
86
-
87
- }
88
-
89
- this.depthMaterial = new MeshDepthMaterial();
90
- this.depthMaterial.depthPacking = RGBADepthPacking;
91
- this.depthMaterial.blending = NoBlending;
92
74
 
93
75
  this.normalMaterial = new MeshNormalMaterial();
94
76
  this.normalMaterial.blending = NoBlending;
@@ -100,10 +82,8 @@ class SAOPass extends Pass {
100
82
  uniforms: UniformsUtils.clone( SAOShader.uniforms )
101
83
  } );
102
84
  this.saoMaterial.extensions.derivatives = true;
103
- this.saoMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;
104
- this.saoMaterial.defines[ 'NORMAL_TEXTURE' ] = this.supportsNormalTexture ? 1 : 0;
105
85
  this.saoMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
106
- this.saoMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;
86
+ this.saoMaterial.uniforms[ 'tDepth' ].value = depthTexture;
107
87
  this.saoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;
108
88
  this.saoMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
109
89
  this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );
@@ -116,10 +96,10 @@ class SAOPass extends Pass {
116
96
  vertexShader: DepthLimitedBlurShader.vertexShader,
117
97
  fragmentShader: DepthLimitedBlurShader.fragmentShader
118
98
  } );
119
- this.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;
99
+ this.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;
120
100
  this.vBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
121
101
  this.vBlurMaterial.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;
122
- this.vBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;
102
+ this.vBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;
123
103
  this.vBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
124
104
  this.vBlurMaterial.blending = NoBlending;
125
105
 
@@ -129,10 +109,10 @@ class SAOPass extends Pass {
129
109
  vertexShader: DepthLimitedBlurShader.vertexShader,
130
110
  fragmentShader: DepthLimitedBlurShader.fragmentShader
131
111
  } );
132
- this.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = this.supportsDepthTextureExtension ? 0 : 1;
112
+ this.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;
133
113
  this.hBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;
134
114
  this.hBlurMaterial.uniforms[ 'tDiffuse' ].value = this.blurIntermediateRenderTarget.texture;
135
- this.hBlurMaterial.uniforms[ 'tDepth' ].value = ( this.supportsDepthTextureExtension ) ? depthTexture : this.depthRenderTarget.texture;
115
+ this.hBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;
136
116
  this.hBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );
137
117
  this.hBlurMaterial.blending = NoBlending;
138
118
 
@@ -153,13 +133,6 @@ class SAOPass extends Pass {
153
133
  this.materialCopy.blendDstAlpha = ZeroFactor;
154
134
  this.materialCopy.blendEquationAlpha = AddEquation;
155
135
 
156
- this.depthCopy = new ShaderMaterial( {
157
- uniforms: UniformsUtils.clone( UnpackDepthRGBAShader.uniforms ),
158
- vertexShader: UnpackDepthRGBAShader.vertexShader,
159
- fragmentShader: UnpackDepthRGBAShader.fragmentShader,
160
- blending: NoBlending
161
- } );
162
-
163
136
  this.fsQuad = new FullScreenQuad( null );
164
137
 
165
138
  }
@@ -176,20 +149,11 @@ class SAOPass extends Pass {
176
149
 
177
150
  }
178
151
 
179
- if ( this.params.output === 1 ) {
180
-
181
- return;
182
-
183
- }
184
-
185
152
  renderer.getClearColor( this._oldClearColor );
186
153
  this.oldClearAlpha = renderer.getClearAlpha();
187
154
  const oldAutoClear = renderer.autoClear;
188
155
  renderer.autoClear = false;
189
156
 
190
- renderer.setRenderTarget( this.depthRenderTarget );
191
- renderer.clear();
192
-
193
157
  this.saoMaterial.uniforms[ 'bias' ].value = this.params.saoBias;
194
158
  this.saoMaterial.uniforms[ 'intensity' ].value = this.params.saoIntensity;
195
159
  this.saoMaterial.uniforms[ 'scale' ].value = this.params.saoScale;
@@ -218,26 +182,8 @@ class SAOPass extends Pass {
218
182
 
219
183
  }
220
184
 
221
- // Rendering scene to depth texture
222
- renderer.setClearColor( 0x000000 );
223
- renderer.setRenderTarget( this.beautyRenderTarget );
224
- renderer.clear();
225
- renderer.render( this.scene, this.camera );
226
-
227
- // Re-render scene if depth texture extension is not supported
228
- if ( ! this.supportsDepthTextureExtension ) {
229
-
230
- // Clear rule : far clipping plane in both RGBA and Basic encoding
231
- this.renderOverride( renderer, this.depthMaterial, this.depthRenderTarget, 0x000000, 1.0 );
232
-
233
- }
234
-
235
- if ( this.supportsNormalTexture ) {
236
-
237
- // Clear rule : default normal is facing the camera
238
- this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );
239
-
240
- }
185
+ // render normal and depth
186
+ this.renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );
241
187
 
242
188
  // Rendering SAO texture
243
189
  this.renderPass( renderer, this.saoMaterial, this.saoRenderTarget, 0xffffff, 1.0 );
@@ -250,24 +196,10 @@ class SAOPass extends Pass {
250
196
 
251
197
  }
252
198
 
253
- let outputMaterial = this.materialCopy;
254
- // Setting up SAO rendering
255
- if ( this.params.output === 3 ) {
256
-
257
- if ( this.supportsDepthTextureExtension ) {
258
-
259
- this.materialCopy.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.depthTexture;
260
- this.materialCopy.needsUpdate = true;
199
+ const outputMaterial = this.materialCopy;
261
200
 
262
- } else {
263
-
264
- this.depthCopy.uniforms[ 'tDiffuse' ].value = this.depthRenderTarget.texture;
265
- this.depthCopy.needsUpdate = true;
266
- outputMaterial = this.depthCopy;
267
-
268
- }
269
-
270
- } else if ( this.params.output === 4 ) {
201
+ // Setting up SAO rendering
202
+ if ( this.params.output === SAOPass.OUTPUT.Normal ) {
271
203
 
272
204
  this.materialCopy.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;
273
205
  this.materialCopy.needsUpdate = true;
@@ -279,8 +211,8 @@ class SAOPass extends Pass {
279
211
 
280
212
  }
281
213
 
282
- // Blending depends on output, only want a CustomBlending when showing SAO
283
- if ( this.params.output === 0 ) {
214
+ // Blending depends on output
215
+ if ( this.params.output === SAOPass.OUTPUT.Default ) {
284
216
 
285
217
  outputMaterial.blending = CustomBlending;
286
218
 
@@ -359,11 +291,9 @@ class SAOPass extends Pass {
359
291
 
360
292
  setSize( width, height ) {
361
293
 
362
- this.beautyRenderTarget.setSize( width, height );
363
294
  this.saoRenderTarget.setSize( width, height );
364
295
  this.blurIntermediateRenderTarget.setSize( width, height );
365
296
  this.normalRenderTarget.setSize( width, height );
366
- this.depthRenderTarget.setSize( width, height );
367
297
 
368
298
  this.saoMaterial.uniforms[ 'size' ].value.set( width, height );
369
299
  this.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );
@@ -382,9 +312,7 @@ class SAOPass extends Pass {
382
312
 
383
313
  this.saoRenderTarget.dispose();
384
314
  this.blurIntermediateRenderTarget.dispose();
385
- this.beautyRenderTarget.dispose();
386
315
  this.normalRenderTarget.dispose();
387
- this.depthRenderTarget.dispose();
388
316
 
389
317
  this.depthMaterial.dispose();
390
318
  this.normalMaterial.dispose();
@@ -392,7 +320,6 @@ class SAOPass extends Pass {
392
320
  this.vBlurMaterial.dispose();
393
321
  this.hBlurMaterial.dispose();
394
322
  this.materialCopy.dispose();
395
- this.depthCopy.dispose();
396
323
 
397
324
  this.fsQuad.dispose();
398
325
 
@@ -401,11 +328,9 @@ class SAOPass extends Pass {
401
328
  }
402
329
 
403
330
  SAOPass.OUTPUT = {
404
- 'Beauty': 1,
405
331
  'Default': 0,
406
- 'SAO': 2,
407
- 'Depth': 3,
408
- 'Normal': 4
332
+ 'SAO': 1,
333
+ 'Normal': 2
409
334
  };
410
335
 
411
336
  export { SAOPass };