super-three 0.157.1 → 0.160.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.
- package/README.md +6 -4
- package/build/three.cjs +3100 -1537
- package/build/three.js +3100 -1537
- package/build/three.min.js +1 -1
- package/build/three.module.js +3093 -1538
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +291 -0
- package/examples/jsm/controls/FlyControls.js +26 -0
- package/examples/jsm/controls/OrbitControls.js +62 -41
- package/examples/jsm/controls/TransformControls.js +27 -11
- package/examples/jsm/csm/CSMShader.js +53 -48
- package/examples/jsm/exporters/GLTFExporter.js +151 -3
- package/examples/jsm/exporters/USDZExporter.js +27 -19
- package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
- package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
- package/examples/jsm/helpers/TextureHelper.js +237 -0
- package/examples/jsm/interactive/HTMLMesh.js +9 -2
- package/examples/jsm/libs/lottie_canvas.module.js +6 -1
- package/examples/jsm/libs/opentype.module.js +13 -75
- package/examples/jsm/libs/surfaceNet.js +201 -0
- 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 +83 -6
- package/examples/jsm/loaders/LUTImageLoader.js +162 -0
- 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/loaders/lwo/IFFParser.js +89 -93
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/math/Capsule.js +0 -55
- package/examples/jsm/math/Octree.js +85 -7
- 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/modifiers/SimplifyModifier.js +103 -11
- package/examples/jsm/modifiers/TessellateModifier.js +3 -3
- package/examples/jsm/nodes/Nodes.js +16 -12
- package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
- package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
- package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
- package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
- package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
- package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
- package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
- package/examples/jsm/nodes/code/CodeNode.js +3 -3
- package/examples/jsm/nodes/code/FunctionNode.js +1 -1
- package/examples/jsm/nodes/core/AssignNode.js +72 -0
- 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/LightingModel.js +3 -1
- package/examples/jsm/nodes/core/Node.js +13 -15
- package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
- 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 +7 -9
- package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
- package/examples/jsm/nodes/core/ParameterNode.js +33 -0
- package/examples/jsm/nodes/core/PropertyNode.js +15 -6
- package/examples/jsm/nodes/core/StackNode.js +7 -17
- package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- 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 +7 -34
- package/examples/jsm/nodes/core/VaryingNode.js +3 -7
- package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
- package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
- 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 +17 -10
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
- package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
- package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
- package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
- package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
- 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 +24 -27
- package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
- package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
- package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
- package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
- package/examples/jsm/nodes/utils/JoinNode.js +11 -1
- package/examples/jsm/nodes/utils/LoopNode.js +36 -24
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +10 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/examples/jsm/objects/InstancedPoints.js +21 -0
- package/examples/jsm/objects/Lensflare.js +20 -0
- package/examples/jsm/objects/QuadMesh.js +60 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
- package/examples/jsm/objects/Refractor.js +3 -0
- package/examples/jsm/objects/Sky.js +5 -3
- package/examples/jsm/objects/Water.js +5 -2
- package/examples/jsm/objects/Water2.js +3 -0
- package/examples/jsm/physics/AmmoPhysics.js +21 -0
- package/examples/jsm/physics/RapierPhysics.js +21 -0
- package/examples/jsm/postprocessing/BokehPass.js +3 -2
- package/examples/jsm/postprocessing/GTAOPass.js +572 -0
- package/examples/jsm/postprocessing/LUTPass.js +2 -1
- package/examples/jsm/postprocessing/OutputPass.js +3 -0
- package/examples/jsm/postprocessing/Pass.js +14 -3
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SMAAPass.js +0 -2
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
- package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
- package/examples/jsm/renderers/SVGRenderer.js +9 -6
- 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 +31 -22
- 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 +21 -2
- package/examples/jsm/renderers/common/RenderObjects.js +5 -3
- 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 +8 -37
- 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 +121 -19
- package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -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/WebGLState.js +14 -2
- 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 +188 -137
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -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/ACESFilmicToneMappingShader.js +2 -0
- package/examples/jsm/shaders/AfterimageShader.js +2 -0
- package/examples/jsm/shaders/BasicShader.js +2 -0
- package/examples/jsm/shaders/BlendShader.js +2 -0
- package/examples/jsm/shaders/BokehShader.js +2 -0
- package/examples/jsm/shaders/BokehShader2.js +4 -0
- package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
- package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
- package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
- package/examples/jsm/shaders/FXAAShader.js +135 -133
- package/examples/jsm/shaders/FilmShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +2 -0
- package/examples/jsm/shaders/FreiChenShader.js +2 -0
- package/examples/jsm/shaders/GTAOShader.js +424 -0
- package/examples/jsm/shaders/GodRaysShader.js +8 -0
- package/examples/jsm/shaders/HalftoneShader.js +2 -0
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/HueSaturationShader.js +2 -0
- package/examples/jsm/shaders/KaleidoShader.js +2 -0
- package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
- package/examples/jsm/shaders/LuminosityShader.js +2 -0
- package/examples/jsm/shaders/MMDToonShader.js +2 -0
- package/examples/jsm/shaders/MirrorShader.js +2 -0
- package/examples/jsm/shaders/NormalMapShader.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +8 -5
- package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
- package/examples/jsm/shaders/SAOShader.js +7 -3
- package/examples/jsm/shaders/SMAAShader.js +6 -0
- package/examples/jsm/shaders/SSAOShader.js +8 -3
- package/examples/jsm/shaders/SSRShader.js +6 -0
- package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
- package/examples/jsm/shaders/TechnicolorShader.js +2 -0
- package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
- package/examples/jsm/shaders/VelocityShader.js +2 -0
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
- package/examples/jsm/transpiler/AST.js +270 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
- package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
- package/examples/jsm/transpiler/TSLEncoder.js +715 -0
- package/examples/jsm/transpiler/Transpiler.js +18 -0
- 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 +24 -9
- package/examples/jsm/webxr/XRButton.js +27 -11
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -6
- package/src/Three.js +1 -0
- package/src/constants.js +8 -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/PMREMGenerator.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/MaterialLoader.js +10 -2
- package/src/loaders/ObjectLoader.js +49 -0
- package/src/materials/Material.js +27 -13
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/Box3.js +35 -18
- 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/math/Vector3.js +11 -12
- package/src/objects/BatchedMesh.js +1020 -0
- package/src/objects/Skeleton.js +1 -3
- package/src/objects/SkinnedMesh.js +6 -7
- package/src/renderers/WebGL3DRenderTarget.js +2 -2
- package/src/renderers/WebGLArrayRenderTarget.js +2 -2
- package/src/renderers/WebGLRenderer.js +165 -43
- package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
- 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/bumpmap_pars_fragment.glsl.js +3 -2
- 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_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
- 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 +4 -2
- 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 +100 -51
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLShadowMap.js +35 -0
- package/src/renderers/webgl/WebGLState.js +25 -4
- 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/nodes/accessors/ExtendedMaterialNode.js +0 -76
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
|
@@ -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
|
|
|
@@ -17,6 +18,8 @@ class WebGLBackend extends Backend {
|
|
|
17
18
|
|
|
18
19
|
super( parameters );
|
|
19
20
|
|
|
21
|
+
this.isWebGLBackend = true;
|
|
22
|
+
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
async init( renderer ) {
|
|
@@ -32,6 +35,7 @@ class WebGLBackend extends Backend {
|
|
|
32
35
|
this.gl = glContext;
|
|
33
36
|
|
|
34
37
|
this.extensions = new WebGLExtensions( this );
|
|
38
|
+
this.capabilities = new WebGLCapabilities( this );
|
|
35
39
|
this.attributeUtils = new WebGLAttributeUtils( this );
|
|
36
40
|
this.textureUtils = new WebGLTextureUtils( this );
|
|
37
41
|
this.state = new WebGLState( this );
|
|
@@ -39,6 +43,7 @@ class WebGLBackend extends Backend {
|
|
|
39
43
|
this.defaultTextures = {};
|
|
40
44
|
|
|
41
45
|
this.extensions.get( 'EXT_color_buffer_float' );
|
|
46
|
+
this._currentContext = null;
|
|
42
47
|
|
|
43
48
|
}
|
|
44
49
|
|
|
@@ -48,60 +53,164 @@ class WebGLBackend extends Backend {
|
|
|
48
53
|
|
|
49
54
|
}
|
|
50
55
|
|
|
56
|
+
async getArrayBufferAsync( attribute ) {
|
|
57
|
+
|
|
58
|
+
return await this.attributeUtils.getArrayBufferAsync( attribute );
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
beginRender( renderContext ) {
|
|
52
63
|
|
|
53
64
|
const { gl } = this;
|
|
65
|
+
const renderContextData = this.get( renderContext );
|
|
54
66
|
|
|
55
67
|
//
|
|
56
68
|
|
|
69
|
+
renderContextData.previousContext = this._currentContext;
|
|
70
|
+
this._currentContext = renderContext;
|
|
71
|
+
|
|
57
72
|
this._setFramebuffer( renderContext );
|
|
58
73
|
|
|
59
|
-
|
|
74
|
+
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
|
|
60
75
|
|
|
61
|
-
|
|
62
|
-
if ( renderContext.clearDepth ) clear |= gl.DEPTH_BUFFER_BIT;
|
|
63
|
-
if ( renderContext.clearStencil ) clear |= gl.STENCIL_BUFFER_BIT;
|
|
76
|
+
//
|
|
64
77
|
|
|
65
|
-
|
|
78
|
+
if ( renderContext.viewport ) {
|
|
66
79
|
|
|
67
|
-
|
|
80
|
+
this.updateViewport( renderContext );
|
|
68
81
|
|
|
69
|
-
|
|
82
|
+
} else {
|
|
70
83
|
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
89
|
+
|
|
90
|
+
if ( occlusionQueryCount > 0 ) {
|
|
91
|
+
|
|
92
|
+
// Get a reference to the array of objects with queries. The renderContextData property
|
|
93
|
+
// can be changed by another render pass before the async reading of all previous queries complete
|
|
94
|
+
renderContextData.currentOcclusionQueries = renderContextData.occlusionQueries;
|
|
95
|
+
renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
|
|
96
|
+
|
|
97
|
+
renderContextData.lastOcclusionObject = null;
|
|
98
|
+
renderContextData.occlusionQueries = new Array( occlusionQueryCount );
|
|
99
|
+
renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
|
|
100
|
+
renderContextData.occlusionQueryIndex = 0;
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
finishRender( renderContext ) {
|
|
107
|
+
|
|
108
|
+
const renderContextData = this.get( renderContext );
|
|
109
|
+
const previousContext = renderContextData.previousContext;
|
|
110
|
+
|
|
111
|
+
this._currentContext = previousContext;
|
|
112
|
+
|
|
113
|
+
if ( previousContext !== null ) {
|
|
114
|
+
|
|
115
|
+
this._setFramebuffer( previousContext );
|
|
116
|
+
|
|
117
|
+
if ( previousContext.viewport ) {
|
|
118
|
+
|
|
119
|
+
this.updateViewport( previousContext );
|
|
73
120
|
|
|
74
121
|
} else {
|
|
75
122
|
|
|
76
|
-
|
|
123
|
+
const gl = this.gl;
|
|
77
124
|
|
|
78
|
-
|
|
125
|
+
gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
|
|
79
126
|
|
|
80
|
-
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
132
|
+
|
|
133
|
+
if ( occlusionQueryCount > 0 ) {
|
|
134
|
+
|
|
135
|
+
const renderContextData = this.get( renderContext );
|
|
136
|
+
|
|
137
|
+
if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
|
|
138
|
+
|
|
139
|
+
const { gl } = this;
|
|
81
140
|
|
|
82
|
-
gl.
|
|
141
|
+
gl.endQuery( gl.ANY_SAMPLES_PASSED );
|
|
83
142
|
|
|
84
143
|
}
|
|
85
144
|
|
|
145
|
+
this.resolveOccludedAsync( renderContext );
|
|
146
|
+
|
|
86
147
|
}
|
|
87
148
|
|
|
88
|
-
|
|
149
|
+
}
|
|
89
150
|
|
|
90
|
-
|
|
151
|
+
resolveOccludedAsync( renderContext ) {
|
|
91
152
|
|
|
92
|
-
|
|
153
|
+
const renderContextData = this.get( renderContext );
|
|
93
154
|
|
|
94
|
-
|
|
155
|
+
// handle occlusion query results
|
|
95
156
|
|
|
96
|
-
|
|
157
|
+
const { currentOcclusionQueries, currentOcclusionQueryObjects } = renderContextData;
|
|
158
|
+
|
|
159
|
+
if ( currentOcclusionQueries && currentOcclusionQueryObjects ) {
|
|
160
|
+
|
|
161
|
+
const occluded = new WeakSet();
|
|
162
|
+
const { gl } = this;
|
|
163
|
+
|
|
164
|
+
renderContextData.currentOcclusionQueryObjects = null;
|
|
165
|
+
renderContextData.currentOcclusionQueries = null;
|
|
166
|
+
|
|
167
|
+
const check = () => {
|
|
168
|
+
|
|
169
|
+
let completed = 0;
|
|
170
|
+
|
|
171
|
+
// check all queries and requeue as appropriate
|
|
172
|
+
for ( let i = 0; i < currentOcclusionQueries.length; i ++ ) {
|
|
173
|
+
|
|
174
|
+
const query = currentOcclusionQueries[ i ];
|
|
175
|
+
|
|
176
|
+
if ( query === null ) continue;
|
|
177
|
+
|
|
178
|
+
if ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {
|
|
179
|
+
|
|
180
|
+
if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) > 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
|
|
181
|
+
|
|
182
|
+
currentOcclusionQueries[ i ] = null;
|
|
183
|
+
gl.deleteQuery( query );
|
|
184
|
+
|
|
185
|
+
completed ++;
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if ( completed < currentOcclusionQueries.length ) {
|
|
192
|
+
|
|
193
|
+
requestAnimationFrame( check );
|
|
194
|
+
|
|
195
|
+
} else {
|
|
196
|
+
|
|
197
|
+
renderContextData.occluded = occluded;
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
check();
|
|
97
204
|
|
|
98
205
|
}
|
|
99
206
|
|
|
100
207
|
}
|
|
101
208
|
|
|
102
|
-
|
|
209
|
+
isOccluded( renderContext, object ) {
|
|
103
210
|
|
|
104
|
-
|
|
211
|
+
const renderContextData = this.get( renderContext );
|
|
212
|
+
|
|
213
|
+
return renderContextData.occluded && renderContextData.occluded.has( object );
|
|
105
214
|
|
|
106
215
|
}
|
|
107
216
|
|
|
@@ -114,9 +223,67 @@ class WebGLBackend extends Backend {
|
|
|
114
223
|
|
|
115
224
|
}
|
|
116
225
|
|
|
117
|
-
clear(
|
|
226
|
+
clear( color, depth, stencil, descriptor = null ) {
|
|
118
227
|
|
|
119
|
-
|
|
228
|
+
const { gl } = this;
|
|
229
|
+
|
|
230
|
+
if ( descriptor === null ) {
|
|
231
|
+
|
|
232
|
+
descriptor = {
|
|
233
|
+
textures: null,
|
|
234
|
+
clearColorValue: this.getClearColor()
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
//
|
|
240
|
+
|
|
241
|
+
let clear = 0;
|
|
242
|
+
|
|
243
|
+
if ( color ) clear |= gl.COLOR_BUFFER_BIT;
|
|
244
|
+
if ( depth ) clear |= gl.DEPTH_BUFFER_BIT;
|
|
245
|
+
if ( stencil ) clear |= gl.STENCIL_BUFFER_BIT;
|
|
246
|
+
|
|
247
|
+
if ( clear !== 0 ) {
|
|
248
|
+
|
|
249
|
+
const clearColor = descriptor.clearColorValue;
|
|
250
|
+
|
|
251
|
+
if ( depth ) this.state.setDepthMask( true );
|
|
252
|
+
|
|
253
|
+
if ( descriptor.textures === null ) {
|
|
254
|
+
|
|
255
|
+
gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
|
|
256
|
+
gl.clear( clear );
|
|
257
|
+
|
|
258
|
+
} else {
|
|
259
|
+
|
|
260
|
+
if ( color ) {
|
|
261
|
+
|
|
262
|
+
for ( let i = 0; i < descriptor.textures.length; i ++ ) {
|
|
263
|
+
|
|
264
|
+
gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if ( depth && stencil ) {
|
|
271
|
+
|
|
272
|
+
gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 0 );
|
|
273
|
+
|
|
274
|
+
} else if ( depth ) {
|
|
275
|
+
|
|
276
|
+
gl.clearBufferfv( gl.DEPTH, 0, [ 1.0 ] );
|
|
277
|
+
|
|
278
|
+
} else if ( stencil ) {
|
|
279
|
+
|
|
280
|
+
gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
|
|
281
|
+
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
}
|
|
120
287
|
|
|
121
288
|
}
|
|
122
289
|
|
|
@@ -140,11 +307,13 @@ class WebGLBackend extends Backend {
|
|
|
140
307
|
|
|
141
308
|
draw( renderObject, info ) {
|
|
142
309
|
|
|
143
|
-
const { pipeline, material } = renderObject;
|
|
310
|
+
const { pipeline, material, context } = renderObject;
|
|
144
311
|
const { programGPU, vaoGPU } = this.get( pipeline );
|
|
145
312
|
|
|
146
313
|
const { gl, state } = this;
|
|
147
314
|
|
|
315
|
+
const contextData = this.get( context );
|
|
316
|
+
|
|
148
317
|
//
|
|
149
318
|
|
|
150
319
|
const bindings = renderObject.getBindings();
|
|
@@ -154,7 +323,7 @@ class WebGLBackend extends Backend {
|
|
|
154
323
|
const bindingData = this.get( binding );
|
|
155
324
|
const index = bindingData.index;
|
|
156
325
|
|
|
157
|
-
if ( binding.isUniformsGroup ) {
|
|
326
|
+
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
158
327
|
|
|
159
328
|
gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
|
|
160
329
|
|
|
@@ -183,23 +352,61 @@ class WebGLBackend extends Backend {
|
|
|
183
352
|
|
|
184
353
|
//
|
|
185
354
|
|
|
355
|
+
const lastObject = contextData.lastOcclusionObject;
|
|
356
|
+
|
|
357
|
+
if ( lastObject !== object && lastObject !== undefined ) {
|
|
358
|
+
|
|
359
|
+
if ( lastObject !== null && lastObject.occlusionTest === true ) {
|
|
360
|
+
|
|
361
|
+
gl.endQuery( gl.ANY_SAMPLES_PASSED );
|
|
362
|
+
|
|
363
|
+
contextData.occlusionQueryIndex ++;
|
|
364
|
+
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if ( object.occlusionTest === true ) {
|
|
368
|
+
|
|
369
|
+
const query = gl.createQuery();
|
|
370
|
+
|
|
371
|
+
gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
|
|
372
|
+
|
|
373
|
+
contextData.occlusionQueries[ contextData.occlusionQueryIndex ] = query;
|
|
374
|
+
contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
|
|
375
|
+
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
contextData.lastOcclusionObject = object;
|
|
379
|
+
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
//
|
|
383
|
+
|
|
186
384
|
let mode;
|
|
187
385
|
if ( object.isPoints ) mode = gl.POINTS;
|
|
188
|
-
else if ( object.isLine ) mode = gl.LINES;
|
|
189
|
-
else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
|
|
190
386
|
else if ( object.isLineSegments ) mode = gl.LINES;
|
|
387
|
+
else if ( object.isLine ) mode = gl.LINE_STRIP;
|
|
388
|
+
else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
|
|
191
389
|
else mode = gl.TRIANGLES;
|
|
192
390
|
|
|
193
391
|
//
|
|
194
392
|
|
|
393
|
+
const instanceCount = this.getInstanceCount( renderObject );
|
|
195
394
|
|
|
196
395
|
if ( index !== null ) {
|
|
197
396
|
|
|
198
397
|
const indexData = this.get( index );
|
|
199
|
-
|
|
200
398
|
const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
|
|
201
399
|
|
|
202
|
-
|
|
400
|
+
if ( instanceCount > 1 ) {
|
|
401
|
+
|
|
402
|
+
gl.drawElementsInstanced( mode, index.count, indexData.type, firstVertex, instanceCount );
|
|
403
|
+
|
|
404
|
+
} else {
|
|
405
|
+
|
|
406
|
+
gl.drawElements( mode, index.count, indexData.type, firstVertex );
|
|
407
|
+
|
|
408
|
+
}
|
|
409
|
+
|
|
203
410
|
|
|
204
411
|
info.update( object, indexCount, 1 );
|
|
205
412
|
|
|
@@ -208,8 +415,16 @@ class WebGLBackend extends Backend {
|
|
|
208
415
|
const positionAttribute = geometry.attributes.position;
|
|
209
416
|
const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
|
|
210
417
|
|
|
418
|
+
if ( instanceCount > 1 ) {
|
|
419
|
+
|
|
420
|
+
gl.drawArraysInstanced( mode, 0, vertexCount, instanceCount );
|
|
421
|
+
|
|
422
|
+
} else {
|
|
423
|
+
|
|
424
|
+
gl.drawArrays( mode, 0, vertexCount );
|
|
425
|
+
|
|
426
|
+
}
|
|
211
427
|
|
|
212
|
-
gl.drawArrays( mode, 0, vertexCount );
|
|
213
428
|
//gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
|
|
214
429
|
|
|
215
430
|
info.update( object, vertexCount, 1 );
|
|
@@ -224,15 +439,15 @@ class WebGLBackend extends Backend {
|
|
|
224
439
|
|
|
225
440
|
}
|
|
226
441
|
|
|
227
|
-
|
|
442
|
+
needsRenderUpdate( renderObject ) {
|
|
228
443
|
|
|
229
444
|
return false;
|
|
230
445
|
|
|
231
446
|
}
|
|
232
447
|
|
|
233
|
-
|
|
448
|
+
getRenderCacheKey( renderObject ) {
|
|
234
449
|
|
|
235
|
-
return
|
|
450
|
+
return renderObject.id;
|
|
236
451
|
|
|
237
452
|
}
|
|
238
453
|
|
|
@@ -244,12 +459,6 @@ class WebGLBackend extends Backend {
|
|
|
244
459
|
|
|
245
460
|
}
|
|
246
461
|
|
|
247
|
-
destroySampler( /*texture*/ ) {
|
|
248
|
-
|
|
249
|
-
console.warn( 'Abstract class.' );
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
|
|
253
462
|
createDefaultTexture( texture ) {
|
|
254
463
|
|
|
255
464
|
const { gl, textureUtils, defaultTextures } = this;
|
|
@@ -283,7 +492,7 @@ class WebGLBackend extends Backend {
|
|
|
283
492
|
createTexture( texture, options ) {
|
|
284
493
|
|
|
285
494
|
const { gl, utils, textureUtils } = this;
|
|
286
|
-
const { levels, width, height } = options;
|
|
495
|
+
const { levels, width, height, depth } = options;
|
|
287
496
|
|
|
288
497
|
const glFormat = utils.convert( texture.format, texture.colorSpace );
|
|
289
498
|
const glType = utils.convert( texture.type );
|
|
@@ -303,7 +512,11 @@ class WebGLBackend extends Backend {
|
|
|
303
512
|
|
|
304
513
|
gl.bindTexture( glTextureType, textureGPU );
|
|
305
514
|
|
|
306
|
-
if (
|
|
515
|
+
if ( texture.isDataArrayTexture ) {
|
|
516
|
+
|
|
517
|
+
gl.texStorage3D( gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, width, height, depth );
|
|
518
|
+
|
|
519
|
+
} else if ( ! texture.isVideoTexture ) {
|
|
307
520
|
|
|
308
521
|
gl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );
|
|
309
522
|
|
|
@@ -331,7 +544,7 @@ class WebGLBackend extends Backend {
|
|
|
331
544
|
|
|
332
545
|
return source.image.data;
|
|
333
546
|
|
|
334
|
-
} else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas ) {
|
|
547
|
+
} else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas || source instanceof HTMLImageElement || source instanceof HTMLCanvasElement ) {
|
|
335
548
|
|
|
336
549
|
return source;
|
|
337
550
|
|
|
@@ -355,6 +568,12 @@ class WebGLBackend extends Backend {
|
|
|
355
568
|
|
|
356
569
|
}
|
|
357
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
|
+
|
|
358
577
|
} else if ( texture.isVideoTexture ) {
|
|
359
578
|
|
|
360
579
|
texture.update();
|
|
@@ -382,15 +601,22 @@ class WebGLBackend extends Backend {
|
|
|
382
601
|
|
|
383
602
|
}
|
|
384
603
|
|
|
385
|
-
destroyTexture(
|
|
604
|
+
destroyTexture( texture ) {
|
|
386
605
|
|
|
387
|
-
|
|
606
|
+
const { gl } = this;
|
|
607
|
+
const { textureGPU } = this.get( texture );
|
|
608
|
+
|
|
609
|
+
gl.deleteTexture( textureGPU );
|
|
610
|
+
|
|
611
|
+
this.delete( texture );
|
|
388
612
|
|
|
389
613
|
}
|
|
390
614
|
|
|
391
|
-
|
|
615
|
+
destroySampler() {}
|
|
392
616
|
|
|
393
|
-
|
|
617
|
+
copyTextureToBuffer( texture, x, y, width, height ) {
|
|
618
|
+
|
|
619
|
+
return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
|
|
394
620
|
|
|
395
621
|
}
|
|
396
622
|
|
|
@@ -414,12 +640,6 @@ class WebGLBackend extends Backend {
|
|
|
414
640
|
gl.shaderSource( shader, code );
|
|
415
641
|
gl.compileShader( shader );
|
|
416
642
|
|
|
417
|
-
if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
|
|
418
|
-
|
|
419
|
-
console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( shader ) );
|
|
420
|
-
|
|
421
|
-
}
|
|
422
|
-
|
|
423
643
|
this.set( program, {
|
|
424
644
|
shaderGPU: shader
|
|
425
645
|
} );
|
|
@@ -442,14 +662,21 @@ class WebGLBackend extends Backend {
|
|
|
442
662
|
const { fragmentProgram, vertexProgram } = pipeline;
|
|
443
663
|
|
|
444
664
|
const programGPU = gl.createProgram();
|
|
445
|
-
|
|
446
|
-
|
|
665
|
+
|
|
666
|
+
const fragmentShader = this.get( fragmentProgram ).shaderGPU;
|
|
667
|
+
const vertexShader = this.get( vertexProgram ).shaderGPU;
|
|
668
|
+
|
|
669
|
+
gl.attachShader( programGPU, fragmentShader );
|
|
670
|
+
gl.attachShader( programGPU, vertexShader );
|
|
447
671
|
gl.linkProgram( programGPU );
|
|
448
672
|
|
|
449
673
|
if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
|
|
450
674
|
|
|
451
675
|
console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
|
|
452
676
|
|
|
677
|
+
console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( fragmentShader ) );
|
|
678
|
+
console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( vertexShader ) );
|
|
679
|
+
|
|
453
680
|
}
|
|
454
681
|
|
|
455
682
|
gl.useProgram( programGPU );
|
|
@@ -463,7 +690,7 @@ class WebGLBackend extends Backend {
|
|
|
463
690
|
const bindingData = this.get( binding );
|
|
464
691
|
const index = bindingData.index;
|
|
465
692
|
|
|
466
|
-
if ( binding.isUniformsGroup ) {
|
|
693
|
+
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
467
694
|
|
|
468
695
|
const location = gl.getUniformBlockIndex( programGPU, binding.name );
|
|
469
696
|
gl.uniformBlockBinding( programGPU, location, index );
|
|
@@ -482,7 +709,7 @@ class WebGLBackend extends Backend {
|
|
|
482
709
|
const vaoGPU = gl.createVertexArray();
|
|
483
710
|
|
|
484
711
|
const index = renderObject.getIndex();
|
|
485
|
-
const
|
|
712
|
+
const attributes = renderObject.getAttributes();
|
|
486
713
|
|
|
487
714
|
gl.bindVertexArray( vaoGPU );
|
|
488
715
|
|
|
@@ -494,14 +721,47 @@ class WebGLBackend extends Backend {
|
|
|
494
721
|
|
|
495
722
|
}
|
|
496
723
|
|
|
497
|
-
for ( let i = 0; i <
|
|
724
|
+
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
498
725
|
|
|
499
|
-
const attribute =
|
|
726
|
+
const attribute = attributes[ i ];
|
|
500
727
|
const attributeData = this.get( attribute );
|
|
501
728
|
|
|
502
729
|
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
503
730
|
gl.enableVertexAttribArray( i );
|
|
504
|
-
|
|
731
|
+
|
|
732
|
+
let stride, offset;
|
|
733
|
+
|
|
734
|
+
if ( attribute.isInterleavedBufferAttribute === true ) {
|
|
735
|
+
|
|
736
|
+
stride = attribute.data.stride * attributeData.bytesPerElement;
|
|
737
|
+
offset = attribute.offset * attributeData.bytesPerElement;
|
|
738
|
+
|
|
739
|
+
} else {
|
|
740
|
+
|
|
741
|
+
stride = 0;
|
|
742
|
+
offset = 0;
|
|
743
|
+
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
if ( attributeData.isInteger ) {
|
|
747
|
+
|
|
748
|
+
gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
|
|
749
|
+
|
|
750
|
+
} else {
|
|
751
|
+
|
|
752
|
+
gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
|
|
753
|
+
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {
|
|
757
|
+
|
|
758
|
+
gl.vertexAttribDivisor( i, attribute.meshPerAttribute );
|
|
759
|
+
|
|
760
|
+
} else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {
|
|
761
|
+
|
|
762
|
+
gl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );
|
|
763
|
+
|
|
764
|
+
}
|
|
505
765
|
|
|
506
766
|
}
|
|
507
767
|
|
|
@@ -537,7 +797,7 @@ class WebGLBackend extends Backend {
|
|
|
537
797
|
|
|
538
798
|
for ( const binding of bindings ) {
|
|
539
799
|
|
|
540
|
-
if ( binding.isUniformsGroup ) {
|
|
800
|
+
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
541
801
|
|
|
542
802
|
const bufferGPU = gl.createBuffer();
|
|
543
803
|
const data = binding.buffer;
|
|
@@ -571,7 +831,7 @@ class WebGLBackend extends Backend {
|
|
|
571
831
|
|
|
572
832
|
const gl = this.gl;
|
|
573
833
|
|
|
574
|
-
if ( binding.isUniformsGroup ) {
|
|
834
|
+
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
575
835
|
|
|
576
836
|
const bindingData = this.get( binding );
|
|
577
837
|
const bufferGPU = bindingData.bufferGPU;
|
|
@@ -608,9 +868,9 @@ class WebGLBackend extends Backend {
|
|
|
608
868
|
|
|
609
869
|
}
|
|
610
870
|
|
|
611
|
-
updateAttribute(
|
|
871
|
+
updateAttribute( attribute ) {
|
|
612
872
|
|
|
613
|
-
|
|
873
|
+
this.attributeUtils.updateAttribute( attribute );
|
|
614
874
|
|
|
615
875
|
}
|
|
616
876
|
|
|
@@ -626,15 +886,54 @@ class WebGLBackend extends Backend {
|
|
|
626
886
|
|
|
627
887
|
}
|
|
628
888
|
|
|
629
|
-
hasFeature( name ) {
|
|
889
|
+
hasFeature( /*name*/ ) {
|
|
630
890
|
|
|
631
891
|
return true;
|
|
632
892
|
|
|
633
893
|
}
|
|
634
894
|
|
|
635
|
-
|
|
895
|
+
getMaxAnisotropy() {
|
|
636
896
|
|
|
637
|
-
|
|
897
|
+
return this.capabilities.getMaxAnisotropy();
|
|
898
|
+
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
copyFramebufferToTexture( texture, renderContext ) {
|
|
902
|
+
|
|
903
|
+
const { gl } = this;
|
|
904
|
+
|
|
905
|
+
const { textureGPU } = this.get( texture );
|
|
906
|
+
|
|
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();
|
|
915
|
+
|
|
916
|
+
gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
917
|
+
|
|
918
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureGPU, 0 );
|
|
919
|
+
|
|
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 );
|
|
638
937
|
|
|
639
938
|
}
|
|
640
939
|
|
|
@@ -644,7 +943,7 @@ class WebGLBackend extends Backend {
|
|
|
644
943
|
|
|
645
944
|
if ( renderContext.textures !== null ) {
|
|
646
945
|
|
|
647
|
-
const renderContextData = this.get( renderContext );
|
|
946
|
+
const renderContextData = this.get( renderContext.renderTarget );
|
|
648
947
|
|
|
649
948
|
let fb = renderContextData.framebuffer;
|
|
650
949
|
|
|
@@ -658,7 +957,7 @@ class WebGLBackend extends Backend {
|
|
|
658
957
|
|
|
659
958
|
const drawBuffers = [];
|
|
660
959
|
|
|
661
|
-
for ( let i = 0; i < textures.length; i++ ) {
|
|
960
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
662
961
|
|
|
663
962
|
const texture = textures[ i ];
|
|
664
963
|
const { textureGPU } = this.get( texture );
|