super-three 0.155.0 → 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 (108) hide show
  1. package/build/three.cjs +107 -125
  2. package/build/three.js +107 -125
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +104 -126
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +13 -5
  7. package/examples/jsm/csm/CSMShader.js +35 -1
  8. package/examples/jsm/libs/tween.module.js +790 -735
  9. package/examples/jsm/libs/utif.module.js +1644 -1558
  10. package/examples/jsm/loaders/DDSLoader.js +46 -3
  11. package/examples/jsm/loaders/EXRLoader.js +4 -4
  12. package/examples/jsm/loaders/FBXLoader.js +2 -0
  13. package/examples/jsm/loaders/GLTFLoader.js +17 -7
  14. package/examples/jsm/loaders/KTX2Loader.js +126 -77
  15. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  16. package/examples/jsm/loaders/MMDLoader.js +10 -7
  17. package/examples/jsm/loaders/RGBELoader.js +48 -66
  18. package/examples/jsm/loaders/STLLoader.js +7 -0
  19. package/examples/jsm/nodes/Nodes.js +3 -0
  20. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +28 -2
  21. package/examples/jsm/nodes/accessors/CubeTextureNode.js +18 -3
  22. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +2 -4
  23. package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
  24. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -33
  25. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
  26. package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
  27. package/examples/jsm/nodes/accessors/TextureNode.js +6 -2
  28. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  29. package/examples/jsm/nodes/core/AttributeNode.js +2 -2
  30. package/examples/jsm/nodes/core/Node.js +17 -1
  31. package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
  32. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  33. package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
  34. package/examples/jsm/nodes/core/PropertyNode.js +2 -0
  35. package/examples/jsm/nodes/core/StackNode.js +4 -4
  36. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  37. package/examples/jsm/nodes/display/ViewportNode.js +19 -5
  38. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  39. package/examples/jsm/nodes/materials/Materials.js +1 -0
  40. package/examples/jsm/nodes/materials/NodeMaterial.js +12 -3
  41. package/examples/jsm/nodes/math/HashNode.js +35 -0
  42. package/examples/jsm/nodes/shadernode/ShaderNode.js +4 -0
  43. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  44. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  45. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  46. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  47. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  48. package/examples/jsm/renderers/common/Backend.js +11 -8
  49. package/examples/jsm/renderers/common/Binding.js +6 -0
  50. package/examples/jsm/renderers/common/Bindings.js +5 -4
  51. package/examples/jsm/renderers/common/Pipelines.js +2 -2
  52. package/examples/jsm/renderers/common/RenderContexts.js +26 -1
  53. package/examples/jsm/renderers/common/RenderList.js +12 -4
  54. package/examples/jsm/renderers/common/RenderObject.js +6 -2
  55. package/examples/jsm/renderers/common/Renderer.js +12 -3
  56. package/examples/jsm/renderers/common/SampledTexture.js +2 -1
  57. package/examples/jsm/renderers/common/Sampler.js +1 -1
  58. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  59. package/examples/jsm/renderers/common/Textures.js +155 -15
  60. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
  61. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
  62. package/examples/jsm/renderers/common/nodes/Nodes.js +43 -9
  63. package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
  64. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
  65. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  66. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  67. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  68. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
  69. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  70. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  71. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
  72. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +279 -40
  73. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  74. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +89 -59
  75. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  76. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
  77. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -9
  78. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +26 -135
  79. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
  80. package/examples/jsm/shaders/FilmShader.js +11 -54
  81. package/examples/jsm/shaders/SAOShader.js +0 -13
  82. package/examples/jsm/shaders/SSAOShader.js +33 -26
  83. package/package.json +1 -1
  84. package/src/Three.js +1 -0
  85. package/src/audio/Audio.js +6 -0
  86. package/src/constants.js +4 -1
  87. package/src/core/Object3D.js +1 -14
  88. package/src/core/UniformsGroup.js +2 -2
  89. package/src/loaders/DataTextureLoader.js +0 -2
  90. package/src/materials/Material.js +2 -2
  91. package/src/math/Vector2.js +2 -2
  92. package/src/math/Vector3.js +3 -3
  93. package/src/math/Vector4.js +4 -4
  94. package/src/objects/Line.js +1 -1
  95. package/src/objects/Mesh.js +1 -1
  96. package/src/objects/Points.js +1 -1
  97. package/src/renderers/WebGLRenderer.js +21 -49
  98. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  99. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  100. package/src/renderers/webgl/WebGLBackground.js +5 -14
  101. package/src/renderers/webgl/WebGLProgram.js +2 -0
  102. package/src/renderers/webgl/WebGLPrograms.js +5 -1
  103. package/src/renderers/webgl/WebGLTextures.js +4 -4
  104. package/src/renderers/webgl/WebGLUtils.js +27 -20
  105. package/src/textures/Texture.js +2 -2
  106. package/src/utils.js +9 -1
  107. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
  108. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
