super-three 0.158.0 → 0.160.1
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.
- package/build/three.cjs +1720 -380
- package/build/three.js +1720 -380
- package/build/three.min.js +1 -1
- package/build/three.module.js +1719 -381
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +2 -1
- package/examples/jsm/controls/OrbitControls.js +50 -40
- package/examples/jsm/csm/CSMShader.js +52 -47
- package/examples/jsm/exporters/GLTFExporter.js +79 -1
- package/examples/jsm/exporters/USDZExporter.js +27 -19
- package/examples/jsm/helpers/TextureHelper.js +237 -0
- package/examples/jsm/interactive/HTMLMesh.js +9 -2
- package/examples/jsm/lines/LineMaterial.js +16 -33
- package/examples/jsm/loaders/ColladaLoader.js +0 -6
- package/examples/jsm/loaders/DRACOLoader.js +4 -3
- package/examples/jsm/loaders/FBXLoader.js +294 -124
- package/examples/jsm/loaders/GLTFLoader.js +71 -3
- package/examples/jsm/loaders/MaterialXLoader.js +73 -54
- package/examples/jsm/loaders/NRRDLoader.js +0 -13
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/USDZLoader.js +3 -17
- package/examples/jsm/math/Octree.js +15 -4
- package/examples/jsm/misc/Timer.js +119 -0
- package/examples/jsm/misc/TubePainter.js +3 -6
- package/examples/jsm/modifiers/CurveModifier.js +20 -2
- package/examples/jsm/nodes/Nodes.js +11 -7
- package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
- package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
- package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
- package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
- package/examples/jsm/nodes/code/CodeNode.js +3 -3
- package/examples/jsm/nodes/core/AttributeNode.js +7 -1
- package/examples/jsm/nodes/core/CacheNode.js +4 -1
- package/examples/jsm/nodes/core/ConstNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +6 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
- package/examples/jsm/nodes/core/NodeFrame.js +10 -8
- package/examples/jsm/nodes/core/NodeUniform.js +12 -0
- package/examples/jsm/nodes/core/NodeUtils.js +3 -7
- package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
- package/examples/jsm/nodes/core/PropertyNode.js +17 -2
- package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
- package/examples/jsm/nodes/core/UniformGroup.js +13 -0
- package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
- package/examples/jsm/nodes/core/UniformNode.js +17 -0
- package/examples/jsm/nodes/core/VarNode.js +2 -0
- package/examples/jsm/nodes/core/VaryingNode.js +1 -7
- package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
- package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
- package/examples/jsm/nodes/display/PassNode.js +182 -0
- package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +5 -8
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
- package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
- package/examples/jsm/nodes/math/MathNode.js +2 -0
- package/examples/jsm/nodes/math/OperatorNode.js +19 -6
- package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
- package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +8 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/examples/jsm/objects/QuadMesh.js +60 -0
- package/examples/jsm/postprocessing/GTAOPass.js +572 -0
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Animation.js +10 -21
- package/examples/jsm/renderers/common/Backend.js +19 -3
- package/examples/jsm/renderers/common/Background.js +20 -22
- package/examples/jsm/renderers/common/Bindings.js +30 -21
- package/examples/jsm/renderers/common/ChainMap.js +3 -3
- package/examples/jsm/renderers/common/Color4.js +37 -0
- package/examples/jsm/renderers/common/Geometries.js +4 -4
- package/examples/jsm/renderers/common/Info.js +12 -2
- package/examples/jsm/renderers/common/Pipelines.js +3 -51
- package/examples/jsm/renderers/common/PostProcessing.js +25 -0
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderContexts.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +13 -1
- package/examples/jsm/renderers/common/RenderObjects.js +4 -2
- package/examples/jsm/renderers/common/Renderer.js +137 -37
- package/examples/jsm/renderers/common/StorageTexture.js +1 -0
- package/examples/jsm/renderers/common/Textures.js +4 -1
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
- package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
- package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
- package/examples/jsm/shaders/FXAAShader.js +133 -133
- package/examples/jsm/shaders/GTAOShader.js +424 -0
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
- package/examples/jsm/shaders/SAOShader.js +2 -3
- package/examples/jsm/shaders/SSAOShader.js +2 -3
- package/examples/jsm/transpiler/AST.js +40 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
- package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
- package/examples/jsm/transpiler/TSLEncoder.js +124 -20
- package/examples/jsm/utils/SortUtils.js +158 -0
- package/examples/jsm/utils/TextureUtils.js +33 -21
- package/examples/jsm/webxr/ARButton.js +14 -0
- package/examples/jsm/webxr/VRButton.js +23 -8
- package/examples/jsm/webxr/XRButton.js +25 -11
- package/package.json +5 -6
- package/src/Three.js +1 -0
- package/src/constants.js +2 -1
- package/src/core/BufferAttribute.js +21 -2
- package/src/core/InterleavedBuffer.js +21 -1
- package/src/core/Object3D.js +60 -12
- package/src/core/UniformsGroup.js +7 -1
- package/src/extras/curves/LineCurve3.js +4 -0
- package/src/loaders/AudioLoader.js +1 -1
- package/src/loaders/BufferGeometryLoader.js +0 -7
- package/src/loaders/ImageBitmapLoader.js +25 -1
- package/src/loaders/ObjectLoader.js +49 -0
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/ColorManagement.js +0 -16
- package/src/math/Quaternion.js +5 -4
- package/src/math/Sphere.js +2 -0
- package/src/math/Triangle.js +17 -5
- package/src/objects/BatchedMesh.js +1020 -0
- package/src/objects/Skeleton.js +1 -3
- package/src/renderers/WebGL3DRenderTarget.js +2 -2
- package/src/renderers/WebGLArrayRenderTarget.js +2 -2
- package/src/renderers/WebGLRenderer.js +24 -19
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
- package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
- package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk.js +4 -0
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
- package/src/renderers/webgl/WebGLAttributes.js +39 -5
- package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLExtensions.js +1 -0
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLLights.js +11 -2
- package/src/renderers/webgl/WebGLProgram.js +20 -1
- package/src/renderers/webgl/WebGLPrograms.js +5 -0
- package/src/renderers/webgl/WebGLShadowMap.js +35 -0
- package/src/renderers/webgl/WebGLTextures.js +7 -11
- package/src/renderers/webgl/WebGLUniforms.js +11 -1
- package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
- package/src/renderers/webxr/WebXRManager.js +16 -0
- package/examples/jsm/objects/BatchedMesh.js +0 -586
|
@@ -8,6 +8,7 @@ import WebGLState from './utils/WebGLState.js';
|
|
|
8
8
|
import WebGLUtils from './utils/WebGLUtils.js';
|
|
9
9
|
import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
|
|
10
10
|
import WebGLExtensions from './utils/WebGLExtensions.js';
|
|
11
|
+
import WebGLCapabilities from './utils/WebGLCapabilities.js';
|
|
11
12
|
|
|
12
13
|
//
|
|
13
14
|
|
|
@@ -34,6 +35,7 @@ class WebGLBackend extends Backend {
|
|
|
34
35
|
this.gl = glContext;
|
|
35
36
|
|
|
36
37
|
this.extensions = new WebGLExtensions( this );
|
|
38
|
+
this.capabilities = new WebGLCapabilities( this );
|
|
37
39
|
this.attributeUtils = new WebGLAttributeUtils( this );
|
|
38
40
|
this.textureUtils = new WebGLTextureUtils( this );
|
|
39
41
|
this.state = new WebGLState( this );
|
|
@@ -51,6 +53,12 @@ class WebGLBackend extends Backend {
|
|
|
51
53
|
|
|
52
54
|
}
|
|
53
55
|
|
|
56
|
+
async getArrayBufferAsync( attribute ) {
|
|
57
|
+
|
|
58
|
+
return await this.attributeUtils.getArrayBufferAsync( attribute );
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
54
62
|
beginRender( renderContext ) {
|
|
55
63
|
|
|
56
64
|
const { gl } = this;
|
|
@@ -63,7 +71,7 @@ class WebGLBackend extends Backend {
|
|
|
63
71
|
|
|
64
72
|
this._setFramebuffer( renderContext );
|
|
65
73
|
|
|
66
|
-
this.clear( renderContext
|
|
74
|
+
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
|
|
67
75
|
|
|
68
76
|
//
|
|
69
77
|
|
|
@@ -190,7 +198,7 @@ class WebGLBackend extends Backend {
|
|
|
190
198
|
|
|
191
199
|
}
|
|
192
200
|
|
|
193
|
-
}
|
|
201
|
+
};
|
|
194
202
|
|
|
195
203
|
check();
|
|
196
204
|
|
|
@@ -215,10 +223,19 @@ class WebGLBackend extends Backend {
|
|
|
215
223
|
|
|
216
224
|
}
|
|
217
225
|
|
|
218
|
-
clear(
|
|
226
|
+
clear( color, depth, stencil, descriptor = null ) {
|
|
219
227
|
|
|
220
228
|
const { gl } = this;
|
|
221
229
|
|
|
230
|
+
if ( descriptor === null ) {
|
|
231
|
+
|
|
232
|
+
descriptor = {
|
|
233
|
+
textures: null,
|
|
234
|
+
clearColorValue: this.getClearColor()
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
222
239
|
//
|
|
223
240
|
|
|
224
241
|
let clear = 0;
|
|
@@ -229,11 +246,11 @@ class WebGLBackend extends Backend {
|
|
|
229
246
|
|
|
230
247
|
if ( clear !== 0 ) {
|
|
231
248
|
|
|
232
|
-
const clearColor =
|
|
249
|
+
const clearColor = descriptor.clearColorValue;
|
|
233
250
|
|
|
234
251
|
if ( depth ) this.state.setDepthMask( true );
|
|
235
252
|
|
|
236
|
-
if (
|
|
253
|
+
if ( descriptor.textures === null ) {
|
|
237
254
|
|
|
238
255
|
gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
|
|
239
256
|
gl.clear( clear );
|
|
@@ -242,11 +259,12 @@ class WebGLBackend extends Backend {
|
|
|
242
259
|
|
|
243
260
|
if ( color ) {
|
|
244
261
|
|
|
245
|
-
for ( let i = 0; i <
|
|
262
|
+
for ( let i = 0; i < descriptor.textures.length; i ++ ) {
|
|
246
263
|
|
|
247
264
|
gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
|
|
248
265
|
|
|
249
266
|
}
|
|
267
|
+
|
|
250
268
|
}
|
|
251
269
|
|
|
252
270
|
if ( depth && stencil ) {
|
|
@@ -260,6 +278,7 @@ class WebGLBackend extends Backend {
|
|
|
260
278
|
} else if ( stencil ) {
|
|
261
279
|
|
|
262
280
|
gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
|
|
281
|
+
|
|
263
282
|
}
|
|
264
283
|
|
|
265
284
|
}
|
|
@@ -420,15 +439,15 @@ class WebGLBackend extends Backend {
|
|
|
420
439
|
|
|
421
440
|
}
|
|
422
441
|
|
|
423
|
-
|
|
442
|
+
needsRenderUpdate( renderObject ) {
|
|
424
443
|
|
|
425
444
|
return false;
|
|
426
445
|
|
|
427
446
|
}
|
|
428
447
|
|
|
429
|
-
|
|
448
|
+
getRenderCacheKey( renderObject ) {
|
|
430
449
|
|
|
431
|
-
return renderObject.
|
|
450
|
+
return renderObject.id;
|
|
432
451
|
|
|
433
452
|
}
|
|
434
453
|
|
|
@@ -440,12 +459,6 @@ class WebGLBackend extends Backend {
|
|
|
440
459
|
|
|
441
460
|
}
|
|
442
461
|
|
|
443
|
-
destroySampler( /*texture*/ ) {
|
|
444
|
-
|
|
445
|
-
console.warn( 'Abstract class.' );
|
|
446
|
-
|
|
447
|
-
}
|
|
448
|
-
|
|
449
462
|
createDefaultTexture( texture ) {
|
|
450
463
|
|
|
451
464
|
const { gl, textureUtils, defaultTextures } = this;
|
|
@@ -479,7 +492,7 @@ class WebGLBackend extends Backend {
|
|
|
479
492
|
createTexture( texture, options ) {
|
|
480
493
|
|
|
481
494
|
const { gl, utils, textureUtils } = this;
|
|
482
|
-
const { levels, width, height } = options;
|
|
495
|
+
const { levels, width, height, depth } = options;
|
|
483
496
|
|
|
484
497
|
const glFormat = utils.convert( texture.format, texture.colorSpace );
|
|
485
498
|
const glType = utils.convert( texture.type );
|
|
@@ -499,7 +512,11 @@ class WebGLBackend extends Backend {
|
|
|
499
512
|
|
|
500
513
|
gl.bindTexture( glTextureType, textureGPU );
|
|
501
514
|
|
|
502
|
-
if (
|
|
515
|
+
if ( texture.isDataArrayTexture ) {
|
|
516
|
+
|
|
517
|
+
gl.texStorage3D( gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, width, height, depth );
|
|
518
|
+
|
|
519
|
+
} else if ( ! texture.isVideoTexture ) {
|
|
503
520
|
|
|
504
521
|
gl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );
|
|
505
522
|
|
|
@@ -551,6 +568,12 @@ class WebGLBackend extends Backend {
|
|
|
551
568
|
|
|
552
569
|
}
|
|
553
570
|
|
|
571
|
+
} else if ( texture.isDataArrayTexture ) {
|
|
572
|
+
|
|
573
|
+
const image = options.image;
|
|
574
|
+
|
|
575
|
+
gl.texSubImage3D( gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
|
|
576
|
+
|
|
554
577
|
} else if ( texture.isVideoTexture ) {
|
|
555
578
|
|
|
556
579
|
texture.update();
|
|
@@ -578,15 +601,22 @@ class WebGLBackend extends Backend {
|
|
|
578
601
|
|
|
579
602
|
}
|
|
580
603
|
|
|
581
|
-
destroyTexture(
|
|
604
|
+
destroyTexture( texture ) {
|
|
582
605
|
|
|
583
|
-
|
|
606
|
+
const { gl } = this;
|
|
607
|
+
const { textureGPU } = this.get( texture );
|
|
608
|
+
|
|
609
|
+
gl.deleteTexture( textureGPU );
|
|
610
|
+
|
|
611
|
+
this.delete( texture );
|
|
584
612
|
|
|
585
613
|
}
|
|
586
614
|
|
|
587
|
-
|
|
615
|
+
destroySampler() {}
|
|
588
616
|
|
|
589
|
-
|
|
617
|
+
copyTextureToBuffer( texture, x, y, width, height ) {
|
|
618
|
+
|
|
619
|
+
return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
|
|
590
620
|
|
|
591
621
|
}
|
|
592
622
|
|
|
@@ -713,13 +743,13 @@ class WebGLBackend extends Backend {
|
|
|
713
743
|
|
|
714
744
|
}
|
|
715
745
|
|
|
716
|
-
if ( attributeData.
|
|
746
|
+
if ( attributeData.isInteger ) {
|
|
717
747
|
|
|
718
|
-
gl.
|
|
748
|
+
gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
|
|
719
749
|
|
|
720
750
|
} else {
|
|
721
751
|
|
|
722
|
-
gl.
|
|
752
|
+
gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
|
|
723
753
|
|
|
724
754
|
}
|
|
725
755
|
|
|
@@ -856,26 +886,54 @@ class WebGLBackend extends Backend {
|
|
|
856
886
|
|
|
857
887
|
}
|
|
858
888
|
|
|
859
|
-
hasFeature( name ) {
|
|
889
|
+
hasFeature( /*name*/ ) {
|
|
860
890
|
|
|
861
891
|
return true;
|
|
862
892
|
|
|
863
893
|
}
|
|
864
894
|
|
|
865
|
-
|
|
895
|
+
getMaxAnisotropy() {
|
|
896
|
+
|
|
897
|
+
return this.capabilities.getMaxAnisotropy();
|
|
898
|
+
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
copyFramebufferToTexture( texture, renderContext ) {
|
|
866
902
|
|
|
867
903
|
const { gl } = this;
|
|
868
904
|
|
|
869
905
|
const { textureGPU } = this.get( texture );
|
|
870
906
|
|
|
871
|
-
|
|
872
|
-
|
|
907
|
+
const width = texture.image.width;
|
|
908
|
+
const height = texture.image.height;
|
|
909
|
+
|
|
910
|
+
gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );
|
|
911
|
+
|
|
912
|
+
if ( texture.isDepthTexture ) {
|
|
913
|
+
|
|
914
|
+
const fb = gl.createFramebuffer();
|
|
873
915
|
|
|
874
|
-
|
|
916
|
+
gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
875
917
|
|
|
876
|
-
|
|
918
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureGPU, 0 );
|
|
877
919
|
|
|
878
|
-
|
|
920
|
+
gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
|
|
921
|
+
|
|
922
|
+
gl.deleteFramebuffer( fb );
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
} else {
|
|
926
|
+
|
|
927
|
+
gl.bindTexture( gl.TEXTURE_2D, textureGPU );
|
|
928
|
+
gl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, 0, 0, width, height );
|
|
929
|
+
|
|
930
|
+
gl.bindTexture( gl.TEXTURE_2D, null );
|
|
931
|
+
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
if ( texture.generateMipmaps ) this.generateMipmaps( texture );
|
|
935
|
+
|
|
936
|
+
this._setFramebuffer( renderContext );
|
|
879
937
|
|
|
880
938
|
}
|
|
881
939
|
|
|
@@ -885,7 +943,7 @@ class WebGLBackend extends Backend {
|
|
|
885
943
|
|
|
886
944
|
if ( renderContext.textures !== null ) {
|
|
887
945
|
|
|
888
|
-
const renderContextData = this.get( renderContext );
|
|
946
|
+
const renderContextData = this.get( renderContext.renderTarget );
|
|
889
947
|
|
|
890
948
|
let fb = renderContextData.framebuffer;
|
|
891
949
|
|
|
@@ -899,7 +957,7 @@ class WebGLBackend extends Backend {
|
|
|
899
957
|
|
|
900
958
|
const drawBuffers = [];
|
|
901
959
|
|
|
902
|
-
for ( let i = 0; i < textures.length; i++ ) {
|
|
960
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
903
961
|
|
|
904
962
|
const texture = textures[ i ];
|
|
905
963
|
const { textureGPU } = this.get( texture );
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial
|
|
1
|
+
import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial } from '../../../nodes/Nodes.js';
|
|
2
2
|
|
|
3
3
|
import UniformBuffer from '../../common/UniformBuffer.js';
|
|
4
|
-
import
|
|
4
|
+
import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
|
|
5
|
+
|
|
5
6
|
import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
|
|
6
7
|
|
|
8
|
+
import { IntType } from 'three';
|
|
9
|
+
|
|
7
10
|
const glslMethods = {
|
|
8
11
|
[ MathNode.ATAN2 ]: 'atan',
|
|
9
12
|
textureDimensions: 'textureSize'
|
|
@@ -19,13 +22,20 @@ const supports = {
|
|
|
19
22
|
instance: true
|
|
20
23
|
};
|
|
21
24
|
|
|
25
|
+
const defaultPrecisions = `
|
|
26
|
+
precision highp float;
|
|
27
|
+
precision highp int;
|
|
28
|
+
precision mediump sampler2DArray;
|
|
29
|
+
precision lowp sampler2DShadow;
|
|
30
|
+
`;
|
|
31
|
+
|
|
22
32
|
class GLSLNodeBuilder extends NodeBuilder {
|
|
23
33
|
|
|
24
34
|
constructor( object, renderer, scene = null ) {
|
|
25
35
|
|
|
26
36
|
super( object, renderer, new GLSLNodeParser(), scene );
|
|
27
37
|
|
|
28
|
-
this.
|
|
38
|
+
this.uniformGroups = {};
|
|
29
39
|
|
|
30
40
|
}
|
|
31
41
|
|
|
@@ -43,7 +53,7 @@ class GLSLNodeBuilder extends NodeBuilder {
|
|
|
43
53
|
|
|
44
54
|
}
|
|
45
55
|
|
|
46
|
-
|
|
56
|
+
buildFunctionCode( shaderNode ) {
|
|
47
57
|
|
|
48
58
|
const layout = shaderNode.layout;
|
|
49
59
|
const flowData = this.flowShaderNode( shaderNode );
|
|
@@ -69,39 +79,55 @@ ${ flowData.code }
|
|
|
69
79
|
|
|
70
80
|
//
|
|
71
81
|
|
|
72
|
-
return
|
|
82
|
+
return code;
|
|
73
83
|
|
|
74
84
|
}
|
|
75
85
|
|
|
76
|
-
|
|
86
|
+
generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0' ) {
|
|
87
|
+
|
|
88
|
+
if ( depthSnippet ) {
|
|
89
|
+
|
|
90
|
+
return `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet } )`;
|
|
91
|
+
|
|
92
|
+
} else {
|
|
93
|
+
|
|
94
|
+
return `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
generateTexture( texture, textureProperty, uvSnippet, depthSnippet ) {
|
|
77
101
|
|
|
78
102
|
if ( texture.isTextureCube ) {
|
|
79
103
|
|
|
80
|
-
return `textureCube( ${textureProperty}, ${uvSnippet} )`;
|
|
104
|
+
return `textureCube( ${ textureProperty }, ${ uvSnippet } )`;
|
|
81
105
|
|
|
82
106
|
} else if ( texture.isDepthTexture ) {
|
|
83
107
|
|
|
84
|
-
return `texture( ${textureProperty}, ${uvSnippet} ).x`;
|
|
108
|
+
return `texture( ${ textureProperty }, ${ uvSnippet } ).x`;
|
|
85
109
|
|
|
86
110
|
} else {
|
|
87
111
|
|
|
88
|
-
|
|
112
|
+
if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
|
|
113
|
+
|
|
114
|
+
return `texture( ${ textureProperty }, ${ uvSnippet } )`;
|
|
89
115
|
|
|
90
116
|
}
|
|
91
117
|
|
|
92
118
|
}
|
|
93
119
|
|
|
94
|
-
|
|
120
|
+
generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet ) {
|
|
95
121
|
|
|
96
|
-
return `textureLod( ${textureProperty}, ${uvSnippet}, ${
|
|
122
|
+
return `textureLod( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet } )`;
|
|
97
123
|
|
|
98
124
|
}
|
|
99
125
|
|
|
100
|
-
|
|
126
|
+
generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
101
127
|
|
|
102
128
|
if ( shaderStage === 'fragment' ) {
|
|
103
129
|
|
|
104
|
-
return `texture( ${textureProperty}, vec3( ${uvSnippet}, ${compareSnippet} ) )`;
|
|
130
|
+
return `texture( ${ textureProperty }, vec3( ${ uvSnippet }, ${ compareSnippet } ) )`;
|
|
105
131
|
|
|
106
132
|
} else {
|
|
107
133
|
|
|
@@ -138,7 +164,7 @@ ${ flowData.code }
|
|
|
138
164
|
const uniforms = this.uniforms[ shaderStage ];
|
|
139
165
|
|
|
140
166
|
const bindingSnippets = [];
|
|
141
|
-
const
|
|
167
|
+
const uniformGroups = {};
|
|
142
168
|
|
|
143
169
|
for ( const uniform of uniforms ) {
|
|
144
170
|
|
|
@@ -147,19 +173,25 @@ ${ flowData.code }
|
|
|
147
173
|
|
|
148
174
|
if ( uniform.type === 'texture' ) {
|
|
149
175
|
|
|
150
|
-
|
|
176
|
+
const texture = uniform.node.value;
|
|
177
|
+
|
|
178
|
+
if ( texture.compareFunction ) {
|
|
151
179
|
|
|
152
|
-
snippet = `sampler2DShadow ${uniform.name};`;
|
|
180
|
+
snippet = `sampler2DShadow ${ uniform.name };`;
|
|
181
|
+
|
|
182
|
+
} else if ( texture.isDataArrayTexture === true ) {
|
|
183
|
+
|
|
184
|
+
snippet = `sampler2DArray ${ uniform.name };`;
|
|
153
185
|
|
|
154
186
|
} else {
|
|
155
187
|
|
|
156
|
-
snippet = `sampler2D ${uniform.name};`;
|
|
188
|
+
snippet = `sampler2D ${ uniform.name };`;
|
|
157
189
|
|
|
158
190
|
}
|
|
159
191
|
|
|
160
192
|
} else if ( uniform.type === 'cubeTexture' ) {
|
|
161
193
|
|
|
162
|
-
snippet = `samplerCube ${uniform.name};`;
|
|
194
|
+
snippet = `samplerCube ${ uniform.name };`;
|
|
163
195
|
|
|
164
196
|
} else if ( uniform.type === 'buffer' ) {
|
|
165
197
|
|
|
@@ -168,7 +200,7 @@ ${ flowData.code }
|
|
|
168
200
|
const bufferCount = bufferNode.bufferCount;
|
|
169
201
|
|
|
170
202
|
const bufferCountSnippet = bufferCount > 0 ? bufferCount : '';
|
|
171
|
-
snippet = `${bufferNode.name} {\n\t${bufferType} ${uniform.name}[${bufferCountSnippet}];\n};\n`;
|
|
203
|
+
snippet = `${bufferNode.name} {\n\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\n};\n`;
|
|
172
204
|
|
|
173
205
|
} else {
|
|
174
206
|
|
|
@@ -192,6 +224,9 @@ ${ flowData.code }
|
|
|
192
224
|
|
|
193
225
|
snippet = '\t' + snippet;
|
|
194
226
|
|
|
227
|
+
const groupName = uniform.groupNode.name;
|
|
228
|
+
const groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );
|
|
229
|
+
|
|
195
230
|
groupSnippets.push( snippet );
|
|
196
231
|
|
|
197
232
|
} else {
|
|
@@ -206,9 +241,11 @@ ${ flowData.code }
|
|
|
206
241
|
|
|
207
242
|
let output = '';
|
|
208
243
|
|
|
209
|
-
|
|
244
|
+
for ( const name in uniformGroups ) {
|
|
210
245
|
|
|
211
|
-
|
|
246
|
+
const groupSnippets = uniformGroups[ name ];
|
|
247
|
+
|
|
248
|
+
output += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\n' ) ) + '\n';
|
|
212
249
|
|
|
213
250
|
}
|
|
214
251
|
|
|
@@ -218,6 +255,30 @@ ${ flowData.code }
|
|
|
218
255
|
|
|
219
256
|
}
|
|
220
257
|
|
|
258
|
+
getTypeFromAttribute( attribute ) {
|
|
259
|
+
|
|
260
|
+
let nodeType = super.getTypeFromAttribute( attribute );
|
|
261
|
+
|
|
262
|
+
if ( /^[iu]/.test( nodeType ) && attribute.gpuType !== IntType ) {
|
|
263
|
+
|
|
264
|
+
let dataAttribute = attribute;
|
|
265
|
+
|
|
266
|
+
if ( attribute.isInterleavedBufferAttribute ) dataAttribute = attribute.data;
|
|
267
|
+
|
|
268
|
+
const array = dataAttribute.array;
|
|
269
|
+
|
|
270
|
+
if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
|
|
271
|
+
|
|
272
|
+
nodeType = nodeType.slice( 1 );
|
|
273
|
+
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return nodeType;
|
|
279
|
+
|
|
280
|
+
}
|
|
281
|
+
|
|
221
282
|
getAttributes( shaderStage ) {
|
|
222
283
|
|
|
223
284
|
let snippet = '';
|
|
@@ -323,7 +384,7 @@ ${ flowData.code }
|
|
|
323
384
|
|
|
324
385
|
getVertexIndex() {
|
|
325
386
|
|
|
326
|
-
return 'gl_VertexID';
|
|
387
|
+
return 'uint( gl_VertexID )';
|
|
327
388
|
|
|
328
389
|
}
|
|
329
390
|
|
|
@@ -345,6 +406,12 @@ ${ flowData.code }
|
|
|
345
406
|
|
|
346
407
|
}
|
|
347
408
|
|
|
409
|
+
getFragDepth() {
|
|
410
|
+
|
|
411
|
+
return 'gl_FragDepth';
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
|
|
348
415
|
isAvailable( name ) {
|
|
349
416
|
|
|
350
417
|
return supports[ name ] === true;
|
|
@@ -374,8 +441,7 @@ ${vars}
|
|
|
374
441
|
${ this.getSignature() }
|
|
375
442
|
|
|
376
443
|
// precision
|
|
377
|
-
|
|
378
|
-
precision highp int;
|
|
444
|
+
${ defaultPrecisions }
|
|
379
445
|
|
|
380
446
|
// uniforms
|
|
381
447
|
${shaderData.uniforms}
|
|
@@ -411,9 +477,7 @@ void main() {
|
|
|
411
477
|
${ this.getSignature() }
|
|
412
478
|
|
|
413
479
|
// precision
|
|
414
|
-
|
|
415
|
-
precision highp int;
|
|
416
|
-
precision lowp sampler2DShadow;
|
|
480
|
+
${ defaultPrecisions }
|
|
417
481
|
|
|
418
482
|
// uniforms
|
|
419
483
|
${shaderData.uniforms}
|
|
@@ -519,7 +583,7 @@ void main() {
|
|
|
519
583
|
getUniformFromNode( node, type, shaderStage, name = null ) {
|
|
520
584
|
|
|
521
585
|
const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
|
|
522
|
-
const nodeData = this.getDataFromNode( node, shaderStage );
|
|
586
|
+
const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );
|
|
523
587
|
|
|
524
588
|
let uniformGPU = nodeData.uniformGPU;
|
|
525
589
|
|
|
@@ -551,14 +615,19 @@ void main() {
|
|
|
551
615
|
|
|
552
616
|
} else {
|
|
553
617
|
|
|
554
|
-
|
|
618
|
+
const group = node.groupNode;
|
|
619
|
+
const groupName = group.name;
|
|
620
|
+
|
|
621
|
+
const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
|
|
622
|
+
|
|
623
|
+
let uniformsGroup = uniformsStage[ groupName ];
|
|
555
624
|
|
|
556
625
|
if ( uniformsGroup === undefined ) {
|
|
557
626
|
|
|
558
|
-
uniformsGroup = new
|
|
627
|
+
uniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );
|
|
559
628
|
//uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
560
629
|
|
|
561
|
-
|
|
630
|
+
uniformsStage[ groupName ] = uniformsGroup;
|
|
562
631
|
|
|
563
632
|
this.bindings[ shaderStage ].push( uniformsGroup );
|
|
564
633
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { IntType } from 'three';
|
|
2
|
+
|
|
1
3
|
class WebGLAttributeUtils {
|
|
2
4
|
|
|
3
5
|
constructor( backend ) {
|
|
@@ -36,19 +38,16 @@ class WebGLAttributeUtils {
|
|
|
36
38
|
//attribute.onUploadCallback();
|
|
37
39
|
|
|
38
40
|
let type;
|
|
39
|
-
let isFloat = false;
|
|
40
41
|
|
|
41
42
|
if ( array instanceof Float32Array ) {
|
|
42
43
|
|
|
43
44
|
type = gl.FLOAT;
|
|
44
|
-
isFloat = true;
|
|
45
45
|
|
|
46
46
|
} else if ( array instanceof Uint16Array ) {
|
|
47
47
|
|
|
48
48
|
if ( attribute.isFloat16BufferAttribute ) {
|
|
49
49
|
|
|
50
50
|
type = gl.HALF_FLOAT;
|
|
51
|
-
isFloat = true;
|
|
52
51
|
|
|
53
52
|
} else {
|
|
54
53
|
|
|
@@ -91,7 +90,7 @@ class WebGLAttributeUtils {
|
|
|
91
90
|
type,
|
|
92
91
|
bytesPerElement: array.BYTES_PER_ELEMENT,
|
|
93
92
|
version: attribute.version,
|
|
94
|
-
|
|
93
|
+
isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType
|
|
95
94
|
} );
|
|
96
95
|
|
|
97
96
|
}
|
|
@@ -105,15 +104,68 @@ class WebGLAttributeUtils {
|
|
|
105
104
|
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
|
106
105
|
const bufferData = backend.get( bufferAttribute );
|
|
107
106
|
const bufferType = bufferData.bufferType;
|
|
107
|
+
const updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;
|
|
108
108
|
|
|
109
109
|
gl.bindBuffer( bufferType, bufferData.bufferGPU );
|
|
110
|
-
|
|
110
|
+
|
|
111
|
+
if ( updateRanges.length === 0 ) {
|
|
112
|
+
|
|
113
|
+
// Not using update ranges
|
|
114
|
+
|
|
115
|
+
gl.bufferSubData( bufferType, 0, array );
|
|
116
|
+
|
|
117
|
+
} else {
|
|
118
|
+
|
|
119
|
+
for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
|
|
120
|
+
|
|
121
|
+
const range = updateRanges[ i ];
|
|
122
|
+
gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
|
|
123
|
+
array, range.start, range.count );
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
bufferAttribute.clearUpdateRanges();
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
111
131
|
gl.bindBuffer( bufferType, null );
|
|
112
132
|
|
|
113
133
|
bufferData.version = bufferAttribute.version;
|
|
114
134
|
|
|
115
135
|
}
|
|
116
136
|
|
|
137
|
+
async getArrayBufferAsync( attribute ) {
|
|
138
|
+
|
|
139
|
+
const backend = this.backend;
|
|
140
|
+
const { gl } = backend;
|
|
141
|
+
|
|
142
|
+
const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
|
|
143
|
+
const { bufferGPU } = backend.get( bufferAttribute );
|
|
144
|
+
|
|
145
|
+
const array = attribute.array;
|
|
146
|
+
const byteLength = array.byteLength;
|
|
147
|
+
|
|
148
|
+
gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
|
|
149
|
+
|
|
150
|
+
const writeBuffer = gl.createBuffer();
|
|
151
|
+
|
|
152
|
+
gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
|
|
153
|
+
gl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );
|
|
154
|
+
|
|
155
|
+
gl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );
|
|
156
|
+
|
|
157
|
+
await backend.utils._clientWaitAsync();
|
|
158
|
+
|
|
159
|
+
const dstBuffer = new attribute.array.constructor( array.length );
|
|
160
|
+
|
|
161
|
+
gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
|
|
162
|
+
|
|
163
|
+
gl.deleteBuffer( writeBuffer );
|
|
164
|
+
|
|
165
|
+
return dstBuffer.buffer;
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
117
169
|
}
|
|
118
170
|
|
|
119
171
|
export default WebGLAttributeUtils;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
class WebGLCapabilities {
|
|
2
|
+
|
|
3
|
+
constructor( backend ) {
|
|
4
|
+
|
|
5
|
+
this.backend = backend;
|
|
6
|
+
|
|
7
|
+
this.maxAnisotropy = null;
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
getMaxAnisotropy() {
|
|
12
|
+
|
|
13
|
+
if ( this.maxAnisotropy !== null ) return this.maxAnisotropy;
|
|
14
|
+
|
|
15
|
+
const gl = this.backend.gl;
|
|
16
|
+
const extensions = this.backend.extensions;
|
|
17
|
+
|
|
18
|
+
if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {
|
|
19
|
+
|
|
20
|
+
const extension = extensions.get( 'EXT_texture_filter_anisotropic' );
|
|
21
|
+
|
|
22
|
+
this.maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
|
|
23
|
+
|
|
24
|
+
} else {
|
|
25
|
+
|
|
26
|
+
this.maxAnisotropy = 0;
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return this.maxAnisotropy;
|
|
31
|
+
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export default WebGLCapabilities;
|