super-three 0.157.1 → 0.158.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 (178) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +1013 -790
  3. package/build/three.js +1013 -790
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +1008 -791
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +290 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +12 -1
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +1 -1
  12. package/examples/jsm/exporters/GLTFExporter.js +72 -2
  13. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  14. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  15. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  16. package/examples/jsm/libs/opentype.module.js +13 -75
  17. package/examples/jsm/libs/surfaceNet.js +201 -0
  18. package/examples/jsm/loaders/GLTFLoader.js +12 -3
  19. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  20. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  22. package/examples/jsm/math/Capsule.js +0 -55
  23. package/examples/jsm/math/Octree.js +70 -3
  24. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  25. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  26. package/examples/jsm/nodes/Nodes.js +6 -6
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
  28. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  29. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  31. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  32. package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
  33. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  35. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  36. package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
  37. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  38. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  39. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  40. package/examples/jsm/nodes/core/Node.js +7 -12
  41. package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
  42. package/examples/jsm/nodes/core/NodeUtils.js +4 -2
  43. package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
  44. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  45. package/examples/jsm/nodes/core/PropertyNode.js +4 -10
  46. package/examples/jsm/nodes/core/StackNode.js +7 -17
  47. package/examples/jsm/nodes/core/TempNode.js +1 -1
  48. package/examples/jsm/nodes/core/VarNode.js +6 -35
  49. package/examples/jsm/nodes/core/VaryingNode.js +2 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  51. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  52. package/examples/jsm/nodes/display/ViewportNode.js +14 -4
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  54. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  55. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  56. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  57. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  58. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  59. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  60. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  61. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  62. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  63. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  65. package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
  66. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  67. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  68. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  69. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
  70. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  71. package/examples/jsm/nodes/materials/Materials.js +1 -0
  72. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  73. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  74. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  75. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  76. package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
  77. package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
  78. package/examples/jsm/nodes/math/OperatorNode.js +5 -21
  79. package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
  80. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  81. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  82. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  83. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  84. package/examples/jsm/nodes/utils/SplitNode.js +2 -0
  85. package/examples/jsm/objects/BatchedMesh.js +586 -0
  86. package/examples/jsm/objects/InstancedPoints.js +21 -0
  87. package/examples/jsm/objects/Lensflare.js +20 -0
  88. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  89. package/examples/jsm/objects/Refractor.js +3 -0
  90. package/examples/jsm/objects/Sky.js +5 -3
  91. package/examples/jsm/objects/Water.js +5 -2
  92. package/examples/jsm/objects/Water2.js +3 -0
  93. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  94. package/examples/jsm/physics/RapierPhysics.js +21 -0
  95. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  96. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  97. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  98. package/examples/jsm/postprocessing/Pass.js +14 -3
  99. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  100. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  101. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  102. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  103. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  104. package/examples/jsm/renderers/common/Bindings.js +1 -1
  105. package/examples/jsm/renderers/common/RenderObject.js +8 -1
  106. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  107. package/examples/jsm/renderers/common/Textures.js +4 -36
  108. package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
  109. package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
  110. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
  111. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  113. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
  114. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
  115. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  116. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  117. package/examples/jsm/shaders/BasicShader.js +2 -0
  118. package/examples/jsm/shaders/BlendShader.js +2 -0
  119. package/examples/jsm/shaders/BokehShader.js +2 -0
  120. package/examples/jsm/shaders/BokehShader2.js +4 -0
  121. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  122. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  123. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  124. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  125. package/examples/jsm/shaders/FXAAShader.js +2 -0
  126. package/examples/jsm/shaders/FilmShader.js +1 -1
  127. package/examples/jsm/shaders/FocusShader.js +2 -0
  128. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  129. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  130. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  131. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  132. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  133. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  134. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  135. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  136. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  137. package/examples/jsm/shaders/MirrorShader.js +2 -0
  138. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  139. package/examples/jsm/shaders/OutputShader.js +4 -5
  140. package/examples/jsm/shaders/SAOShader.js +5 -0
  141. package/examples/jsm/shaders/SMAAShader.js +6 -0
  142. package/examples/jsm/shaders/SSAOShader.js +6 -0
  143. package/examples/jsm/shaders/SSRShader.js +6 -0
  144. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  145. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  146. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  147. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  148. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  149. package/examples/jsm/shaders/VelocityShader.js +2 -0
  150. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  151. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  152. package/examples/jsm/transpiler/AST.js +231 -0
  153. package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
  154. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  155. package/examples/jsm/transpiler/TSLEncoder.js +611 -0
  156. package/examples/jsm/transpiler/Transpiler.js +18 -0
  157. package/examples/jsm/webxr/VRButton.js +1 -1
  158. package/examples/jsm/webxr/XRButton.js +7 -5
  159. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  160. package/package.json +4 -1
  161. package/src/constants.js +7 -1
  162. package/src/extras/PMREMGenerator.js +7 -1
  163. package/src/loaders/MaterialLoader.js +10 -2
  164. package/src/materials/Material.js +27 -13
  165. package/src/math/Box3.js +35 -18
  166. package/src/math/Vector3.js +11 -12
  167. package/src/objects/SkinnedMesh.js +6 -7
  168. package/src/renderers/WebGLRenderer.js +142 -25
  169. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  170. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  171. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  172. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  173. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
  174. package/src/renderers/webgl/WebGLProgram.js +80 -50
  175. package/src/renderers/webgl/WebGLPrograms.js +3 -0
  176. package/src/renderers/webgl/WebGLState.js +25 -4
  177. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  178. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -17,6 +17,8 @@ class WebGLBackend extends Backend {
17
17
 
18
18
  super( parameters );
19
19
 
20
+ this.isWebGLBackend = true;
21
+
20
22
  }
