super-three 0.162.0 → 0.163.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/build/three.cjs +407 -1014
- package/build/three.module.js +406 -1013
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/TransformControls.js +3 -3
- package/examples/jsm/exporters/GLTFExporter.js +21 -4
- package/examples/jsm/exporters/USDZExporter.js +15 -0
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +89 -19
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +6 -0
- package/examples/jsm/loaders/KTX2Loader.js +2 -6
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/nodes/Nodes.js +6 -1
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +30 -7
- package/examples/jsm/nodes/core/Node.js +55 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +21 -16
- package/examples/jsm/nodes/core/NodeFrame.js +10 -10
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- package/examples/jsm/nodes/display/PassNode.js +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
- package/examples/jsm/nodes/fog/FogNode.js +13 -3
- package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +12 -69
- package/examples/jsm/nodes/materials/NodeMaterial.js +33 -11
- package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +1 -1
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAOPass.js +0 -3
- package/examples/jsm/renderers/common/Animation.js +3 -0
- package/examples/jsm/renderers/common/Background.js +5 -5
- package/examples/jsm/renderers/common/Info.js +11 -19
- package/examples/jsm/renderers/common/PostProcessing.js +12 -4
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +4 -4
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Renderer.js +25 -8
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +777 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +5 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +148 -24
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +141 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +3 -3
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +43 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +54 -25
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +5 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +25 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/package.json +1 -1
- package/src/Three.js +0 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +3 -3
- package/src/core/Object3D.js +10 -7
- package/src/extras/PMREMGenerator.js +9 -0
- package/src/loaders/ObjectLoader.js +2 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Spherical.js +4 -5
- package/src/objects/BatchedMesh.js +4 -3
- package/src/objects/InstancedMesh.js +10 -0
- package/src/renderers/WebGLRenderer.js +55 -114
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLCapabilities.js +2 -12
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +3 -25
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +2 -3
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
- package/src/renderers/webgl/WebGLProgram.js +18 -47
- package/src/renderers/webgl/WebGLPrograms.js +20 -32
- package/src/renderers/webgl/WebGLRenderStates.js +8 -6
- package/src/renderers/webgl/WebGLState.js +15 -59
- package/src/renderers/webgl/WebGLTextures.js +75 -237
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +6 -57
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/scenes/Scene.js +7 -1
- package/src/textures/Texture.js +11 -1
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/src/renderers/WebGL1Renderer.js +0 -7
|
@@ -3,296 +3,158 @@ import { DataArrayTexture } from '../../textures/DataArrayTexture.js';
|
|
|
3
3
|
import { Vector4 } from '../../math/Vector4.js';
|
|
4
4
|
import { Vector2 } from '../../math/Vector2.js';
|
|
5
5
|
|
|
6
|
-
function numericalSort( a, b ) {
|
|
7
|
-
|
|
8
|
-
return a[ 0 ] - b[ 0 ];
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function absNumericalSort( a, b ) {
|
|
13
|
-
|
|
14
|
-
return Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
6
|
function WebGLMorphtargets( gl, capabilities, textures ) {
|
|
19
7
|
|
|
20
|
-
const influencesList = {};
|
|
21
|
-
const morphInfluences = new Float32Array( 8 );
|
|
22
8
|
const morphTextures = new WeakMap();
|
|
23
9
|
const morph = new Vector4();
|
|
24
10
|
|
|
25
|
-
const workInfluences = [];
|
|
26
|
-
|
|
27
|
-
for ( let i = 0; i < 8; i ++ ) {
|
|
28
|
-
|
|
29
|
-
workInfluences[ i ] = [ i, 0 ];
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
11
|
function update( object, geometry, program ) {
|
|
34
12
|
|
|
35
13
|
const objectInfluences = object.morphTargetInfluences;
|
|
36
14
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// instead of using attributes, the WebGL 2 code path encodes morph targets
|
|
40
|
-
// into an array of data textures. Each layer represents a single morph target.
|
|
41
|
-
|
|
42
|
-
const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
|
|
43
|
-
const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
|
|
44
|
-
|
|
45
|
-
let entry = morphTextures.get( geometry );
|
|
46
|
-
|
|
47
|
-
if ( entry === undefined || entry.count !== morphTargetsCount ) {
|
|
48
|
-
|
|
49
|
-
if ( entry !== undefined ) entry.texture.dispose();
|
|
50
|
-
|
|
51
|
-
const hasMorphPosition = geometry.morphAttributes.position !== undefined;
|
|
52
|
-
const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
|
|
53
|
-
const hasMorphColors = geometry.morphAttributes.color !== undefined;
|
|
54
|
-
|
|
55
|
-
const morphTargets = geometry.morphAttributes.position || [];
|
|
56
|
-
const morphNormals = geometry.morphAttributes.normal || [];
|
|
57
|
-
const morphColors = geometry.morphAttributes.color || [];
|
|
58
|
-
|
|
59
|
-
let vertexDataCount = 0;
|
|
60
|
-
|
|
61
|
-
if ( hasMorphPosition === true ) vertexDataCount = 1;
|
|
62
|
-
if ( hasMorphNormals === true ) vertexDataCount = 2;
|
|
63
|
-
if ( hasMorphColors === true ) vertexDataCount = 3;
|
|
15
|
+
// instead of using attributes, the WebGL 2 code path encodes morph targets
|
|
16
|
+
// into an array of data textures. Each layer represents a single morph target.
|
|
64
17
|
|
|
65
|
-
|
|
66
|
-
|
|
18
|
+
const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
|
|
19
|
+
const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
|
|
67
20
|
|
|
68
|
-
|
|
21
|
+
let entry = morphTextures.get( geometry );
|
|
69
22
|
|
|
70
|
-
|
|
71
|
-
width = capabilities.maxTextureSize;
|
|
23
|
+
if ( entry === undefined || entry.count !== morphTargetsCount ) {
|
|
72
24
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
|
|
25
|
+
if ( entry !== undefined ) entry.texture.dispose();
|
|
76
26
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
27
|
+
const hasMorphPosition = geometry.morphAttributes.position !== undefined;
|
|
28
|
+
const hasMorphNormals = geometry.morphAttributes.normal !== undefined;
|
|
29
|
+
const hasMorphColors = geometry.morphAttributes.color !== undefined;
|
|
80
30
|
|
|
81
|
-
|
|
31
|
+
const morphTargets = geometry.morphAttributes.position || [];
|
|
32
|
+
const morphNormals = geometry.morphAttributes.normal || [];
|
|
33
|
+
const morphColors = geometry.morphAttributes.color || [];
|
|
82
34
|
|
|
83
|
-
|
|
35
|
+
let vertexDataCount = 0;
|
|
84
36
|
|
|
85
|
-
|
|
37
|
+
if ( hasMorphPosition === true ) vertexDataCount = 1;
|
|
38
|
+
if ( hasMorphNormals === true ) vertexDataCount = 2;
|
|
39
|
+
if ( hasMorphColors === true ) vertexDataCount = 3;
|
|
86
40
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const morphColor = morphColors[ i ];
|
|
41
|
+
let width = geometry.attributes.position.count * vertexDataCount;
|
|
42
|
+
let height = 1;
|
|
90
43
|
|
|
91
|
-
|
|
44
|
+
if ( width > capabilities.maxTextureSize ) {
|
|
92
45
|
|
|
93
|
-
|
|
46
|
+
height = Math.ceil( width / capabilities.maxTextureSize );
|
|
47
|
+
width = capabilities.maxTextureSize;
|
|
94
48
|
|
|
95
|
-
|
|
49
|
+
}
|
|
96
50
|
|
|
97
|
-
|
|
51
|
+
const buffer = new Float32Array( width * height * 4 * morphTargetsCount );
|
|
98
52
|
|
|
99
|
-
|
|
53
|
+
const texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );
|
|
54
|
+
texture.type = FloatType;
|
|
55
|
+
texture.needsUpdate = true;
|
|
100
56
|
|
|
101
|
-
|
|
102
|
-
buffer[ offset + stride + 1 ] = morph.y;
|
|
103
|
-
buffer[ offset + stride + 2 ] = morph.z;
|
|
104
|
-
buffer[ offset + stride + 3 ] = 0;
|
|
57
|
+
// fill buffer
|
|
105
58
|
|
|
106
|
-
|
|
59
|
+
const vertexDataStride = vertexDataCount * 4;
|
|
107
60
|
|
|
108
|
-
|
|
61
|
+
for ( let i = 0; i < morphTargetsCount; i ++ ) {
|
|
109
62
|
|
|
110
|
-
|
|
63
|
+
const morphTarget = morphTargets[ i ];
|
|
64
|
+
const morphNormal = morphNormals[ i ];
|
|
65
|
+
const morphColor = morphColors[ i ];
|
|
111
66
|
|
|
112
|
-
|
|
113
|
-
buffer[ offset + stride + 5 ] = morph.y;
|
|
114
|
-
buffer[ offset + stride + 6 ] = morph.z;
|
|
115
|
-
buffer[ offset + stride + 7 ] = 0;
|
|
67
|
+
const offset = width * height * 4 * i;
|
|
116
68
|
|
|
117
|
-
|
|
69
|
+
for ( let j = 0; j < morphTarget.count; j ++ ) {
|
|
118
70
|
|
|
119
|
-
|
|
71
|
+
const stride = j * vertexDataStride;
|
|
120
72
|
|
|
121
|
-
|
|
73
|
+
if ( hasMorphPosition === true ) {
|
|
122
74
|
|
|
123
|
-
|
|
124
|
-
buffer[ offset + stride + 9 ] = morph.y;
|
|
125
|
-
buffer[ offset + stride + 10 ] = morph.z;
|
|
126
|
-
buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
|
|
75
|
+
morph.fromBufferAttribute( morphTarget, j );
|
|
127
76
|
|
|
128
|
-
|
|
77
|
+
buffer[ offset + stride + 0 ] = morph.x;
|
|
78
|
+
buffer[ offset + stride + 1 ] = morph.y;
|
|
79
|
+
buffer[ offset + stride + 2 ] = morph.z;
|
|
80
|
+
buffer[ offset + stride + 3 ] = 0;
|
|
129
81
|
|
|
130
82
|
}
|
|
131
83
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
entry = {
|
|
135
|
-
count: morphTargetsCount,
|
|
136
|
-
texture: texture,
|
|
137
|
-
size: new Vector2( width, height )
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
morphTextures.set( geometry, entry );
|
|
141
|
-
|
|
142
|
-
function disposeTexture() {
|
|
143
|
-
|
|
144
|
-
texture.dispose();
|
|
145
|
-
|
|
146
|
-
morphTextures.delete( geometry );
|
|
147
|
-
|
|
148
|
-
geometry.removeEventListener( 'dispose', disposeTexture );
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
geometry.addEventListener( 'dispose', disposeTexture );
|
|
84
|
+
if ( hasMorphNormals === true ) {
|
|
153
85
|
|
|
154
|
-
|
|
86
|
+
morph.fromBufferAttribute( morphNormal, j );
|
|
155
87
|
|
|
156
|
-
|
|
157
|
-
|
|
88
|
+
buffer[ offset + stride + 4 ] = morph.x;
|
|
89
|
+
buffer[ offset + stride + 5 ] = morph.y;
|
|
90
|
+
buffer[ offset + stride + 6 ] = morph.z;
|
|
91
|
+
buffer[ offset + stride + 7 ] = 0;
|
|
158
92
|
|
|
159
|
-
|
|
93
|
+
}
|
|
160
94
|
|
|
161
|
-
|
|
95
|
+
if ( hasMorphColors === true ) {
|
|
162
96
|
|
|
163
|
-
|
|
97
|
+
morph.fromBufferAttribute( morphColor, j );
|
|
164
98
|
|
|
165
|
-
|
|
99
|
+
buffer[ offset + stride + 8 ] = morph.x;
|
|
100
|
+
buffer[ offset + stride + 9 ] = morph.y;
|
|
101
|
+
buffer[ offset + stride + 10 ] = morph.z;
|
|
102
|
+
buffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;
|
|
166
103
|
|
|
167
|
-
|
|
104
|
+
}
|
|
168
105
|
|
|
169
106
|
}
|
|
170
107
|
|
|
171
|
-
const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
|
|
175
|
-
program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
|
|
176
|
-
|
|
177
108
|
}
|
|
178
109
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
// When object doesn't have morph target influences defined, we treat it as a 0-length array
|
|
185
|
-
// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences
|
|
110
|
+
entry = {
|
|
111
|
+
count: morphTargetsCount,
|
|
112
|
+
texture: texture,
|
|
113
|
+
size: new Vector2( width, height )
|
|
114
|
+
};
|
|
186
115
|
|
|
187
|
-
|
|
116
|
+
morphTextures.set( geometry, entry );
|
|
188
117
|
|
|
189
|
-
|
|
118
|
+
function disposeTexture() {
|
|
190
119
|
|
|
191
|
-
|
|
120
|
+
texture.dispose();
|
|
192
121
|
|
|
193
|
-
|
|
122
|
+
morphTextures.delete( geometry );
|
|
194
123
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
for ( let i = 0; i < length; i ++ ) {
|
|
198
|
-
|
|
199
|
-
influences[ i ] = [ i, 0 ];
|
|
200
|
-
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
influencesList[ geometry.id ] = influences;
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Collect influences
|
|
208
|
-
|
|
209
|
-
for ( let i = 0; i < length; i ++ ) {
|
|
210
|
-
|
|
211
|
-
const influence = influences[ i ];
|
|
212
|
-
|
|
213
|
-
influence[ 0 ] = i;
|
|
214
|
-
influence[ 1 ] = objectInfluences[ i ];
|
|
124
|
+
geometry.removeEventListener( 'dispose', disposeTexture );
|
|
215
125
|
|
|
216
126
|
}
|
|
217
127
|
|
|
218
|
-
|
|
128
|
+
geometry.addEventListener( 'dispose', disposeTexture );
|
|
219
129
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if ( i < length && influences[ i ][ 1 ] ) {
|
|
223
|
-
|
|
224
|
-
workInfluences[ i ][ 0 ] = influences[ i ][ 0 ];
|
|
225
|
-
workInfluences[ i ][ 1 ] = influences[ i ][ 1 ];
|
|
226
|
-
|
|
227
|
-
} else {
|
|
228
|
-
|
|
229
|
-
workInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;
|
|
230
|
-
workInfluences[ i ][ 1 ] = 0;
|
|
231
|
-
|
|
232
|
-
}
|
|
130
|
+
}
|
|
233
131
|
|
|
234
|
-
|
|
132
|
+
//
|
|
133
|
+
if ( object.isInstancedMesh === true && object.morphTexture !== null ) {
|
|
235
134
|
|
|
236
|
-
|
|
135
|
+
program.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );
|
|
237
136
|
|
|
238
|
-
|
|
239
|
-
const morphNormals = geometry.morphAttributes.normal;
|
|
137
|
+
} else {
|
|
240
138
|
|
|
241
139
|
let morphInfluencesSum = 0;
|
|
242
140
|
|
|
243
|
-
for ( let i = 0; i <
|
|
244
|
-
|
|
245
|
-
const influence = workInfluences[ i ];
|
|
246
|
-
const index = influence[ 0 ];
|
|
247
|
-
const value = influence[ 1 ];
|
|
248
|
-
|
|
249
|
-
if ( index !== Number.MAX_SAFE_INTEGER && value ) {
|
|
141
|
+
for ( let i = 0; i < objectInfluences.length; i ++ ) {
|
|
250
142
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
geometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {
|
|
258
|
-
|
|
259
|
-
geometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );
|
|
260
|
-
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
morphInfluences[ i ] = value;
|
|
264
|
-
morphInfluencesSum += value;
|
|
265
|
-
|
|
266
|
-
} else {
|
|
267
|
-
|
|
268
|
-
if ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {
|
|
269
|
-
|
|
270
|
-
geometry.deleteAttribute( 'morphTarget' + i );
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {
|
|
275
|
-
|
|
276
|
-
geometry.deleteAttribute( 'morphNormal' + i );
|
|
277
|
-
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
morphInfluences[ i ] = 0;
|
|
281
|
-
|
|
282
|
-
}
|
|
143
|
+
morphInfluencesSum += objectInfluences[ i ];
|
|
283
144
|
|
|
284
145
|
}
|
|
285
146
|
|
|
286
|
-
// GLSL shader uses formula baseinfluence * base + sum(target * influence)
|
|
287
|
-
// This allows us to switch between absolute morphs and relative morphs without changing shader code
|
|
288
|
-
// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)
|
|
289
147
|
const morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;
|
|
290
148
|
|
|
149
|
+
|
|
291
150
|
program.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );
|
|
292
|
-
program.getUniforms().setValue( gl, 'morphTargetInfluences',
|
|
151
|
+
program.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );
|
|
293
152
|
|
|
294
153
|
}
|
|
295
154
|
|
|
155
|
+
program.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );
|
|
156
|
+
program.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );
|
|
157
|
+
|
|
296
158
|
}
|
|
297
159
|
|
|
298
160
|
return {
|
|
@@ -142,19 +142,6 @@ function getToneMappingFunction( functionName, toneMapping ) {
|
|
|
142
142
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
function generateExtensions( parameters ) {
|
|
146
|
-
|
|
147
|
-
const chunks = [
|
|
148
|
-
( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.normalMapTangentSpace || parameters.clearcoatNormalMap || parameters.flatShading || parameters.alphaToCoverage || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',
|
|
149
|
-
( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',
|
|
150
|
-
( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',
|
|
151
|
-
( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''
|
|
152
|
-
];
|
|
153
|
-
|
|
154
|
-
return chunks.filter( filterEmptyLine ).join( '\n' );
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
|
|
158
145
|
function generateVertexExtensions( parameters ) {
|
|
159
146
|
|
|
160
147
|
const chunks = [
|
|
@@ -322,27 +309,21 @@ function generatePrecision( parameters ) {
|
|
|
322
309
|
precision ${parameters.precision} int;
|
|
323
310
|
precision ${parameters.precision} sampler2D;
|
|
324
311
|
precision ${parameters.precision} samplerCube;
|
|
312
|
+
precision ${parameters.precision} sampler3D;
|
|
313
|
+
precision ${parameters.precision} sampler2DArray;
|
|
314
|
+
precision ${parameters.precision} sampler2DShadow;
|
|
315
|
+
precision ${parameters.precision} samplerCubeShadow;
|
|
316
|
+
precision ${parameters.precision} sampler2DArrayShadow;
|
|
317
|
+
precision ${parameters.precision} isampler2D;
|
|
318
|
+
precision ${parameters.precision} isampler3D;
|
|
319
|
+
precision ${parameters.precision} isamplerCube;
|
|
320
|
+
precision ${parameters.precision} isampler2DArray;
|
|
321
|
+
precision ${parameters.precision} usampler2D;
|
|
322
|
+
precision ${parameters.precision} usampler3D;
|
|
323
|
+
precision ${parameters.precision} usamplerCube;
|
|
324
|
+
precision ${parameters.precision} usampler2DArray;
|
|
325
325
|
`;
|
|
326
326
|
|
|
327
|
-
if ( parameters.isWebGL2 ) {
|
|
328
|
-
|
|
329
|
-
precisionstring += `precision ${parameters.precision} sampler3D;
|
|
330
|
-
precision ${parameters.precision} sampler2DArray;
|
|
331
|
-
precision ${parameters.precision} sampler2DShadow;
|
|
332
|
-
precision ${parameters.precision} samplerCubeShadow;
|
|
333
|
-
precision ${parameters.precision} sampler2DArrayShadow;
|
|
334
|
-
precision ${parameters.precision} isampler2D;
|
|
335
|
-
precision ${parameters.precision} isampler3D;
|
|
336
|
-
precision ${parameters.precision} isamplerCube;
|
|
337
|
-
precision ${parameters.precision} isampler2DArray;
|
|
338
|
-
precision ${parameters.precision} usampler2D;
|
|
339
|
-
precision ${parameters.precision} usampler3D;
|
|
340
|
-
precision ${parameters.precision} usamplerCube;
|
|
341
|
-
precision ${parameters.precision} usampler2DArray;
|
|
342
|
-
`;
|
|
343
|
-
|
|
344
|
-
}
|
|
345
|
-
|
|
346
327
|
if ( parameters.precision === 'highp' ) {
|
|
347
328
|
|
|
348
329
|
precisionstring += '\n#define HIGH_PRECISION';
|
|
@@ -491,8 +472,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
491
472
|
const envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );
|
|
492
473
|
const envMapCubeUVSize = generateCubeUVSize( parameters );
|
|
493
474
|
|
|
494
|
-
const customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );
|
|
495
|
-
|
|
496
475
|
const customVertexExtensions = generateVertexExtensions( parameters );
|
|
497
476
|
|
|
498
477
|
const customDefines = generateDefines( defines );
|
|
@@ -523,8 +502,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
523
502
|
|
|
524
503
|
prefixFragment = [
|
|
525
504
|
|
|
526
|
-
customExtensions,
|
|
527
|
-
|
|
528
505
|
'#define SHADER_TYPE ' + parameters.shaderType,
|
|
529
506
|
'#define SHADER_NAME ' + parameters.shaderName,
|
|
530
507
|
|
|
@@ -646,10 +623,10 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
646
623
|
|
|
647
624
|
parameters.morphTargets ? '#define USE_MORPHTARGETS' : '',
|
|
648
625
|
parameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',
|
|
649
|
-
( parameters.morphColors
|
|
650
|
-
( parameters.morphTargetsCount > 0
|
|
651
|
-
( parameters.morphTargetsCount > 0
|
|
652
|
-
( parameters.morphTargetsCount > 0
|
|
626
|
+
( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',
|
|
627
|
+
( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE' : '',
|
|
628
|
+
( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',
|
|
629
|
+
( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',
|
|
653
630
|
parameters.doubleSided ? '#define DOUBLE_SIDED' : '',
|
|
654
631
|
parameters.flipSided ? '#define FLIP_SIDED' : '',
|
|
655
632
|
|
|
@@ -663,7 +640,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
663
640
|
parameters.useLegacyLights ? '#define LEGACY_LIGHTS' : '',
|
|
664
641
|
|
|
665
642
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
666
|
-
( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
667
643
|
|
|
668
644
|
'uniform mat4 modelMatrix;',
|
|
669
645
|
'uniform mat4 modelViewMatrix;',
|
|
@@ -767,8 +743,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
767
743
|
|
|
768
744
|
prefixFragment = [
|
|
769
745
|
|
|
770
|
-
customExtensions,
|
|
771
|
-
|
|
772
746
|
generatePrecision( parameters ),
|
|
773
747
|
|
|
774
748
|
'#define SHADER_TYPE ' + parameters.shaderType,
|
|
@@ -856,7 +830,6 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
856
830
|
parameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',
|
|
857
831
|
|
|
858
832
|
parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',
|
|
859
|
-
( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
|
860
833
|
|
|
861
834
|
'uniform mat4 viewMatrix;',
|
|
862
835
|
'uniform vec3 cameraPosition;',
|
|
@@ -891,7 +864,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
891
864
|
vertexShader = unrollLoops( vertexShader );
|
|
892
865
|
fragmentShader = unrollLoops( fragmentShader );
|
|
893
866
|
|
|
894
|
-
if ( parameters.
|
|
867
|
+
if ( parameters.isRawShaderMaterial !== true ) {
|
|
895
868
|
|
|
896
869
|
// GLSL 3.0 conversion for built-in materials and ShaderMaterial
|
|
897
870
|
|
|
@@ -899,14 +872,12 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
|
|
|
899
872
|
|
|
900
873
|
prefixVertex = [
|
|
901
874
|
customVertexExtensions,
|
|
902
|
-
'precision mediump sampler2DArray;',
|
|
903
875
|
'#define attribute in',
|
|
904
876
|
'#define varying out',
|
|
905
877
|
'#define texture2D texture'
|
|
906
878
|
].join( '\n' ) + '\n' + prefixVertex;
|
|
907
879
|
|
|
908
880
|
prefixFragment = [
|
|
909
|
-
'precision mediump sampler2DArray;',
|
|
910
881
|
'#define varying in',
|
|
911
882
|
( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',
|
|
912
883
|
( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',
|
|
@@ -13,7 +13,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
13
13
|
const _activeChannels = new Set();
|
|
14
14
|
const programs = [];
|
|
15
15
|
|
|
16
|
-
const IS_WEBGL2 = capabilities.isWebGL2;
|
|
17
16
|
const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
|
|
18
17
|
const SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;
|
|
19
18
|
|
|
@@ -177,8 +176,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
177
176
|
|
|
178
177
|
const parameters = {
|
|
179
178
|
|
|
180
|
-
isWebGL2: IS_WEBGL2,
|
|
181
|
-
|
|
182
179
|
shaderID: shaderID,
|
|
183
180
|
shaderType: material.type,
|
|
184
181
|
shaderName: material.name,
|
|
@@ -353,16 +350,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
353
350
|
|
|
354
351
|
index0AttributeName: material.index0AttributeName,
|
|
355
352
|
|
|
356
|
-
extensionDerivatives: HAS_EXTENSIONS && material.extensions.derivatives === true,
|
|
357
|
-
extensionFragDepth: HAS_EXTENSIONS && material.extensions.fragDepth === true,
|
|
358
|
-
extensionDrawBuffers: HAS_EXTENSIONS && material.extensions.drawBuffers === true,
|
|
359
|
-
extensionShaderTextureLOD: HAS_EXTENSIONS && material.extensions.shaderTextureLOD === true,
|
|
360
353
|
extensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),
|
|
361
354
|
extensionMultiDraw: HAS_EXTENSIONS && material.extensions.multiDraw === true && extensions.has( 'WEBGL_multi_draw' ),
|
|
362
355
|
|
|
363
|
-
rendererExtensionFragDepth: IS_WEBGL2 || extensions.has( 'EXT_frag_depth' ),
|
|
364
|
-
rendererExtensionDrawBuffers: IS_WEBGL2 || extensions.has( 'WEBGL_draw_buffers' ),
|
|
365
|
-
rendererExtensionShaderTextureLod: IS_WEBGL2 || extensions.has( 'EXT_shader_texture_lod' ),
|
|
366
356
|
rendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),
|
|
367
357
|
|
|
368
358
|
customProgramCacheKey: material.customProgramCacheKey()
|
|
@@ -478,48 +468,46 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
478
468
|
|
|
479
469
|
_programLayers.disableAll();
|
|
480
470
|
|
|
481
|
-
if ( parameters.isWebGL2 )
|
|
482
|
-
_programLayers.enable( 0 );
|
|
483
471
|
if ( parameters.supportsVertexTextures )
|
|
484
|
-
_programLayers.enable(
|
|
472
|
+
_programLayers.enable( 0 );
|
|
485
473
|
if ( parameters.instancing )
|
|
486
|
-
_programLayers.enable(
|
|
474
|
+
_programLayers.enable( 1 );
|
|
487
475
|
if ( parameters.instancingColor )
|
|
488
|
-
_programLayers.enable(
|
|
476
|
+
_programLayers.enable( 2 );
|
|
489
477
|
if ( parameters.instancingMorph )
|
|
490
|
-
_programLayers.enable(
|
|
478
|
+
_programLayers.enable( 3 );
|
|
491
479
|
if ( parameters.matcap )
|
|
492
|
-
_programLayers.enable(
|
|
480
|
+
_programLayers.enable( 4 );
|
|
493
481
|
if ( parameters.envMap )
|
|
494
|
-
_programLayers.enable(
|
|
482
|
+
_programLayers.enable( 5 );
|
|
495
483
|
if ( parameters.normalMapObjectSpace )
|
|
496
|
-
_programLayers.enable(
|
|
484
|
+
_programLayers.enable( 6 );
|
|
497
485
|
if ( parameters.normalMapTangentSpace )
|
|
498
|
-
_programLayers.enable(
|
|
486
|
+
_programLayers.enable( 7 );
|
|
499
487
|
if ( parameters.clearcoat )
|
|
500
|
-
_programLayers.enable(
|
|
488
|
+
_programLayers.enable( 8 );
|
|
501
489
|
if ( parameters.iridescence )
|
|
502
|
-
_programLayers.enable(
|
|
490
|
+
_programLayers.enable( 9 );
|
|
503
491
|
if ( parameters.alphaTest )
|
|
504
|
-
_programLayers.enable(
|
|
492
|
+
_programLayers.enable( 10 );
|
|
505
493
|
if ( parameters.vertexColors )
|
|
506
|
-
_programLayers.enable(
|
|
494
|
+
_programLayers.enable( 11 );
|
|
507
495
|
if ( parameters.vertexAlphas )
|
|
508
|
-
_programLayers.enable(
|
|
496
|
+
_programLayers.enable( 12 );
|
|
509
497
|
if ( parameters.vertexUv1s )
|
|
510
|
-
_programLayers.enable(
|
|
498
|
+
_programLayers.enable( 13 );
|
|
511
499
|
if ( parameters.vertexUv2s )
|
|
512
|
-
_programLayers.enable(
|
|
500
|
+
_programLayers.enable( 14 );
|
|
513
501
|
if ( parameters.vertexUv3s )
|
|
514
|
-
_programLayers.enable(
|
|
502
|
+
_programLayers.enable( 15 );
|
|
515
503
|
if ( parameters.vertexTangents )
|
|
516
|
-
_programLayers.enable(
|
|
504
|
+
_programLayers.enable( 16 );
|
|
517
505
|
if ( parameters.anisotropy )
|
|
518
|
-
_programLayers.enable(
|
|
506
|
+
_programLayers.enable( 17 );
|
|
519
507
|
if ( parameters.alphaHash )
|
|
520
|
-
_programLayers.enable(
|
|
508
|
+
_programLayers.enable( 18 );
|
|
521
509
|
if ( parameters.batching )
|
|
522
|
-
_programLayers.enable(
|
|
510
|
+
_programLayers.enable( 19 );
|
|
523
511
|
|
|
524
512
|
array.push( _programLayers.mask );
|
|
525
513
|
_programLayers.disableAll();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { WebGLLights } from './WebGLLights.js';
|
|
2
2
|
|
|
3
|
-
function WebGLRenderState( extensions
|
|
3
|
+
function WebGLRenderState( extensions ) {
|
|
4
4
|
|
|
5
|
-
const lights = new WebGLLights( extensions
|
|
5
|
+
const lights = new WebGLLights( extensions );
|
|
6
6
|
|
|
7
7
|
const lightsArray = [];
|
|
8
8
|
const shadowsArray = [];
|
|
@@ -42,7 +42,9 @@ function WebGLRenderState( extensions, capabilities ) {
|
|
|
42
42
|
lightsArray: lightsArray,
|
|
43
43
|
shadowsArray: shadowsArray,
|
|
44
44
|
|
|
45
|
-
lights: lights
|
|
45
|
+
lights: lights,
|
|
46
|
+
|
|
47
|
+
transmissionRenderTarget: null
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
return {
|
|
@@ -57,7 +59,7 @@ function WebGLRenderState( extensions, capabilities ) {
|
|
|
57
59
|
|
|
58
60
|
}
|
|
59
61
|
|
|
60
|
-
function WebGLRenderStates( extensions
|
|
62
|
+
function WebGLRenderStates( extensions ) {
|
|
61
63
|
|
|
62
64
|
let renderStates = new WeakMap();
|
|
63
65
|
|
|
@@ -68,14 +70,14 @@ function WebGLRenderStates( extensions, capabilities ) {
|
|
|
68
70
|
|
|
69
71
|
if ( renderStateArray === undefined ) {
|
|
70
72
|
|
|
71
|
-
renderState = new WebGLRenderState( extensions
|
|
73
|
+
renderState = new WebGLRenderState( extensions );
|
|
72
74
|
renderStates.set( scene, [ renderState ] );
|
|
73
75
|
|
|
74
76
|
} else {
|
|
75
77
|
|
|
76
78
|
if ( renderCallDepth >= renderStateArray.length ) {
|
|
77
79
|
|
|
78
|
-
renderState = new WebGLRenderState( extensions
|
|
80
|
+
renderState = new WebGLRenderState( extensions );
|
|
79
81
|
renderStateArray.push( renderState );
|
|
80
82
|
|
|
81
83
|
} else {
|