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
@@ -32,7 +32,7 @@ import { CopyShader } from '../shaders/CopyShader.js';
32
32
 
33
33
  class SSAOPass extends Pass {
34
34
 
35
- constructor( scene, camera, width, height ) {
35
+ constructor( scene, camera, width, height, kernelSize = 32 ) {
36
36
 
37
37
  super();
38
38
 
@@ -45,7 +45,6 @@ class SSAOPass extends Pass {
45
45
  this.scene = scene;
46
46
 
47
47
  this.kernelRadius = 8;
48
- this.kernelSize = 32;
49
48
  this.kernel = [];
50
49
  this.noiseTexture = null;
51
50
  this.output = 0;
@@ -57,17 +56,15 @@ class SSAOPass extends Pass {
57
56
 
58
57
  //
59
58
 
60
- this.generateSampleKernel();
59
+ this.generateSampleKernel( kernelSize );
61
60
  this.generateRandomKernelRotations();
62
61
 
63
- // beauty render target
62
+ // depth texture
64
63
 
65
64
  const depthTexture = new DepthTexture();
66
65
  depthTexture.format = DepthStencilFormat;
67
66
  depthTexture.type = UnsignedInt248Type;
68
67
 
69
- this.beautyRenderTarget = new WebGLRenderTarget( this.width, this.height, { type: HalfFloatType } );
70
-
71
68
  // normal render target with depth buffer
72
69
 
73
70
  this.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {
@@ -93,7 +90,8 @@ class SSAOPass extends Pass {
93
90
  blending: NoBlending
94
91
  } );
95
92
 
96
- this.ssaoMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;
93
+ this.ssaoMaterial.defines[ 'KERNEL_SIZE' ] = kernelSize;
94
+
97
95
  this.ssaoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;
98
96
  this.ssaoMaterial.uniforms[ 'tDepth' ].value = this.normalRenderTarget.depthTexture;
99
97
  this.ssaoMaterial.uniforms[ 'tNoise' ].value = this.noiseTexture;
@@ -160,7 +158,6 @@ class SSAOPass extends Pass {
160
158
 
161
159
  // dispose render targets
162
160
 
163
- this.beautyRenderTarget.dispose();
164
161
  this.normalRenderTarget.dispose();
165
162
  this.ssaoRenderTarget.dispose();
166
163
  this.blurRenderTarget.dispose();
@@ -178,16 +175,10 @@ class SSAOPass extends Pass {
178
175
 
179
176
  }
180
177
 
181
- render( renderer, writeBuffer /*, readBuffer, deltaTime, maskActive */ ) {
178
+ render( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {
182
179
 
183
180
  if ( renderer.capabilities.isWebGL2 === false ) this.noiseTexture.format = LuminanceFormat;
184
181
 
185
- // render beauty
186
-
187
- renderer.setRenderTarget( this.beautyRenderTarget );
188
- renderer.clear();
189
- renderer.render( this.scene, this.camera );
190
-
191
182
  // render normals and depth (honor only meshes, points and lines do not contribute to SSAO)
192
183
 
193
184
  this.overrideVisibility();
@@ -225,14 +216,6 @@ class SSAOPass extends Pass {
225
216
 
226
217
  break;
227
218
 
228
- case SSAOPass.OUTPUT.Beauty:
229
-
230
- this.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;
231
- this.copyMaterial.blending = NoBlending;
232
- this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
233
-
234
- break;
235
-
236
219
  case SSAOPass.OUTPUT.Depth:
237
220
 
238
221
  this.renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer );
@@ -249,7 +232,7 @@ class SSAOPass extends Pass {
249
232
 
250
233
  case SSAOPass.OUTPUT.Default:
251
234
 
252
- this.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;
235
+ this.copyMaterial.uniforms[ 'tDiffuse' ].value = readBuffer.texture;
253
236
  this.copyMaterial.blending = NoBlending;
254
237
  this.renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
255
238
 
@@ -332,7 +315,6 @@ class SSAOPass extends Pass {
332
315
  this.width = width;
333
316
  this.height = height;
334
317
 
335
- this.beautyRenderTarget.setSize( width, height );
336
318
  this.ssaoRenderTarget.setSize( width, height );
337
319
  this.normalRenderTarget.setSize( width, height );
338
320
  this.blurRenderTarget.setSize( width, height );
@@ -345,9 +327,8 @@ class SSAOPass extends Pass {
345
327
 
346
328
  }
347
329
 
348
- generateSampleKernel() {
330
+ generateSampleKernel( kernelSize ) {
349
331
 
350
- const kernelSize = this.kernelSize;
351
332
  const kernel = this.kernel;
352
333
 
353
334
  for ( let i = 0; i < kernelSize; i ++ ) {
@@ -432,9 +413,8 @@ SSAOPass.OUTPUT = {
432
413
  'Default': 0,
433
414
  'SSAO': 1,
434
415
  'Blur': 2,
435
- 'Beauty': 3,
436
- 'Depth': 4,
437
- 'Normal': 5
416
+ 'Depth': 3,
417
+ 'Normal': 4
438
418
  };
439
419
 
440
420
  export { SSAOPass };
@@ -94,7 +94,7 @@ class UnrealBloomPass extends Pass {
94
94
 
95
95
  this.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );
96
96
 
97
- this.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );
97
+ this.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );
98
98
 
99
99
  resx = Math.round( resx / 2 );
100
100
 
@@ -192,7 +192,7 @@ class UnrealBloomPass extends Pass {
192
192
  this.renderTargetsHorizontal[ i ].setSize( resx, resy );
193
193
  this.renderTargetsVertical[ i ].setSize( resx, resy );
194
194
 
195
- this.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );
195
+ this.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );
196
196
 
197
197
  resx = Math.round( resx / 2 );
198
198
  resy = Math.round( resy / 2 );
@@ -298,17 +298,25 @@ class UnrealBloomPass extends Pass {
298
298
 
299
299
  getSeperableBlurMaterial( kernelRadius ) {
300
300
 
301
+ const coefficients = [];
302
+
303
+ for ( let i = 0; i < kernelRadius; i ++ ) {
304
+
305
+ coefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( kernelRadius * kernelRadius ) ) / kernelRadius );
306
+
307
+ }
308
+
301
309
  return new ShaderMaterial( {
302
310
 
303
311
  defines: {
304
- 'KERNEL_RADIUS': kernelRadius,
305
- 'SIGMA': kernelRadius
312
+ 'KERNEL_RADIUS': kernelRadius
306
313
  },
307
314
 
308
315
  uniforms: {
309
316
  'colorTexture': { value: null },
310
- 'texSize': { value: new Vector2( 0.5, 0.5 ) },
311
- 'direction': { value: new Vector2( 0.5, 0.5 ) }
317
+ 'invSize': { value: new Vector2( 0.5, 0.5 ) }, // inverse texture size
318
+ 'direction': { value: new Vector2( 0.5, 0.5 ) },
319
+ 'gaussianCoefficients': { value: coefficients } // precomputed Gaussian coefficients
312
320
  },
313
321
 
314
322
  vertexShader:
@@ -322,23 +330,19 @@ class UnrealBloomPass extends Pass {
322
330
  `#include <common>
323
331
  varying vec2 vUv;
324
332
  uniform sampler2D colorTexture;
325
- uniform vec2 texSize;
333
+ uniform vec2 invSize;
326
334
  uniform vec2 direction;
335
+ uniform float gaussianCoefficients[KERNEL_RADIUS];
327
336
 
328
- float gaussianPdf(in float x, in float sigma) {
329
- return 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;
330
- }
331
337
  void main() {
332
- vec2 invSize = 1.0 / texSize;
333
- float fSigma = float(SIGMA);
334
- float weightSum = gaussianPdf(0.0, fSigma);
335
- vec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;
338
+ float weightSum = gaussianCoefficients[0];
339
+ vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;
336
340
  for( int i = 1; i < KERNEL_RADIUS; i ++ ) {
337
341
  float x = float(i);
338
- float w = gaussianPdf(x, fSigma);
342
+ float w = gaussianCoefficients[i];
339
343
  vec2 uvOffset = direction * invSize * x;
340
- vec3 sample1 = texture2D( colorTexture, vUv + uvOffset).rgb;
341
- vec3 sample2 = texture2D( colorTexture, vUv - uvOffset).rgb;
344
+ vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
345
+ vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
342
346
  diffuseSum += (sample1 + sample2) * w;
343
347
  weightSum += 2.0 * w;
344
348
  }
@@ -1,7 +1,7 @@
1
1
  let vector2 = null;
2
2
  let vector4 = null;
3
3
 
4
- import { Vector2, Vector4 } from 'three';
4
+ import { Vector2, Vector4, REVISION, createCanvasElement } from 'three';
5
5
 
6
6
  class Backend {
7
7
 
@@ -118,7 +118,12 @@ class Backend {
118
118
 
119
119
  if ( domElement === null ) {
120
120
 
121
- this.domElement = domElement = ( this.parameters.canvas !== undefined ) ? this.parameters.canvas : this.createCanvasElement();
121
+ domElement = ( this.parameters.canvas !== undefined ) ? this.parameters.canvas : createCanvasElement();
122
+
123
+ // OffscreenCanvas does not have setAttribute, see #22811
124
+ if ( 'setAttribute' in domElement ) domElement.setAttribute( 'data-engine', `three.js r${REVISION}` );
125
+
126
+ this.domElement = domElement;
122
127
 
123
128
  }
124
129
 
@@ -126,16 +131,14 @@ class Backend {
126
131
 
127
132
  }
128
133
 
129
- createCanvasElement() {
134
+ // resource properties
135
+
136
+ set( object, value ) {
130
137
 
131
- const canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );
132
- canvas.style.display = 'block';
133
- return canvas;
138
+ this.data.set( object, value );
134
139
 
135
140
  }
136
141
 
137
- // resource properties
138
-
139
142
  get( object ) {
140
143
 
141
144
  let map = this.data.get( object );
@@ -1,6 +1,6 @@
1
1
  import DataMap from './DataMap.js';
2
2
  import { Color, Mesh, SphereGeometry, BackSide } from 'three';
3
- import { context, positionWorldDirection, backgroundBlurriness, MeshBasicNodeMaterial } from '../../nodes/Nodes.js';
3
+ import { vec4, context, normalWorld, backgroundBlurriness, backgroundIntensity, NodeMaterial, modelViewProjection } from '../../nodes/Nodes.js';
4
4
 
5
5
  let _clearAlpha;
6
6
  const _clearColor = new Color();
@@ -14,15 +14,15 @@ class Background extends DataMap {
14
14
  this.renderer = renderer;
15
15
  this.nodes = nodes;
16
16
 
17
- this.boxMesh = null;
18
- this.boxMeshNode = null;
17
+ this.backgroundMesh = null;
18
+ this.backgroundMeshNode = null;
19
19
 
20
20
  }
21
21
 
22
22
  update( scene, renderList, renderContext ) {
23
23
 
24
24
  const renderer = this.renderer;
25
- const background = ( scene.isScene === true ) ? this.nodes.getBackgroundNode( scene ) || scene.background : null;
25
+ const background = this.nodes.getBackgroundNode( scene ) || scene.background;
26
26
 
27
27
  let forceClear = false;
28
28
 
@@ -49,31 +49,33 @@ class Background extends DataMap {
49
49
  _clearColor.copy( renderer._clearColor );
50
50
  _clearAlpha = renderer._clearAlpha;
51
51
 
52
- let boxMesh = this.boxMesh;
52
+ let backgroundMesh = this.backgroundMesh;
53
53
 
54
- if ( boxMesh === null ) {
54
+ if ( backgroundMesh === null ) {
55
55
 
56
- this.boxMeshNode = context( backgroundNode, {
56
+ this.backgroundMeshNode = context( backgroundNode, {
57
57
  // @TODO: Add Texture2D support using node context
58
- getUVNode: () => positionWorldDirection,
58
+ getUVNode: () => normalWorld,
59
59
  getSamplerLevelNode: () => backgroundBlurriness
60
- } );
60
+ } ).mul( backgroundIntensity );
61
61
 
62
- const nodeMaterial = new MeshBasicNodeMaterial();
63
- nodeMaterial.colorNode = this.boxMeshNode;
62
+ let viewProj = modelViewProjection();
63
+ viewProj = vec4( viewProj.x, viewProj.y, viewProj.w, viewProj.w );
64
+
65
+ const nodeMaterial = new NodeMaterial();
66
+ nodeMaterial.outputNode = this.backgroundMeshNode;
64
67
  nodeMaterial.side = BackSide;
65
68
  nodeMaterial.depthTest = false;
66
69
  nodeMaterial.depthWrite = false;
67
70
  nodeMaterial.fog = false;
71
+ nodeMaterial.vertexNode = viewProj;
68
72
 
69
- this.boxMesh = boxMesh = new Mesh( new SphereGeometry( 1, 32, 32 ), nodeMaterial );
70
- boxMesh.frustumCulled = false;
71
-
72
- boxMesh.onBeforeRender = function ( renderer, scene, camera ) {
73
+ this.backgroundMesh = backgroundMesh = new Mesh( new SphereGeometry( 1, 32, 32 ), nodeMaterial );
74
+ backgroundMesh.frustumCulled = false;
73
75
 
74
- const scale = camera.far;
76
+ backgroundMesh.onBeforeRender = function ( renderer, scene, camera ) {
75
77
 
76
- this.matrixWorld.makeScale( scale, scale, scale ).copyPosition( camera.matrixWorld );
78
+ this.matrixWorld.copyPosition( camera.matrixWorld );
77
79
 
78
80
  };
79
81
 
@@ -83,15 +85,15 @@ class Background extends DataMap {
83
85
 
84
86
  if ( sceneData.backgroundCacheKey !== backgroundCacheKey ) {
85
87
 
86
- this.boxMeshNode.node = backgroundNode;
88
+ this.backgroundMeshNode.node = backgroundNode;
87
89
 
88
- boxMesh.material.needsUpdate = true;
90
+ backgroundMesh.material.needsUpdate = true;
89
91
 
90
92
  sceneData.backgroundCacheKey = backgroundCacheKey;
91
93
 
92
94
  }
93
95
 
94
- renderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );
96
+ renderList.unshift( backgroundMesh, backgroundMesh.geometry, backgroundMesh.material, 0, 0, null );
95
97
 
96
98
  } else {
97
99
 
@@ -4,6 +4,20 @@ class Binding {
4
4
 
5
5
  this.name = name;
6
6
 
7
+ this.visibility = 0;
8
+
9
+ }
10
+
11
+ setVisibility( visibility ) {
12
+
13
+ this.visibility |= visibility;
14
+
15
+ }
16
+
17
+ clone() {
18
+
19
+ return Object.assign( new this.constructor(), this );
20
+
7
21
  }
8
22
 
9
23
  }
@@ -34,9 +34,7 @@ class Bindings extends DataMap {
34
34
 
35
35
  this._init( bindings );
36
36
 
37
- const pipeline = this.pipelines.getForRender( renderObject );
38
-
39
- this.backend.createBindings( bindings, pipeline );
37
+ this.backend.createBindings( bindings );
40
38
 
41
39
  }
42
40
 
@@ -58,9 +56,7 @@ class Bindings extends DataMap {
58
56
 
59
57
  this._init( bindings );
60
58
 
61
- const pipeline = this.pipelines.getForCompute( computeNode );
62
-
63
- this.backend.createBindings( bindings, pipeline );
59
+ this.backend.createBindings( bindings );
64
60
 
65
61
  }
66
62
 
@@ -84,9 +80,11 @@ class Bindings extends DataMap {
84
80
 
85
81
  for ( const binding of bindings ) {
86
82
 
87
- if ( binding.isSampler || binding.isSampledTexture ) {
83
+ if ( binding.isSampledTexture ) {
84
+
85
+ const store = binding.store === true;
88
86
 
89
- this.textures.updateTexture( binding.texture );
87
+ this.textures.updateTexture( binding.texture, { store } );
90
88
 
91
89
  } else if ( binding.isStorageBuffer ) {
92
90
 
@@ -113,10 +111,9 @@ class Bindings extends DataMap {
113
111
 
114
112
  for ( const binding of bindings ) {
115
113
 
116
- const isShared = binding.isShared;
117
114
  const isUpdated = updateMap.get( binding ) === frame;
118
115
 
119
- if ( isShared && isUpdated ) continue;
116
+ if ( isUpdated ) continue;
120
117
 
121
118
  if ( binding.isUniformBuffer ) {
122
119
 
@@ -88,7 +88,7 @@ class Geometries extends DataMap {
88
88
 
89
89
  }
90
90
 
91
- update( renderObject ) {
91
+ updateForRender( renderObject ) {
92
92
 
93
93
  if ( this.has( renderObject ) === false ) this.initGeometry( renderObject );
94
94