@@ -0,0 +1,607 @@
1
+ import { WebGLCoordinateSystem } from 'three';
2
+
3
+ import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
4
+ import Backend from '../common/Backend.js';
5
+
6
+ import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
7
+ import WebGLState from './utils/WebGLState.js';
8
+ import WebGLUtils from './utils/WebGLUtils.js';
9
+ import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
10
+ import WebGLExtensions from './utils/WebGLExtensions.js';
11
+
12
+ //
13
+
14
+ class WebGLBackend extends Backend {
15
+
16
+ constructor( parameters = {} ) {
17
+
18
+ super( parameters );
19
+
20
+ }
21
+
22
+ async init( renderer ) {
23
+
24
+ await super.init( renderer );
25
+
26
+ //
27
+
28
+ const parameters = this.parameters;
29
+
30
+ const glContext = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgl2' );
31
+
32
+ this.gl = glContext;
33
+
34
+ this.extensions = new WebGLExtensions( this );
35
+ this.attributeUtils = new WebGLAttributeUtils( this );
36
+ this.textureUtils = new WebGLTextureUtils( this );
37
+ this.state = new WebGLState( this );
38
+ this.utils = new WebGLUtils( this );
39
+ this.defaultTextures = {};
40
+
41
+ this.extensions.get( 'EXT_color_buffer_float' );
42
+
43
+ }
44
+
45
+ get coordinateSystem() {
46
+
47
+ return WebGLCoordinateSystem;
48
+
49
+ }
50
+
51
+ beginRender( renderContext ) {
52
+
53
+ const { gl } = this;
54
+
55
+ //
56
+
57
+ let clear = 0;
58
+
59
+ if ( renderContext.clearColor ) clear |= gl.COLOR_BUFFER_BIT;
60
+ if ( renderContext.clearDepth ) clear |= gl.DEPTH_BUFFER_BIT;
61
+ if ( renderContext.clearStencil ) clear |= gl.STENCIL_BUFFER_BIT;
62
+
63
+ const clearColor = renderContext.clearColorValue;
64
+
65
+ gl.clearColor( clearColor.x, clearColor.y, clearColor.z, clearColor.a );
66
+ gl.clear( clear );
67
+
68
+ //
69
+
70
+ if ( renderContext.viewport ) {
71
+
72
+ this.updateViewport( renderContext );
73
+
74
+ } else {
75
+
76
+ gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
77
+
78
+ }
79
+
80
+ }
81
+
82
+ finishRender( /*renderContext*/ ) {
83
+
84
+ //console.warn( 'Abstract class.' );
85
+
86
+ }
87
+
88
+ updateViewport( renderContext ) {
89
+
90
+ const gl = this.gl;
91
+ const { x, y, width, height } = renderContext.viewportValue;
92
+
93
+ gl.viewport( x, y, width, height );
94
+
95
+ }
96
+
97
+ clear( /*renderContext, color, depth, stencil*/ ) {
98
+
99
+ console.warn( 'Abstract class.' );
100
+
101
+ }
102
+
103
+ beginCompute( /*computeGroup*/ ) {
104
+
105
+ console.warn( 'Abstract class.' );
106
+
107
+ }
108
+
109
+ compute( /*computeGroup, computeNode, bindings, pipeline*/ ) {
110
+
111
+ console.warn( 'Abstract class.' );
112
+
113
+ }
114
+
115
+ finishCompute( /*computeGroup*/ ) {
116
+
117
+ console.warn( 'Abstract class.' );
118
+
119
+ }
120
+
121
+ draw( renderObject, info ) {
122
+
123
+ const { pipeline, material } = renderObject;
124
+ const { programGPU, vaoGPU } = this.get( pipeline );
125
+
126
+ const { gl, state } = this;
127
+
128
+ //
129
+
130
+ const bindings = renderObject.getBindings();
131
+
132
+ for ( const binding of bindings ) {
133
+
134
+ const bindingData = this.get( binding );
135
+ const index = bindingData.index;
136
+
137
+ if ( binding.isUniformsGroup ) {
138
+
139
+ gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
140
+
141
+ } else if ( binding.isSampledTexture ) {
142
+
143
+ gl.activeTexture( gl.TEXTURE0 + index );
144
+ gl.bindTexture( bindingData.glTextureType, bindingData.textureGPU );
145
+
146
+ }
147
+
148
+ }
149
+
150
+ state.setMaterial( material );
151
+
152
+ gl.useProgram( programGPU );
153
+ gl.bindVertexArray( vaoGPU );
154
+
155
+ //
156
+
157
+ const index = renderObject.getIndex();
158
+
159
+ const object = renderObject.object;
160
+ const geometry = renderObject.geometry;
161
+ const drawRange = geometry.drawRange;
162
+ const firstVertex = drawRange.start;
163
+
164
+ //
165
+
166
+ let mode;
167
+ if ( object.isPoints ) mode = gl.POINTS;
168
+ else if ( object.isLine ) mode = gl.LINES;
169
+ else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
170
+ else if ( object.isLineSegments ) mode = gl.LINES;
171
+ else mode = gl.TRIANGLES;
172
+
173
+ //
174
+
175
+
176
+ if ( index !== null ) {
177
+
178
+ const indexData = this.get( index );
179
+
180
+ const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
181
+
182
+ gl.drawElements( mode, index.count, indexData.type, firstVertex );
183
+
184
+ info.update( object, indexCount, 1 );
185
+
186
+ } else {
187
+
188
+ const positionAttribute = geometry.attributes.position;
189
+ const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
190
+
191
+
192
+ gl.drawArrays( mode, 0, vertexCount );
193
+ //gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
194
+
195
+ info.update( object, vertexCount, 1 );
196
+
197
+ }
198
+
199
+
200
+
201
+ //
202
+
203
+ gl.bindVertexArray( null );
204
+
205
+ }
206
+
207
+ needsUpdate( renderObject ) {
208
+
209
+ return false;
210
+
211
+ }
212
+
213
+ getCacheKey( renderObject ) {
214
+
215
+ return '';
216
+
217
+ }
218
+
219
+ // textures
220
+
221
+ createSampler( /*texture*/ ) {
222
+
223
+ //console.warn( 'Abstract class.' );
224
+
225
+ }
226
+
227
+ destroySampler( /*texture*/ ) {
228
+
229
+ console.warn( 'Abstract class.' );
230
+
231
+ }
232
+
233
+ createDefaultTexture( texture ) {
234
+
235
+ const { gl, textureUtils, defaultTextures } = this;
236
+
237
+ const glTextureType = textureUtils.getGLTextureType( texture );
238
+
239
+ let textureGPU = defaultTextures[ glTextureType ];
240
+
241
+ if ( textureGPU === undefined ) {
242
+
243
+ textureGPU = gl.createTexture();
244
+
245
+ gl.bindTexture( glTextureType, textureGPU );
246
+ gl.texParameteri( glTextureType, gl.TEXTURE_MIN_FILTER, gl.NEAREST );
247
+ gl.texParameteri( glTextureType, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
248
+
249
+ //gl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );
250
+
251
+ defaultTextures[ glTextureType ] = textureGPU;
252
+
253
+ }
254
+
255
+ this.set( texture, {
256
+ textureGPU,
257
+ glTextureType,
258
+ isDefault: true
259
+ } );
260
+
261
+ }
262
+
263
+ createTexture( texture, options ) {
264
+
265
+ const { gl, utils, textureUtils } = this;
266
+ const { levels, width, height } = options;
267
+
268
+ const glFormat = utils.convert( texture.format, texture.colorSpace );
269
+ const glType = utils.convert( texture.type );
270
+ const glInternalFormat = textureUtils.getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );
271
+
272
+ const textureGPU = gl.createTexture();
273
+ const glTextureType = textureUtils.getGLTextureType( texture );
274
+
275
+ gl.bindTexture( glTextureType, textureGPU );
276
+
277
+ gl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
278
+ gl.pixelStorei( gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
279
+ gl.pixelStorei( gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
280
+ gl.pixelStorei( gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, gl.NONE );
281
+
282
+ textureUtils.setTextureParameters( glTextureType, texture );
283
+
284
+ gl.bindTexture( glTextureType, textureGPU );
285
+ gl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );
286
+
287
+ this.set( texture, {
288
+ textureGPU,
289
+ glTextureType,
290
+ glFormat,
291
+ glType,
292
+ glInternalFormat
293
+ } );
294
+
295
+ }
296
+
297
+ updateTexture( texture, options ) {
298
+
299
+ const { gl } = this;
300
+ const { width, height } = options;
301
+ const { textureGPU, glTextureType, glFormat, glType } = this.get( texture );
302
+
303
+ const getImage = ( source ) => {
304
+
305
+ if ( source.isDataTexture ) {
306
+
307
+ return source.image.data;
308
+
309
+ }
310
+
311
+ return source;
312
+
313
+ };
314
+
315
+ gl.bindTexture( glTextureType, textureGPU );
316
+
317
+ if ( texture.isCubeTexture ) {
318
+
319
+ const images = options.images;
320
+
321
+ for ( let i = 0; i < 6; i ++ ) {
322
+
323
+ const image = getImage( images[ i ] );
324
+
325
+ gl.texSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, width, height, glFormat, glType, image );
326
+
327
+ }
328
+
329
+ } else {
330
+
331
+ const image = getImage( options.image );
332
+
333
+ gl.texSubImage2D( glTextureType, 0, 0, 0, width, height, glFormat, glType, image );
334
+
335
+ }
336
+
337
+ }
338
+
339
+ generateMipmaps( texture ) {
340
+
341
+ const { gl } = this;
342
+ const { textureGPU, glTextureType } = this.get( texture );
343
+
344
+ gl.bindTexture( glTextureType, textureGPU );
345
+ gl.generateMipmap( glTextureType );
346
+
347
+ }
348
+
349
+ destroyTexture( /*texture*/ ) {
350
+
351
+ console.warn( 'Abstract class.' );
352
+
353
+ }
354
+
355
+ copyTextureToBuffer( /*texture, x, y, width, height*/ ) {
356
+
357
+ console.warn( 'Abstract class.' );
358
+
359
+ }
360
+
361
+ // node builder
362
+
363
+ createNodeBuilder( object, renderer, scene = null ) {
364
+
365
+ return new GLSLNodeBuilder( object, renderer, scene );
366
+
367
+ }
368
+
369
+ // program
370
+
371
+ createProgram( program ) {
372
+
373
+ const gl = this.gl;
374
+ const { stage, code } = program;
375
+
376
+ const shader = stage === 'vertex' ? gl.createShader( gl.VERTEX_SHADER ) : gl.createShader( gl.FRAGMENT_SHADER );
377
+
378
+ gl.shaderSource( shader, code );
379
+ gl.compileShader( shader );
380
+
381
+ if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
382
+
383
+ console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( shader ) );
384
+
385
+ }
386
+
387
+ this.set( program, {
388
+ shaderGPU: shader
389
+ } );
390
+
391
+ }
392
+
393
+ destroyProgram( /*program*/ ) {
394
+
395
+ console.warn( 'Abstract class.' );
396
+
397
+ }
398
+
399
+ createRenderPipeline( renderObject ) {
400
+
401
+ const gl = this.gl;
402
+ const pipeline = renderObject.pipeline;
403
+
404
+ // Program
405
+
406
+ const { fragmentProgram, vertexProgram } = pipeline;
407
+
408
+ const programGPU = gl.createProgram();
409
+ gl.attachShader( programGPU, this.get( fragmentProgram ).shaderGPU );
410
+ gl.attachShader( programGPU, this.get( vertexProgram ).shaderGPU );
411
+ gl.linkProgram( programGPU );
412
+
413
+ if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
414
+
415
+ console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
416
+
417
+ }
418
+
419
+ gl.useProgram( programGPU );
420
+
421
+ // Bindings
422
+
423
+ const bindings = renderObject.getBindings();
424
+
425
+ for ( const binding of bindings ) {
426
+
427
+ const bindingData = this.get( binding );
428
+ const index = bindingData.index;
429
+
430
+ if ( binding.isUniformsGroup ) {
431
+
432
+ const location = gl.getUniformBlockIndex( programGPU, binding.name );
433
+ gl.uniformBlockBinding( programGPU, location, index );
434
+
435
+ } else if ( binding.isSampledTexture ) {
436
+
437
+ const location = gl.getUniformLocation( programGPU, binding.name );
438
+ gl.uniform1i( location, index );
439
+
440
+ }
441
+
442
+ }
443
+
444
+ // VAO
445
+
446
+ const vaoGPU = gl.createVertexArray();
447
+
448
+ const index = renderObject.getIndex();
449
+ const vertexBuffers = renderObject.getVertexBuffers();
450
+
451
+ gl.bindVertexArray( vaoGPU );
452
+
453
+ if ( index !== null ) {
454
+
455
+ const indexData = this.get( index );
456
+
457
+ gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, indexData.bufferGPU );
458
+
459
+ }
460
+
461
+ for ( let i = 0; i < vertexBuffers.length; i ++ ) {
462
+
463
+ const attribute = vertexBuffers[ i ];
464
+ const attributeData = this.get( attribute );
465
+
466
+ gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
467
+ gl.enableVertexAttribArray( i );
468
+ gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, false, 0, 0 );
469
+
470
+ }
471
+
472
+ gl.bindVertexArray( null );
473
+
474
+ //
475
+
476
+ this.set( pipeline, {
477
+ programGPU,
478
+ vaoGPU
479
+ } );
480
+
481
+ }
482
+
483
+ createComputePipeline( /*computePipeline, bindings*/ ) {
484
+
485
+ console.warn( 'Abstract class.' );
486
+
487
+ }
488
+
489
+ createBindings( bindings ) {
490
+
491
+ this.updateBindings( bindings );
492
+
493
+ }
494
+
495
+ updateBindings( bindings ) {
496
+
497
+ const { gl } = this;
498
+
499
+ let groupIndex = 0;
500
+ let textureIndex = 0;
501
+
502
+ for ( const binding of bindings ) {
503
+
504
+ if ( binding.isUniformsGroup ) {
505
+
506
+ const bufferGPU = gl.createBuffer();
507
+ const data = binding.buffer;
508
+
509
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
510
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
511
+ gl.bindBufferBase( gl.UNIFORM_BUFFER, groupIndex, bufferGPU );
512
+
513
+ this.set( binding, {
514
+ index: groupIndex ++,
515
+ bufferGPU
516
+ } );
517
+
518
+ } else if ( binding.isSampledTexture ) {
519
+
520
+ const { textureGPU, glTextureType } = this.get( binding.texture );
521
+
522
+ this.set( binding, {
523
+ index: textureIndex ++,
524
+ textureGPU,
525
+ glTextureType
526
+ } );
527
+
528
+ }
529
+
530
+ }
531
+
532
+ }
533
+
534
+ updateBinding( binding ) {
535
+
536
+ const gl = this.gl;
537
+
538
+ if ( binding.isUniformsGroup ) {
539
+
540
+ const bindingData = this.get( binding );
541
+ const bufferGPU = bindingData.bufferGPU;
542
+ const data = binding.buffer;
543
+
544
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
545
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
546
+
547
+ }
548
+
549
+ }
550
+
551
+ // attributes
552
+
553
+ createIndexAttribute( attribute ) {
554
+
555
+ const gl = this.gl;
556
+
557
+ this.attributeUtils.createAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );
558
+
559
+ }
560
+
561
+ createAttribute( attribute ) {
562
+
563
+ const gl = this.gl;
564
+
565
+ this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
566
+
567
+ }
568
+
569
+ createStorageAttribute( /*attribute*/ ) {
570
+
571
+ console.warn( 'Abstract class.' );
572
+
573
+ }
574
+
575
+ updateAttribute( /*attribute*/ ) {
576
+
577
+ console.warn( 'Abstract class.' );
578
+
579
+ }
580
+
581
+ destroyAttribute( /*attribute*/ ) {
582
+
583
+ console.warn( 'Abstract class.' );
584
+
585
+ }
586
+
587
+ updateSize() {
588
+
589
+ //console.warn( 'Abstract class.' );
590
+
591
+ }
592
+
593
+ hasFeature( name ) {
594
+
595
+ return true;
596
+
597
+ }
598
+
599
+ copyFramebufferToTexture( /*texture, renderContext*/ ) {
600
+
601
+ console.warn( 'Abstract class.' );
602
+
603
+ }
604
+
605
+ }
606
+
607
+ export default WebGLBackend;