21
23
 
22
24
  async init( renderer ) {
@@ -39,6 +41,7 @@ class WebGLBackend extends Backend {
39
41
  this.defaultTextures = {};
40
42
 
41
43
  this.extensions.get( 'EXT_color_buffer_float' );
44
+ this._currentContext = null;
42
45
 
43
46
  }
44
47
 
@@ -51,57 +54,155 @@ class WebGLBackend extends Backend {
51
54
  beginRender( renderContext ) {
52
55
 
53
56
  const { gl } = this;
57
+ const renderContextData = this.get( renderContext );
54
58
 
55
59
  //
56
60
 
61
+ renderContextData.previousContext = this._currentContext;
62
+ this._currentContext = renderContext;
63
+
57
64
  this._setFramebuffer( renderContext );
58
65
 
59
- let clear = 0;
66
+ this.clear( renderContext, renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil );
60
67
 
61
- if ( renderContext.clearColor ) clear |= gl.COLOR_BUFFER_BIT;
62
- if ( renderContext.clearDepth ) clear |= gl.DEPTH_BUFFER_BIT;
63
- if ( renderContext.clearStencil ) clear |= gl.STENCIL_BUFFER_BIT;
68
+ //
64
69
 
65
- const clearColor = renderContext.clearColorValue;
70
+ if ( renderContext.viewport ) {
66
71
 
67
- if ( clear !== 0 ) {
72
+ this.updateViewport( renderContext );
68
73
 
69
- if ( renderContext.textures === null ) {
74
+ } else {
70
75
 
71
- gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
72
- gl.clear( clear );
76
+ gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
77
+
78
+ }
79
+
80
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
81
+
82
+ if ( occlusionQueryCount > 0 ) {
83
+
84
+ // Get a reference to the array of objects with queries. The renderContextData property
85
+ // can be changed by another render pass before the async reading of all previous queries complete
86
+ renderContextData.currentOcclusionQueries = renderContextData.occlusionQueries;
87
+ renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
88
+
89
+ renderContextData.lastOcclusionObject = null;
90
+ renderContextData.occlusionQueries = new Array( occlusionQueryCount );
91
+ renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
92
+ renderContextData.occlusionQueryIndex = 0;
93
+
94
+ }
95
+
96
+ }
97
+
98
+ finishRender( renderContext ) {
99
+
100
+ const renderContextData = this.get( renderContext );
101
+ const previousContext = renderContextData.previousContext;
102
+
103
+ this._currentContext = previousContext;
104
+
105
+ if ( previousContext !== null ) {
106
+
107
+ this._setFramebuffer( previousContext );
108
+
109
+ if ( previousContext.viewport ) {
110
+
111
+ this.updateViewport( previousContext );
73
112
 
74
113
  } else {
75
114
 
76
- for ( let i = 0; i < renderContext.textures.length; i ++ ) {
115
+ const gl = this.gl;
77
116
 
78
- gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
117
+ gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
79
118
 
80
- }
119
+ }
120
+
121
+ }
122
+
123
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
81
124
 
82
- gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 1 );
125
+ if ( occlusionQueryCount > 0 ) {
126
+
127
+ const renderContextData = this.get( renderContext );
128
+
129
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
130
+
131
+ const { gl } = this;
132
+
133
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
83
134
 
84
135
  }
85
136
 
137
+ this.resolveOccludedAsync( renderContext );
138
+
86
139
  }
87
140
 
88
- //
141
+ }
89
142
 
90
- if ( renderContext.viewport ) {
143
+ resolveOccludedAsync( renderContext ) {
91
144
 
92
- this.updateViewport( renderContext );
145
+ const renderContextData = this.get( renderContext );
93
146
 
94
- } else {
147
+ // handle occlusion query results
95
148
 
96
- gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
149
+ const { currentOcclusionQueries, currentOcclusionQueryObjects } = renderContextData;
150
+
151
+ if ( currentOcclusionQueries && currentOcclusionQueryObjects ) {
152
+
153
+ const occluded = new WeakSet();
154
+ const { gl } = this;
155
+
156
+ renderContextData.currentOcclusionQueryObjects = null;
157
+ renderContextData.currentOcclusionQueries = null;
158
+
159
+ const check = () => {
160
+
161
+ let completed = 0;
162
+
163
+ // check all queries and requeue as appropriate
164
+ for ( let i = 0; i < currentOcclusionQueries.length; i ++ ) {
165
+
166
+ const query = currentOcclusionQueries[ i ];
167
+
168
+ if ( query === null ) continue;
169
+
170
+ if ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {
171
+
172
+ if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) > 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
173
+
174
+ currentOcclusionQueries[ i ] = null;
175
+ gl.deleteQuery( query );
176
+
177
+ completed ++;
178
+
179
+ }
180
+
181
+ }
182
+
183
+ if ( completed < currentOcclusionQueries.length ) {
184
+
185
+ requestAnimationFrame( check );
186
+
187
+ } else {
188
+
189
+ renderContextData.occluded = occluded;
190
+
191
+ }
192
+
193
+ }
194
+
195
+ check();
97
196
 
98
197
  }
99
198
 
100
199
  }
101
200
 
102
- finishRender( /*renderContext*/ ) {
201
+ isOccluded( renderContext, object ) {
103
202
 
104
- //console.warn( 'Abstract class.' );
203
+ const renderContextData = this.get( renderContext );
204
+
205
+ return renderContextData.occluded && renderContextData.occluded.has( object );
105
206
 
106
207
  }
107
208
 
@@ -114,9 +215,56 @@ class WebGLBackend extends Backend {
114
215
 
115
216
  }
116
217
 
117
- clear( /*renderContext, color, depth, stencil*/ ) {
218
+ clear( renderContext, color, depth, stencil ) {
118
219
 
119
- console.warn( 'Abstract class.' );
220
+ const { gl } = this;
221
+
222
+ //
223
+
224
+ let clear = 0;
225
+
226
+ if ( color ) clear |= gl.COLOR_BUFFER_BIT;
227
+ if ( depth ) clear |= gl.DEPTH_BUFFER_BIT;
228
+ if ( stencil ) clear |= gl.STENCIL_BUFFER_BIT;
229
+
230
+ if ( clear !== 0 ) {
231
+
232
+ const clearColor = renderContext.clearColorValue;
233
+
234
+ if ( depth ) this.state.setDepthMask( true );
235
+
236
+ if ( renderContext.textures === null ) {
237
+
238
+ gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
239
+ gl.clear( clear );
240
+
241
+ } else {
242
+
243
+ if ( color ) {
244
+
245
+ for ( let i = 0; i < renderContext.textures.length; i ++ ) {
246
+
247
+ gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
248
+
249
+ }
250
+ }
251
+
252
+ if ( depth && stencil ) {
253
+
254
+ gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 0 );
255
+
256
+ } else if ( depth ) {
257
+
258
+ gl.clearBufferfv( gl.DEPTH, 0, [ 1.0 ] );
259
+
260
+ } else if ( stencil ) {
261
+
262
+ gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
263
+ }
264
+
265
+ }
266
+
267
+ }
120
268
 
121
269
  }
122
270
 
@@ -140,11 +288,13 @@ class WebGLBackend extends Backend {
140
288
 
141
289
  draw( renderObject, info ) {
142
290
 
143
- const { pipeline, material } = renderObject;
291
+ const { pipeline, material, context } = renderObject;
144
292
  const { programGPU, vaoGPU } = this.get( pipeline );
145
293
 
146
294
  const { gl, state } = this;
147
295
 
296
+ const contextData = this.get( context );
297
+
148
298
  //
149
299
 
150
300
  const bindings = renderObject.getBindings();
@@ -154,7 +304,7 @@ class WebGLBackend extends Backend {
154
304
  const bindingData = this.get( binding );
155
305
  const index = bindingData.index;
156
306
 
157
- if ( binding.isUniformsGroup ) {
307
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
158
308
 
159
309
  gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
160
310
 
@@ -183,23 +333,61 @@ class WebGLBackend extends Backend {
183
333
 
184
334
  //
185
335
 
336
+ const lastObject = contextData.lastOcclusionObject;
337
+
338
+ if ( lastObject !== object && lastObject !== undefined ) {
339
+
340
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
341
+
342
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
343
+
344
+ contextData.occlusionQueryIndex ++;
345
+
346
+ }
347
+
348
+ if ( object.occlusionTest === true ) {
349
+
350
+ const query = gl.createQuery();
351
+
352
+ gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
353
+
354
+ contextData.occlusionQueries[ contextData.occlusionQueryIndex ] = query;
355
+ contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
356
+
357
+ }
358
+
359
+ contextData.lastOcclusionObject = object;
360
+
361
+ }
362
+
363
+ //
364
+
186
365
  let mode;
187
366
  if ( object.isPoints ) mode = gl.POINTS;
188
- else if ( object.isLine ) mode = gl.LINES;
189
- else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
190
367
  else if ( object.isLineSegments ) mode = gl.LINES;
368
+ else if ( object.isLine ) mode = gl.LINE_STRIP;
369
+ else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
191
370
  else mode = gl.TRIANGLES;
192
371
 
193
372
  //
194
373
 
374
+ const instanceCount = this.getInstanceCount( renderObject );
195
375
 
196
376
  if ( index !== null ) {
197
377
 
198
378
  const indexData = this.get( index );
199
-
200
379
  const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
201
380
 
202
- gl.drawElements( mode, index.count, indexData.type, firstVertex );
381
+ if ( instanceCount > 1 ) {
382
+
383
+ gl.drawElementsInstanced( mode, index.count, indexData.type, firstVertex, instanceCount );
384
+
385
+ } else {
386
+
387
+ gl.drawElements( mode, index.count, indexData.type, firstVertex );
388
+
389
+ }
390
+
203
391
 
204
392
  info.update( object, indexCount, 1 );
205
393
 
@@ -208,8 +396,16 @@ class WebGLBackend extends Backend {
208
396
  const positionAttribute = geometry.attributes.position;
209
397
  const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
210
398
 
399
+ if ( instanceCount > 1 ) {
400
+
401
+ gl.drawArraysInstanced( mode, 0, vertexCount, instanceCount );
402
+
403
+ } else {
404
+
405
+ gl.drawArrays( mode, 0, vertexCount );
406
+
407
+ }
211
408
 
212
- gl.drawArrays( mode, 0, vertexCount );
213
409
  //gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
214
410
 
215
411
  info.update( object, vertexCount, 1 );
@@ -232,7 +428,7 @@ class WebGLBackend extends Backend {
232
428
 
233
429
  getCacheKey( renderObject ) {
234
430
 
235
- return '';
431
+ return renderObject.geometry.id;
236
432
 
237
433
  }
238
434
 
@@ -331,7 +527,7 @@ class WebGLBackend extends Backend {
331
527
 
332
528
  return source.image.data;
333
529
 
334
- } else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas ) {
530
+ } else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas || source instanceof HTMLImageElement || source instanceof HTMLCanvasElement ) {
335
531
 
336
532
  return source;
337
533
 
@@ -414,12 +610,6 @@ class WebGLBackend extends Backend {
414
610
  gl.shaderSource( shader, code );
415
611
  gl.compileShader( shader );
416
612
 
417
- if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
418
-
419
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( shader ) );
420
-
421
- }
422
-
423
613
  this.set( program, {
424
614
  shaderGPU: shader
425
615
  } );
@@ -442,14 +632,21 @@ class WebGLBackend extends Backend {
442
632
  const { fragmentProgram, vertexProgram } = pipeline;
443
633
 
444
634
  const programGPU = gl.createProgram();
445
- gl.attachShader( programGPU, this.get( fragmentProgram ).shaderGPU );
446
- gl.attachShader( programGPU, this.get( vertexProgram ).shaderGPU );
635
+
636
+ const fragmentShader = this.get( fragmentProgram ).shaderGPU;
637
+ const vertexShader = this.get( vertexProgram ).shaderGPU;
638
+
639
+ gl.attachShader( programGPU, fragmentShader );
640
+ gl.attachShader( programGPU, vertexShader );
447
641
  gl.linkProgram( programGPU );
448
642
 
449
643
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
450
644
 
451
645
  console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
452
646
 
647
+ console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( fragmentShader ) );
648
+ console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( vertexShader ) );
649
+
453
650
  }
454
651
 
455
652
  gl.useProgram( programGPU );
@@ -463,7 +660,7 @@ class WebGLBackend extends Backend {
463
660
  const bindingData = this.get( binding );
464
661
  const index = bindingData.index;
465
662
 
466
- if ( binding.isUniformsGroup ) {
663
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
467
664
 
468
665
  const location = gl.getUniformBlockIndex( programGPU, binding.name );
469
666
  gl.uniformBlockBinding( programGPU, location, index );
@@ -482,7 +679,7 @@ class WebGLBackend extends Backend {
482
679
  const vaoGPU = gl.createVertexArray();
483
680
 
484
681
  const index = renderObject.getIndex();
485
- const vertexBuffers = renderObject.getVertexBuffers();
682
+ const attributes = renderObject.getAttributes();
486
683
 
487
684
  gl.bindVertexArray( vaoGPU );
488
685
 
@@ -494,14 +691,47 @@ class WebGLBackend extends Backend {
494
691
 
495
692
  }
496
693
 
497
- for ( let i = 0; i < vertexBuffers.length; i ++ ) {
694
+ for ( let i = 0; i < attributes.length; i ++ ) {
498
695
 
499
- const attribute = vertexBuffers[ i ];
696
+ const attribute = attributes[ i ];
500
697
  const attributeData = this.get( attribute );
501
698
 
502
699
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
503
700
  gl.enableVertexAttribArray( i );
504
- gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, false, 0, 0 );
701
+
702
+ let stride, offset;
703
+
704
+ if ( attribute.isInterleavedBufferAttribute === true ) {
705
+
706
+ stride = attribute.data.stride * attributeData.bytesPerElement;
707
+ offset = attribute.offset * attributeData.bytesPerElement;
708
+
709
+ } else {
710
+
711
+ stride = 0;
712
+ offset = 0;
713
+
714
+ }
715
+
716
+ if ( attributeData.isFloat ) {
717
+
718
+ gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, false, stride, offset );
719
+
720
+ } else {
721
+
722
+ gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
723
+
724
+ }
725
+
726
+ if ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {
727
+
728
+ gl.vertexAttribDivisor( i, attribute.meshPerAttribute );
729
+
730
+ } else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {
731
+
732
+ gl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );
733
+
734
+ }
505
735
 
506
736
  }
507
737
 
@@ -537,7 +767,7 @@ class WebGLBackend extends Backend {
537
767
 
538
768
  for ( const binding of bindings ) {
539
769
 
540
- if ( binding.isUniformsGroup ) {
770
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
541
771
 
542
772
  const bufferGPU = gl.createBuffer();
543
773
  const data = binding.buffer;
@@ -571,7 +801,7 @@ class WebGLBackend extends Backend {
571
801
 
572
802
  const gl = this.gl;
573
803
 
574
- if ( binding.isUniformsGroup ) {
804
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
575
805
 
576
806
  const bindingData = this.get( binding );
577
807
  const bufferGPU = bindingData.bufferGPU;
@@ -608,9 +838,9 @@ class WebGLBackend extends Backend {
608
838
 
609
839
  }
610
840
 
611
- updateAttribute( /*attribute*/ ) {
841
+ updateAttribute( attribute ) {
612
842
 
613
- console.warn( 'Abstract class.' );
843
+ this.attributeUtils.updateAttribute( attribute );
614
844
 
615
845
  }
616
846
 
@@ -632,9 +862,20 @@ class WebGLBackend extends Backend {
632
862
 
633
863
  }
634
864
 
635
- copyFramebufferToTexture( /*texture, renderContext*/ ) {
865
+ copyFramebufferToTexture( texture /*, renderContext */ ) {
636
866
 
637
- console.warn( 'Abstract class.' );
867
+ const { gl } = this;
868
+
869
+ const { textureGPU } = this.get( texture );
870
+
871
+ gl.bindFramebuffer( gl.FRAMEBUFFER, null );
872
+ gl.bindTexture( gl.TEXTURE_2D, textureGPU );
873
+
874
+ gl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, 0, 0, texture.image.width, texture.image.height );
875
+
876
+ if ( texture.generateMipmaps ) gl.generateMipmap( gl.TEXTURE_2D );
877
+
878
+ gl.bindTexture( gl.TEXTURE_2D, null );
638
879
 
639
880
  }
640
881