super-three 0.157.0 → 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.
- package/README.md +6 -4
- package/build/three.cjs +1486 -842
- package/build/three.js +1486 -842
- package/build/three.min.js +1 -1
- package/build/three.module.js +1481 -843
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +290 -0
- package/examples/jsm/controls/FlyControls.js +26 -0
- package/examples/jsm/controls/OrbitControls.js +12 -1
- package/examples/jsm/controls/TransformControls.js +27 -11
- package/examples/jsm/csm/CSMShader.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +72 -2
- package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
- package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
- 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/loaders/GLTFLoader.js +12 -3
- package/examples/jsm/loaders/LUTImageLoader.js +162 -0
- 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 +70 -3
- package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
- package/examples/jsm/modifiers/TessellateModifier.js +3 -3
- package/examples/jsm/nodes/Nodes.js +6 -6
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
- 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/ModelNode.js +1 -2
- package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
- package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
- package/examples/jsm/nodes/accessors/TextureNode.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/LightingModel.js +3 -1
- package/examples/jsm/nodes/core/Node.js +7 -12
- package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
- package/examples/jsm/nodes/core/NodeUtils.js +4 -2
- package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
- package/examples/jsm/nodes/core/ParameterNode.js +33 -0
- package/examples/jsm/nodes/core/PropertyNode.js +4 -10
- package/examples/jsm/nodes/core/StackNode.js +7 -17
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/VarNode.js +6 -35
- package/examples/jsm/nodes/core/VaryingNode.js +2 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
- package/examples/jsm/nodes/display/ViewportNode.js +14 -4
- 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 +19 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
- package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
- package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
- 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 +70 -71
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
- 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 +17 -20
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
- package/examples/jsm/nodes/math/OperatorNode.js +5 -21
- package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
- package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
- package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
- package/examples/jsm/nodes/utils/JoinNode.js +11 -1
- package/examples/jsm/nodes/utils/LoopNode.js +36 -24
- package/examples/jsm/nodes/utils/SplitNode.js +2 -0
- package/examples/jsm/objects/BatchedMesh.js +586 -0
- package/examples/jsm/objects/InstancedPoints.js +21 -0
- package/examples/jsm/objects/Lensflare.js +20 -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/LUTPass.js +2 -1
- package/examples/jsm/postprocessing/OutputPass.js +1 -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/Bindings.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +8 -1
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +4 -36
- package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
- 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 +2 -0
- 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/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 +4 -5
- package/examples/jsm/shaders/SAOShader.js +5 -0
- package/examples/jsm/shaders/SMAAShader.js +6 -0
- package/examples/jsm/shaders/SSAOShader.js +6 -0
- 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 +231 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
- package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
- package/examples/jsm/transpiler/TSLEncoder.js +611 -0
- package/examples/jsm/transpiler/Transpiler.js +18 -0
- package/examples/jsm/webxr/VRButton.js +1 -1
- package/examples/jsm/webxr/XRButton.js +7 -5
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +4 -1
- package/src/constants.js +7 -1
- package/src/extras/PMREMGenerator.js +7 -1
- package/src/loaders/MaterialLoader.js +10 -2
- package/src/materials/Material.js +27 -13
- package/src/math/Box3.js +35 -18
- package/src/math/Vector3.js +11 -12
- package/src/objects/SkinnedMesh.js +6 -7
- package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
- package/src/renderers/WebGLRenderer.js +199 -45
- package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
- package/src/renderers/webgl/WebGLBackground.js +1 -1
- package/src/renderers/webgl/WebGLMultiview.js +100 -0
- package/src/renderers/webgl/WebGLProgram.js +130 -50
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLState.js +25 -4
- package/src/renderers/webgl/WebGLTextures.js +197 -20
- package/src/renderers/webxr/WebXRManager.js +36 -12
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
- 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
|
-
|
|
66
|
+
this.clear( renderContext, renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil );
|
|
60
67
|
|
|
61
|
-
|
|
62
|
-
if ( renderContext.clearDepth ) clear |= gl.DEPTH_BUFFER_BIT;
|
|
63
|
-
if ( renderContext.clearStencil ) clear |= gl.STENCIL_BUFFER_BIT;
|
|
68
|
+
//
|
|
64
69
|
|
|
65
|
-
|
|
70
|
+
if ( renderContext.viewport ) {
|
|
66
71
|
|
|
67
|
-
|
|
72
|
+
this.updateViewport( renderContext );
|
|
68
73
|
|
|
69
|
-
|
|
74
|
+
} else {
|
|
70
75
|
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
115
|
+
const gl = this.gl;
|
|
77
116
|
|
|
78
|
-
|
|
117
|
+
gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
|
|
79
118
|
|
|
80
|
-
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
81
124
|
|
|
82
|
-
|
|
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
|
-
|
|
143
|
+
resolveOccludedAsync( renderContext ) {
|
|
91
144
|
|
|
92
|
-
|
|
145
|
+
const renderContextData = this.get( renderContext );
|
|
93
146
|
|
|
94
|
-
|
|
147
|
+
// handle occlusion query results
|
|
95
148
|
|
|
96
|
-
|
|
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
|
-
|
|
201
|
+
isOccluded( renderContext, object ) {
|
|
103
202
|
|
|
104
|
-
|
|
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(
|
|
218
|
+
clear( renderContext, color, depth, stencil ) {
|
|
118
219
|
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
446
|
-
|
|
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
|
|
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 <
|
|
694
|
+
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
498
695
|
|
|
499
|
-
const attribute =
|
|
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
|
-
|
|
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(
|
|
841
|
+
updateAttribute( attribute ) {
|
|
612
842
|
|
|
613
|
-
|
|
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(
|
|
865
|
+
copyFramebufferToTexture( texture /*, renderContext */ ) {
|
|
636
866
|
|
|
637
|
-
|
|
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
|
|