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
@@ -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;