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
@@ -23,17 +23,22 @@ class Pipelines extends DataMap {
23
23
 
24
24
  }
25
25
 
26
- getForCompute( computeNode ) {
26
+ getForCompute( computeNode, bindings ) {
27
27
 
28
28
  const { backend } = this;
29
29
 
30
30
  const data = this.get( computeNode );
31
31
 
32
- if ( data.pipeline === undefined ) {
32
+ if ( this._needsComputeUpdate( computeNode ) ) {
33
33
 
34
- // release previous cache
34
+ const previousPipeline = data.pipeline;
35
35
 
36
- const previousPipeline = this._releasePipeline( computeNode );
36
+ if ( previousPipeline ) {
37
+
38
+ previousPipeline.usedTimes --;
39
+ previousPipeline.computeProgram.usedTimes --;
40
+
41
+ }
37
42
 
38
43
  // get shader
39
44
 
@@ -45,7 +50,7 @@ class Pipelines extends DataMap {
45
50
 
46
51
  if ( stageCompute === undefined ) {
47
52
 
48
- if ( previousPipeline ) this._releaseProgram( previousPipeline.computeShader );
53
+ if ( previousPipeline && previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram );
49
54
 
50
55
  stageCompute = new ProgrammableStage( nodeBuilder.computeShader, 'compute' );
51
56
  this.programs.compute.set( nodeBuilder.computeShader, stageCompute );
@@ -56,7 +61,17 @@ class Pipelines extends DataMap {
56
61
 
57
62
  // determine compute pipeline
58
63
 
59
- const pipeline = this._getComputePipeline( stageCompute );
64
+ const cacheKey = this._getComputeCacheKey( computeNode, stageCompute );
65
+
66
+ let pipeline = this.caches.get( cacheKey );
67
+
68
+ if ( pipeline === undefined ) {
69
+
70
+ if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( computeNode );
71
+
72
+ pipeline = this._getComputePipeline( computeNode, stageCompute, cacheKey, bindings );
73
+
74
+ }
60
75
 
61
76
  // keep track of all used times
62
77
 
@@ -65,6 +80,7 @@ class Pipelines extends DataMap {
65
80
 
66
81
  //
67
82
 
83
+ data.version = computeNode.version;
68
84
  data.pipeline = pipeline;
69
85
 
70
86
  }
@@ -79,11 +95,17 @@ class Pipelines extends DataMap {
79
95
 
80
96
  const data = this.get( renderObject );
81
97
 
82
- if ( this._needsUpdate( renderObject ) ) {
98
+ if ( this._needsRenderUpdate( renderObject ) ) {
99
+
100
+ const previousPipeline = data.pipeline;
83
101
 
84
- // release previous cache
102
+ if ( previousPipeline ) {
85
103
 
86
- const previousPipeline = this._releasePipeline( renderObject );
104
+ previousPipeline.usedTimes --;
105
+ previousPipeline.vertexProgram.usedTimes --;
106
+ previousPipeline.fragmentProgram.usedTimes --;
107
+
108
+ }
87
109
 
88
110
  // get shader
89
111
 
@@ -95,7 +117,7 @@ class Pipelines extends DataMap {
95
117
 
96
118
  if ( stageVertex === undefined ) {
97
119
 
98
- if ( previousPipeline ) this._releaseProgram( previousPipeline.vertexProgram );
120
+ if ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );
99
121
 
100
122
  stageVertex = new ProgrammableStage( nodeBuilder.vertexShader, 'vertex' );
101
123
  this.programs.vertex.set( nodeBuilder.vertexShader, stageVertex );
@@ -108,7 +130,7 @@ class Pipelines extends DataMap {
108
130
 
109
131
  if ( stageFragment === undefined ) {
110
132
 
111
- if ( previousPipeline ) this._releaseProgram( previousPipeline.fragmentShader );
133
+ if ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );
112
134
 
113
135
  stageFragment = new ProgrammableStage( nodeBuilder.fragmentShader, 'fragment' );
114
136
  this.programs.fragment.set( nodeBuilder.fragmentShader, stageFragment );
@@ -119,7 +141,21 @@ class Pipelines extends DataMap {
119
141
 
120
142
  // determine render pipeline
121
143
 
122
- const pipeline = this._getRenderPipeline( renderObject, stageVertex, stageFragment );
144
+ const cacheKey = this._getRenderCacheKey( renderObject, stageVertex, stageFragment );
145
+
146
+ let pipeline = this.caches.get( cacheKey );
147
+
148
+ if ( pipeline === undefined ) {
149
+
150
+ if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
151
+
152
+ pipeline = this._getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey );
153
+
154
+ } else {
155
+
156
+ renderObject.pipeline = pipeline;
157
+
158
+ }
123
159
 
124
160
  // keep track of all used times
125
161
 
@@ -139,18 +175,31 @@ class Pipelines extends DataMap {
139
175
 
140
176
  delete( object ) {
141
177
 
142
- const pipeline = this._releasePipeline( object );
178
+ const pipeline = this.get( object ).pipeline;
179
+
180
+ if ( pipeline ) {
181
+
182
+ // pipeline
183
+
184
+ pipeline.usedTimes --;
143
185
 
144
- if ( pipeline && pipeline.usedTimes === 0 ) {
186
+ if ( pipeline.usedTimes === 0 ) this._releasePipeline( pipeline );
187
+
188
+ // programs
145
189
 
146
190
  if ( pipeline.isComputePipeline ) {
147
191
 
148
- this._releaseProgram( pipeline.computeProgram );
192
+ pipeline.computeProgram.usedTimes --;
193
+
194
+ if ( pipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( pipeline.computeProgram );
149
195
 
150
196
  } else {
151
197
 
152
- this._releaseProgram( pipeline.vertexProgram );
153
- this._releaseProgram( pipeline.fragmentProgram );
198
+ pipeline.fragmentProgram.usedTimes --;
199
+ pipeline.vertexProgram.usedTimes --;
200
+
201
+ if ( pipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( pipeline.vertexProgram );
202
+ if ( pipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( pipeline.fragmentProgram );
154
203
 
155
204
  }
156
205
 
@@ -173,11 +222,17 @@ class Pipelines extends DataMap {
173
222
 
174
223
  }
175
224
 
176
- _getComputePipeline( stageCompute ) {
225
+ updateForRender( renderObject ) {
226
+
227
+ this.getForRender( renderObject );
228
+
229
+ }
230
+
231
+ _getComputePipeline( computeNode, stageCompute, cacheKey, bindings ) {
177
232
 
178
233
  // check for existing pipeline
179
234
 
180
- const cacheKey = 'compute:' + stageCompute.id;
235
+ cacheKey = cacheKey || this._getComputeCacheKey( computeNode, stageCompute );
181
236
 
182
237
  let pipeline = this.caches.get( cacheKey );
183
238
 
@@ -187,7 +242,7 @@ class Pipelines extends DataMap {
187
242
 
188
243
  this.caches.set( cacheKey, pipeline );
189
244
 
190
- this.backend.createComputePipeline( pipeline );
245
+ this.backend.createComputePipeline( pipeline, bindings );
191
246
 
192
247
  }
193
248
 
@@ -195,11 +250,11 @@ class Pipelines extends DataMap {
195
250
 
196
251
  }
197
252
 
198
- _getRenderPipeline( renderObject, stageVertex, stageFragment ) {
253
+ _getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey ) {
199
254
 
200
255
  // check for existing pipeline
201
256
 
202
- const cacheKey = this._getRenderCacheKey( renderObject, stageVertex, stageFragment );
257
+ cacheKey = cacheKey || this._getRenderCacheKey( renderObject, stageVertex, stageFragment );
203
258
 
204
259
  let pipeline = this.caches.get( cacheKey );
205
260
 
@@ -213,15 +268,15 @@ class Pipelines extends DataMap {
213
268
 
214
269
  this.backend.createRenderPipeline( renderObject );
215
270
 
216
- } else {
271
+ }
217
272
 
218
- // assign a shared pipeline to renderObject
273
+ return pipeline;
219
274
 
220
- renderObject.pipeline = pipeline;
275
+ }
221
276
 
222
- }
277
+ _getComputeCacheKey( computeNode, stageCompute ) {
223
278
 
224
- return pipeline;
279
+ return 'compute' + computeNode.id + stageCompute.id;
225
280
 
226
281
  }
227
282
 
@@ -247,36 +302,30 @@ class Pipelines extends DataMap {
247
302
 
248
303
  }
249
304
 
250
- _releasePipeline( object ) {
251
-
252
- const pipeline = this.get( object ).pipeline;
305
+ _releasePipeline( pipeline ) {
253
306
 
254
- //this.bindings.delete( object );
307
+ this.caches.delete( pipeline.cacheKey );
255
308
 
256
- if ( pipeline && -- pipeline.usedTimes === 0 ) {
309
+ }
257
310
 
258
- this.caches.delete( pipeline.cacheKey );
311
+ _releaseProgram( program ) {
259
312
 
260
- }
313
+ const code = program.code;
314
+ const stage = program.stage;
261
315
 
262
- return pipeline;
316
+ this.programs[ stage ].delete( code );
263
317
 
264
318
  }
265
319
 
266
- _releaseProgram( program ) {
267
-
268
- if ( -- program.usedTimes === 0 ) {
320
+ _needsComputeUpdate( computeNode ) {
269
321
 
270
- const code = program.code;
271
- const stage = program.stage;
272
-
273
- this.programs[ stage ].delete( code );
322
+ const data = this.get( computeNode );
274
323
 
275
- }
324
+ return data.pipeline === undefined || data.version !== computeNode.version;
276
325
 
277
326
  }
278
327
 
279
- _needsUpdate( renderObject ) {
328
+ _needsRenderUpdate( renderObject ) {
280
329
 
281
330
  const data = this.get( renderObject );
282
331
  const material = renderObject.material;
@@ -294,7 +343,7 @@ class Pipelines extends DataMap {
294
343
  data.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc ||
295
344
  data.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass ||
296
345
  data.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask ||
297
- data.side !== material.side
346
+ data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage
298
347
  ) {
299
348
 
300
349
  data.material = material; data.materialVersion = material.version;
@@ -306,13 +355,13 @@ class Pipelines extends DataMap {
306
355
  data.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc;
307
356
  data.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass;
308
357
  data.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask;
309
- data.side = material.side;
358
+ data.side = material.side; data.alphaToCoverage = material.alphaToCoverage;
310
359
 
311
360
  needsUpdate = true;
312
361
 
313
362
  }
314
363
 
315
- return needsUpdate || data.pipeline !== undefined;
364
+ return needsUpdate || data.pipeline === undefined;
316
365
 
317
366
  }
318
367
 
@@ -29,6 +29,7 @@ class RenderContext {
29
29
  this.texture = null;
30
30
  this.depthTexture = null;
31
31
  this.activeCubeFace = 0;
32
+ this.sampleCount = 1;
32
33
 
33
34
  }
34
35
 
@@ -5,31 +5,67 @@ class RenderContexts {
5
5
 
6
6
  constructor() {
7
7
 
8
- this.renderStates = new ChainMap();
8
+ this.chainMaps = {};
9
9
 
10
10
  }
11
11
 
12
- get( scene, camera ) {
12
+ get( scene, camera, renderTarget = null ) {
13
13
 
14
14
  const chainKey = [ scene, camera ];
15
15
 
16
- let renderState = this.renderStates.get( chainKey );
16
+ let attachmentState;
17
+
18
+ if ( renderTarget === null ) {
19
+
20
+ attachmentState = 'default';
21
+
22
+ } else {
23
+
24
+ let format, count;
25
+
26
+ if ( renderTarget.isWebGLMultipleRenderTargets ) {
27
+
28
+ format = renderTarget.texture[ 0 ].format;
29
+ count = renderTarget.texture.length;
30
+
31
+ } else {
32
+
33
+ format = renderTarget.texture.format;
34
+ count = 1;
35
+
36
+ }
37
+
38
+ attachmentState = `${count}:${format}:${renderTarget.samples}:${renderTarget.depthBuffer}:${renderTarget.stencilBuffer}`;
39
+
40
+ }
41
+
42
+ const chainMap = this.getChainMap( attachmentState );
43
+
44
+ let renderState = chainMap.get( chainKey );
17
45
 
18
46
  if ( renderState === undefined ) {
19
47
 
20
48
  renderState = new RenderContext();
21
49
 
22
- this.renderStates.set( chainKey, renderState );
50
+ chainMap.set( chainKey, renderState );
23
51
 
24
52
  }
25
53
 
54
+ if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
55
+
26
56
  return renderState;
27
57
 
28
58
  }
29
59
 
60
+ getChainMap( attachmentState ) {
61
+
62
+ return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
63
+
64
+ }
65
+
30
66
  dispose() {
31
67
 
32
- this.renderStates = new ChainMap();
68
+ this.chainMaps = {};
33
69
 
34
70
  }
35
71
 
@@ -1,4 +1,4 @@
1
- import { lights } from '../../nodes/Nodes.js';
1
+ import { LightsNode } from '../../nodes/Nodes.js';
2
2
 
3
3
  function painterSortStable( a, b ) {
4
4
 
@@ -58,12 +58,14 @@ class RenderList {
58
58
  this.opaque = [];
59
59
  this.transparent = [];
60
60
 
61
- this.lightsNode = lights( [] );
61
+ this.lightsNode = new LightsNode( [] );
62
62
  this.lightsArray = [];
63
63
 
64
+ this.occlusionQueryCount = 0;
65
+
64
66
  }
65
67
 
66
- init() {
68
+ begin() {
67
69
 
68
70
  this.renderItemsIndex = 0;
69
71
 
@@ -71,6 +73,8 @@ class RenderList {
71
73
  this.transparent.length = 0;
72
74
  this.lightsArray.length = 0;
73
75
 
76
+ this.occlusionQueryCount = 0;
77
+
74
78
  return this;
75
79
 
76
80
  }
@@ -117,6 +121,8 @@ class RenderList {
117
121
 
118
122
  const renderItem = this.getNextRenderItem( object, geometry, material, groupOrder, z, group );
119
123
 
124
+ if ( object.occlusionTest === true ) this.occlusionQueryCount ++;
125
+
120
126
  ( material.transparent === true ? this.transparent : this.opaque ).push( renderItem );
121
127
 
122
128
  }
@@ -166,7 +172,9 @@ class RenderList {
166
172
  renderItem.object = null;
167
173
  renderItem.geometry = null;
168
174
  renderItem.material = null;
169
- renderItem.program = null;
175
+ renderItem.groupOrder = null;
176
+ renderItem.renderOrder = null;
177
+ renderItem.z = null;
170
178
  renderItem.group = null;
171
179
 
172
180
  }
@@ -2,7 +2,7 @@ let id = 0;
2
2
 
3
3
  export default class RenderObject {
4
4
 
5
- constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode ) {
5
+ constructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext ) {
6
6
 
7
7
  this._nodes = nodes;
8
8
  this._geometries = geometries;
@@ -15,18 +15,23 @@ export default class RenderObject {
15
15
  this.scene = scene;
16
16
  this.camera = camera;
17
17
  this.lightsNode = lightsNode;
18
+ this.context = renderContext;
18
19
 
19
20
  this.geometry = object.geometry;
20
21
 
21
22
  this.attributes = null;
22
- this.context = null;
23
23
  this.pipeline = null;
24
+ this.vertexBuffers = null;
24
25
 
26
+ this._nodeBuilder = null;
27
+ this._bindings = null;
25
28
  this._materialVersion = - 1;
26
29
  this._materialCacheKey = '';
27
30
 
28
31
  this.onDispose = null;
29
32
 
33
+ this.isRenderObject = true;
34
+
30
35
  this.onMaterialDispose = () => {
31
36
 
32
37
  this.dispose();
@@ -39,13 +44,13 @@ export default class RenderObject {
39
44
 
40
45
  getNodeBuilder() {
41
46
 
42
- return this._nodes.getForRender( this );
47
+ return this._nodeBuilder || ( this._nodeBuilder = this._nodes.getForRender( this ) );
43
48
 
44
49
  }
45
50
 
46
51
  getBindings() {
47
52
 
48
- return this.getNodeBuilder().getBindings();
53
+ return this._bindings || ( this._bindings = this.getNodeBuilder().createBindings() );
49
54
 
50
55
  }
51
56
 
@@ -57,7 +62,7 @@ export default class RenderObject {
57
62
 
58
63
  getChainArray() {
59
64
 
60
- return [ this.object, this.material, this.scene, this.camera, this.lightsNode ];
65
+ return [ this.object, this.material, this.context, this.lightsNode ];
61
66
 
62
67
  }
63
68
 
@@ -69,19 +74,34 @@ export default class RenderObject {
69
74
  const geometry = this.geometry;
70
75
 
71
76
  const attributes = [];
77
+ const vertexBuffers = new Set();
72
78
 
73
79
  for ( const nodeAttribute of nodeAttributes ) {
74
80
 
75
- attributes.push( nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name ) );
81
+ const attribute = nodeAttribute.node && nodeAttribute.node.attribute ? nodeAttribute.node.attribute : geometry.getAttribute( nodeAttribute.name );
82
+
83
+ attributes.push( attribute );
84
+
85
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
86
+ vertexBuffers.add( bufferAttribute );
76
87
 
77
88
  }
78
89
 
79
90
  this.attributes = attributes;
91
+ this.vertexBuffers = Array.from( vertexBuffers.values() );
80
92
 
81
93
  return attributes;
82
94
 
83
95
  }
84
96
 
97
+ getVertexBuffers() {
98
+
99
+ if ( this.vertexBuffers === null ) this.getAttributes();
100
+
101
+ return this.vertexBuffers;
102
+
103
+ }
104
+
85
105
  getCacheKey() {
86
106
 
87
107
  const { material, scene, lightsNode } = this;
@@ -4,12 +4,13 @@ import RenderObject from './RenderObject.js';
4
4
 
5
5
  class RenderObjects {
6
6
 
7
- constructor( renderer, nodes, geometries, pipelines, info ) {
7
+ constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
8
8
 
9
9
  this.renderer = renderer;
10
10
  this.nodes = nodes;
11
11
  this.geometries = geometries;
12
12
  this.pipelines = pipelines;
13
+ this.bindings = bindings;
13
14
  this.info = info;
14
15
 
15
16
  this.chainMaps = {};
@@ -17,16 +18,16 @@ class RenderObjects {
17
18
 
18
19
  }
19
20
 
20
- get( object, material, scene, camera, lightsNode, passId ) {
21
+ get( object, material, scene, camera, lightsNode, renderContext, passId ) {
21
22
 
22
23
  const chainMap = this.getChainMap( passId );
23
- const chainArray = [ object, material, scene, camera, lightsNode ];
24
+ const chainArray = [ object, material, renderContext, lightsNode ];
24
25
 
25
26
  let renderObject = chainMap.get( chainArray );
26
27
 
27
28
  if ( renderObject === undefined ) {
28
29
 
29
- renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
30
+ renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, passId );
30
31
 
31
32
  chainMap.set( chainArray, renderObject );
32
33
 
@@ -39,7 +40,7 @@ class RenderObjects {
39
40
 
40
41
  renderObject.dispose();
41
42
 
42
- renderObject = this.get( object, material, scene, camera, lightsNode );
43
+ renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
43
44
 
44
45
  }
45
46
 
@@ -62,11 +63,12 @@ class RenderObjects {
62
63
 
63
64
  }
64
65
 
65
- createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
66
+ createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
66
67
 
67
68
  const chainMap = this.getChainMap( passId );
68
69
  const dataMap = this.dataMap;
69
- const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode );
70
+
71
+ const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
70
72
 
71
73
  const data = dataMap.get( renderObject );
72
74
  data.cacheKey = renderObject.getCacheKey();
@@ -76,6 +78,7 @@ class RenderObjects {
76
78
  dataMap.delete( renderObject );
77
79
 
78
80
  this.pipelines.delete( renderObject );
81
+ this.bindings.delete( renderObject );
79
82
  this.nodes.delete( renderObject );
80
83
 
81
84
  chainMap.delete( renderObject.getChainArray() );