super-three 0.163.0 → 0.165.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 +3 -3
- package/build/three.cjs +1127 -452
- package/build/three.module.js +1127 -452
- package/build/three.module.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -5
- package/examples/jsm/exporters/GLTFExporter.js +45 -1
- package/examples/jsm/exporters/USDZExporter.js +13 -5
- package/examples/jsm/helpers/ViewHelper.js +32 -67
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/libs/tween.module.js +75 -64
- package/examples/jsm/lines/LineMaterial.js +1 -15
- package/examples/jsm/lines/LineSegments2.js +15 -0
- package/examples/jsm/lines/Wireframe.js +16 -1
- package/examples/jsm/loaders/DRACOLoader.js +1 -1
- package/examples/jsm/loaders/EXRLoader.js +283 -99
- package/examples/jsm/loaders/FBXLoader.js +24 -13
- package/examples/jsm/loaders/GLTFLoader.js +55 -0
- package/examples/jsm/loaders/KTX2Loader.js +3 -6
- package/examples/jsm/loaders/LDrawLoader.js +3 -2
- package/examples/jsm/loaders/MMDLoader.js +31 -12
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/loaders/lwo/IFFParser.js +8 -5
- package/examples/jsm/materials/MeshGouraudMaterial.js +7 -1
- package/examples/jsm/math/Octree.js +26 -20
- package/examples/jsm/modifiers/CurveModifier.js +11 -9
- package/examples/jsm/nodes/Nodes.js +15 -13
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
- package/examples/jsm/nodes/accessors/BitangentNode.js +7 -83
- package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
- package/examples/jsm/nodes/accessors/CameraNode.js +12 -119
- package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +109 -3
- package/examples/jsm/nodes/accessors/ModelNode.js +3 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +9 -101
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -100
- package/examples/jsm/nodes/accessors/ReferenceNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -31
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
- package/examples/jsm/nodes/accessors/{TextureStoreNode.js → StorageTextureNode.js} +19 -6
- package/examples/jsm/nodes/accessors/TangentNode.js +11 -97
- package/examples/jsm/nodes/accessors/Texture3DNode.js +100 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +21 -3
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
- package/examples/jsm/nodes/accessors/UVNode.js +2 -46
- package/examples/jsm/nodes/code/FunctionNode.js +0 -8
- package/examples/jsm/nodes/core/AttributeNode.js +15 -3
- package/examples/jsm/nodes/core/ContextNode.js +6 -0
- package/examples/jsm/nodes/core/Node.js +23 -2
- package/examples/jsm/nodes/core/NodeBuilder.js +25 -18
- package/examples/jsm/nodes/core/NodeKeywords.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +3 -6
- package/examples/jsm/nodes/core/PropertyNode.js +11 -0
- package/examples/jsm/nodes/core/VaryingNode.js +40 -9
- package/examples/jsm/nodes/display/AfterImageNode.js +14 -2
- package/examples/jsm/nodes/display/BumpMapNode.js +7 -26
- package/examples/jsm/nodes/display/FrontFacingNode.js +13 -0
- package/examples/jsm/nodes/display/PassNode.js +3 -1
- package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +5 -3
- package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +26 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -3
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +1 -1
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +210 -12
- package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
- package/examples/jsm/nodes/functions/ToonLightingModel.js +49 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +20 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +11 -2
- package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
- package/examples/jsm/nodes/lighting/LightsNode.js +28 -1
- package/examples/jsm/nodes/lighting/PointLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +2 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +11 -7
- package/examples/jsm/nodes/materials/Materials.js +4 -0
- package/examples/jsm/nodes/materials/MeshMatcapNodeMaterial.js +52 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -2
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +94 -6
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
- package/examples/jsm/nodes/materials/MeshToonNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/NodeMaterial.js +43 -45
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/VolumeNodeMaterial.js +106 -0
- package/examples/jsm/nodes/math/HashNode.js +2 -2
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +1 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +57 -41
- package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
- package/examples/jsm/nodes/utils/MatcapUVNode.js +1 -1
- package/examples/jsm/nodes/utils/TimerNode.js +1 -1
- package/examples/jsm/objects/Lensflare.js +2 -2
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- package/examples/jsm/postprocessing/RenderPass.js +1 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
- package/examples/jsm/renderers/CSS2DRenderer.js +25 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +24 -3
- package/examples/jsm/renderers/common/Attributes.js +2 -0
- package/examples/jsm/renderers/common/Background.js +3 -3
- package/examples/jsm/renderers/common/Bindings.js +17 -0
- package/examples/jsm/renderers/common/ChainMap.js +18 -48
- package/examples/jsm/renderers/common/ClippingContext.js +5 -5
- package/examples/jsm/renderers/common/Pipelines.js +2 -2
- package/examples/jsm/renderers/common/RenderBundle.js +18 -0
- package/examples/jsm/renderers/common/RenderBundles.js +38 -0
- package/examples/jsm/renderers/common/RenderList.js +10 -1
- package/examples/jsm/renderers/common/RenderObject.js +49 -1
- package/examples/jsm/renderers/common/Renderer.js +268 -25
- package/examples/jsm/renderers/common/Textures.js +1 -1
- package/examples/jsm/renderers/common/Uniform.js +1 -1
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +13 -17
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +18 -4
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +6 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +31 -47
- package/examples/jsm/renderers/webgl/WebGLBackend.js +7 -21
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +5 -1
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +23 -5
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +114 -13
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -21
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +80 -46
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +85 -12
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +10 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +6 -0
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +62 -19
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -3
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +18 -16
- package/examples/jsm/utils/GPUStatsPanel.js +2 -0
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/utils/SortUtils.js +8 -5
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +3 -2
- package/src/animation/tracks/BooleanKeyframeTrack.js +10 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -2
- package/src/animation/tracks/StringKeyframeTrack.js +10 -1
- package/src/constants.js +1 -1
- package/src/core/Object3D.js +2 -0
- package/src/core/Raycaster.js +6 -2
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/PMREMGenerator.js +12 -11
- package/src/loaders/FileLoader.js +5 -1
- package/src/loaders/LoaderUtils.js +3 -1
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +1 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/objects/BatchedMesh.js +114 -1
- package/src/objects/Line.js +66 -43
- package/src/renderers/WebGLRenderer.js +371 -109
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +15 -0
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +9 -1
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +8 -22
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +3 -14
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +10 -31
- package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +3 -23
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +17 -9
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +47 -13
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/webgl/WebGLBackground.js +24 -3
- package/src/renderers/webgl/WebGLBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLCapabilities.js +33 -1
- package/src/renderers/webgl/WebGLExtensions.js +3 -1
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +36 -0
- package/src/renderers/webgl/WebGLLights.js +9 -12
- package/src/renderers/webgl/WebGLMaterials.js +7 -5
- package/src/renderers/webgl/WebGLMorphtargets.js +1 -2
- package/src/renderers/webgl/WebGLProgram.js +5 -36
- package/src/renderers/webgl/WebGLPrograms.js +19 -14
- package/src/renderers/webgl/WebGLRenderStates.js +8 -4
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLTextures.js +206 -129
- package/src/renderers/webgl/WebGLUtils.js +3 -21
- package/src/renderers/webxr/WebXRDepthSensing.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +8 -6
- package/src/textures/CompressedArrayTexture.js +14 -0
- package/src/textures/DataArrayTexture.js +14 -0
- package/src/textures/DepthTexture.js +1 -3
- package/src/utils.js +30 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -318
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -792
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
- package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
|
@@ -16,4 +16,19 @@ export default /* glsl */`
|
|
|
16
16
|
|
|
17
17
|
}
|
|
18
18
|
#endif
|
|
19
|
+
|
|
20
|
+
#ifdef USE_BATCHING_COLOR
|
|
21
|
+
|
|
22
|
+
uniform sampler2D batchingColorTexture;
|
|
23
|
+
vec3 getBatchingColor( const in float i ) {
|
|
24
|
+
|
|
25
|
+
int size = textureSize( batchingColorTexture, 0 ).x;
|
|
26
|
+
int j = int( i );
|
|
27
|
+
int x = j % size;
|
|
28
|
+
int y = j / size;
|
|
29
|
+
return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#endif
|
|
19
34
|
`;
|
|
@@ -3,7 +3,7 @@ export default /* glsl */`
|
|
|
3
3
|
|
|
4
4
|
vColor = vec4( 1.0 );
|
|
5
5
|
|
|
6
|
-
#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )
|
|
6
|
+
#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )
|
|
7
7
|
|
|
8
8
|
vColor = vec3( 1.0 );
|
|
9
9
|
|
|
@@ -19,5 +19,13 @@ export default /* glsl */`
|
|
|
19
19
|
|
|
20
20
|
vColor.xyz *= instanceColor.xyz;
|
|
21
21
|
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#ifdef USE_BATCHING_COLOR
|
|
25
|
+
|
|
26
|
+
vec3 batchingColor = getBatchingColor( batchId );
|
|
27
|
+
|
|
28
|
+
vColor.xyz *= batchingColor.xyz;
|
|
29
|
+
|
|
22
30
|
#endif
|
|
23
31
|
`;
|
|
@@ -55,32 +55,18 @@ vec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {
|
|
|
55
55
|
|
|
56
56
|
float getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
// based upon Frostbite 3 Moving to Physically-based Rendering
|
|
59
|
+
// page 32, equation 26: E[window1]
|
|
60
|
+
// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
|
|
61
|
+
float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
if ( cutoffDistance > 0.0 ) {
|
|
61
64
|
|
|
62
|
-
|
|
65
|
+
distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return 1.0;
|
|
67
|
-
|
|
68
|
-
#else
|
|
69
|
-
|
|
70
|
-
// based upon Frostbite 3 Moving to Physically-based Rendering
|
|
71
|
-
// page 32, equation 26: E[window1]
|
|
72
|
-
// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
|
|
73
|
-
float distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );
|
|
74
|
-
|
|
75
|
-
if ( cutoffDistance > 0.0 ) {
|
|
76
|
-
|
|
77
|
-
distanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return distanceFalloff;
|
|
67
|
+
}
|
|
82
68
|
|
|
83
|
-
|
|
69
|
+
return distanceFalloff;
|
|
84
70
|
|
|
85
71
|
}
|
|
86
72
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export default /* glsl */`
|
|
2
|
-
#if defined( USE_MORPHCOLORS )
|
|
2
|
+
#if defined( USE_MORPHCOLORS )
|
|
3
3
|
|
|
4
4
|
// morphTargetBaseInfluence is set based on BufferGeometry.morphTargetsRelative value:
|
|
5
5
|
// When morphTargetsRelative is false, this is set to 1 - sum(influences); this results in normal = sum((target - base) * influence)
|
|
@@ -6,22 +6,11 @@ export default /* glsl */`
|
|
|
6
6
|
// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
|
|
7
7
|
objectNormal *= morphTargetBaseInfluence;
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
#else
|
|
18
|
-
|
|
19
|
-
objectNormal += morphNormal0 * morphTargetInfluences[ 0 ];
|
|
20
|
-
objectNormal += morphNormal1 * morphTargetInfluences[ 1 ];
|
|
21
|
-
objectNormal += morphNormal2 * morphTargetInfluences[ 2 ];
|
|
22
|
-
objectNormal += morphNormal3 * morphTargetInfluences[ 3 ];
|
|
23
|
-
|
|
24
|
-
#endif
|
|
13
|
+
}
|
|
25
14
|
|
|
26
15
|
#endif
|
|
27
16
|
`;
|
|
@@ -4,44 +4,23 @@ export default /* glsl */`
|
|
|
4
4
|
#ifndef USE_INSTANCING_MORPH
|
|
5
5
|
|
|
6
6
|
uniform float morphTargetBaseInfluence;
|
|
7
|
+
uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];
|
|
7
8
|
|
|
8
9
|
#endif
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
uniform sampler2DArray morphTargetsTexture;
|
|
12
|
+
uniform ivec2 morphTargetsTextureSize;
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;
|
|
17
|
+
int y = texelIndex / morphTargetsTextureSize.x;
|
|
18
|
+
int x = texelIndex - y * morphTargetsTextureSize.x;
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
ivec3 morphUV = ivec3( x, y, morphTargetIndex );
|
|
21
|
+
return texelFetch( morphTargetsTexture, morphUV, 0 );
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
uniform ivec2 morphTargetsTextureSize;
|
|
20
|
-
|
|
21
|
-
vec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {
|
|
22
|
-
|
|
23
|
-
int texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;
|
|
24
|
-
int y = texelIndex / morphTargetsTextureSize.x;
|
|
25
|
-
int x = texelIndex - y * morphTargetsTextureSize.x;
|
|
26
|
-
|
|
27
|
-
ivec3 morphUV = ivec3( x, y, morphTargetIndex );
|
|
28
|
-
return texelFetch( morphTargetsTexture, morphUV, 0 );
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
#else
|
|
33
|
-
|
|
34
|
-
#ifndef USE_MORPHNORMALS
|
|
35
|
-
|
|
36
|
-
uniform float morphTargetInfluences[ 8 ];
|
|
37
|
-
|
|
38
|
-
#else
|
|
39
|
-
|
|
40
|
-
uniform float morphTargetInfluences[ 4 ];
|
|
41
|
-
|
|
42
|
-
#endif
|
|
43
|
-
|
|
44
|
-
#endif
|
|
23
|
+
}
|
|
45
24
|
|
|
46
25
|
#endif
|
|
47
26
|
`;
|
|
@@ -6,31 +6,11 @@ export default /* glsl */`
|
|
|
6
6
|
// When morphTargetsRelative is true, this is set to 1; as a result, all morph targets are simply added to the base after weighting
|
|
7
7
|
transformed *= morphTargetBaseInfluence;
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
#else
|
|
18
|
-
|
|
19
|
-
transformed += morphTarget0 * morphTargetInfluences[ 0 ];
|
|
20
|
-
transformed += morphTarget1 * morphTargetInfluences[ 1 ];
|
|
21
|
-
transformed += morphTarget2 * morphTargetInfluences[ 2 ];
|
|
22
|
-
transformed += morphTarget3 * morphTargetInfluences[ 3 ];
|
|
23
|
-
|
|
24
|
-
#ifndef USE_MORPHNORMALS
|
|
25
|
-
|
|
26
|
-
transformed += morphTarget4 * morphTargetInfluences[ 4 ];
|
|
27
|
-
transformed += morphTarget5 * morphTargetInfluences[ 5 ];
|
|
28
|
-
transformed += morphTarget6 * morphTargetInfluences[ 6 ];
|
|
29
|
-
transformed += morphTarget7 * morphTargetInfluences[ 7 ];
|
|
30
|
-
|
|
31
|
-
#endif
|
|
32
|
-
|
|
33
|
-
#endif
|
|
13
|
+
}
|
|
34
14
|
|
|
35
15
|
#endif
|
|
36
16
|
`;
|
|
@@ -168,24 +168,32 @@ vec3 AgXToneMapping( vec3 color ) {
|
|
|
168
168
|
// https://modelviewer.dev/examples/tone-mapping
|
|
169
169
|
|
|
170
170
|
vec3 NeutralToneMapping( vec3 color ) {
|
|
171
|
-
|
|
172
|
-
float
|
|
171
|
+
|
|
172
|
+
const float StartCompression = 0.8 - 0.04;
|
|
173
|
+
const float Desaturation = 0.15;
|
|
173
174
|
|
|
174
175
|
color *= toneMappingExposure;
|
|
175
176
|
|
|
176
|
-
float x = min(color.r, min(color.g, color.b));
|
|
177
|
+
float x = min( color.r, min( color.g, color.b ) );
|
|
178
|
+
|
|
177
179
|
float offset = x < 0.08 ? x - 6.25 * x * x : 0.04;
|
|
180
|
+
|
|
178
181
|
color -= offset;
|
|
179
182
|
|
|
180
|
-
float peak = max(color.r, max(color.g, color.b));
|
|
181
|
-
|
|
183
|
+
float peak = max( color.r, max( color.g, color.b ) );
|
|
184
|
+
|
|
185
|
+
if ( peak < StartCompression ) return color;
|
|
186
|
+
|
|
187
|
+
float d = 1. - StartCompression;
|
|
188
|
+
|
|
189
|
+
float newPeak = 1. - d * d / ( peak + d - StartCompression );
|
|
182
190
|
|
|
183
|
-
float d = 1. - startCompression;
|
|
184
|
-
float newPeak = 1. - d * d / (peak + d - startCompression);
|
|
185
191
|
color *= newPeak / peak;
|
|
186
192
|
|
|
187
|
-
float g = 1. - 1. / (
|
|
188
|
-
|
|
193
|
+
float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );
|
|
194
|
+
|
|
195
|
+
return mix( color, vec3( newPeak ), g );
|
|
196
|
+
|
|
189
197
|
}
|
|
190
198
|
|
|
191
199
|
vec3 CustomToneMapping( vec3 color ) { return color; }
|
|
@@ -25,7 +25,7 @@ export default /* glsl */`
|
|
|
25
25
|
|
|
26
26
|
vec4 transmitted = getIBLVolumeRefraction(
|
|
27
27
|
n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,
|
|
28
|
-
pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,
|
|
28
|
+
pos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,
|
|
29
29
|
material.attenuationColor, material.attenuationDistance );
|
|
30
30
|
|
|
31
31
|
material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );
|
|
@@ -169,22 +169,56 @@ export default /* glsl */`
|
|
|
169
169
|
|
|
170
170
|
vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,
|
|
171
171
|
const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,
|
|
172
|
-
const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,
|
|
172
|
+
const in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,
|
|
173
173
|
const in vec3 attenuationColor, const in float attenuationDistance ) {
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
vec3
|
|
175
|
+
vec4 transmittedLight;
|
|
176
|
+
vec3 transmittance;
|
|
177
|
+
|
|
178
|
+
#ifdef USE_DISPERSION
|
|
179
|
+
|
|
180
|
+
float halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;
|
|
181
|
+
vec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );
|
|
182
|
+
|
|
183
|
+
for ( int i = 0; i < 3; i ++ ) {
|
|
184
|
+
|
|
185
|
+
vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );
|
|
186
|
+
vec3 refractedRayExit = position + transmissionRay;
|
|
187
|
+
|
|
188
|
+
// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
|
|
189
|
+
vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
|
|
190
|
+
vec2 refractionCoords = ndcPos.xy / ndcPos.w;
|
|
191
|
+
refractionCoords += 1.0;
|
|
192
|
+
refractionCoords /= 2.0;
|
|
193
|
+
|
|
194
|
+
// Sample framebuffer to get pixel the refracted ray hits.
|
|
195
|
+
vec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );
|
|
196
|
+
transmittedLight[ i ] = transmissionSample[ i ];
|
|
197
|
+
transmittedLight.a += transmissionSample.a;
|
|
198
|
+
|
|
199
|
+
transmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
transmittedLight.a /= 3.0;
|
|
204
|
+
|
|
205
|
+
#else
|
|
206
|
+
|
|
207
|
+
vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );
|
|
208
|
+
vec3 refractedRayExit = position + transmissionRay;
|
|
209
|
+
|
|
210
|
+
// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
|
|
211
|
+
vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
|
|
212
|
+
vec2 refractionCoords = ndcPos.xy / ndcPos.w;
|
|
213
|
+
refractionCoords += 1.0;
|
|
214
|
+
refractionCoords /= 2.0;
|
|
215
|
+
|
|
216
|
+
// Sample framebuffer to get pixel the refracted ray hits.
|
|
217
|
+
transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
|
|
218
|
+
transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );
|
|
219
|
+
|
|
220
|
+
#endif
|
|
177
221
|
|
|
178
|
-
// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.
|
|
179
|
-
vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );
|
|
180
|
-
vec2 refractionCoords = ndcPos.xy / ndcPos.w;
|
|
181
|
-
refractionCoords += 1.0;
|
|
182
|
-
refractionCoords /= 2.0;
|
|
183
|
-
|
|
184
|
-
// Sample framebuffer to get pixel the refracted ray hits.
|
|
185
|
-
vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );
|
|
186
|
-
|
|
187
|
-
vec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );
|
|
188
222
|
vec3 attenuatedColor = transmittance * transmittedLight.rgb;
|
|
189
223
|
|
|
190
224
|
// Get the specular component.
|
|
@@ -40,7 +40,6 @@ import fog_pars_vertex from './ShaderChunk/fog_pars_vertex.glsl.js';
|
|
|
40
40
|
import fog_fragment from './ShaderChunk/fog_fragment.glsl.js';
|
|
41
41
|
import fog_pars_fragment from './ShaderChunk/fog_pars_fragment.glsl.js';
|
|
42
42
|
import gradientmap_pars_fragment from './ShaderChunk/gradientmap_pars_fragment.glsl.js';
|
|
43
|
-
import lightmap_fragment from './ShaderChunk/lightmap_fragment.glsl.js';
|
|
44
43
|
import lightmap_pars_fragment from './ShaderChunk/lightmap_pars_fragment.glsl.js';
|
|
45
44
|
import lights_lambert_fragment from './ShaderChunk/lights_lambert_fragment.glsl.js';
|
|
46
45
|
import lights_lambert_pars_fragment from './ShaderChunk/lights_lambert_pars_fragment.glsl.js';
|
|
@@ -169,7 +168,6 @@ export const ShaderChunk = {
|
|
|
169
168
|
fog_fragment: fog_fragment,
|
|
170
169
|
fog_pars_fragment: fog_pars_fragment,
|
|
171
170
|
gradientmap_pars_fragment: gradientmap_pars_fragment,
|
|
172
|
-
lightmap_fragment: lightmap_fragment,
|
|
173
171
|
lightmap_pars_fragment: lightmap_pars_fragment,
|
|
174
172
|
lights_lambert_fragment: lights_lambert_fragment,
|
|
175
173
|
lights_lambert_pars_fragment: lights_lambert_pars_fragment,
|
|
@@ -314,6 +314,7 @@ ShaderLib.physical = {
|
|
|
314
314
|
clearcoatRoughness: { value: 0 },
|
|
315
315
|
clearcoatRoughnessMap: { value: null },
|
|
316
316
|
clearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },
|
|
317
|
+
dispersion: { value: 0 },
|
|
317
318
|
iridescence: { value: 0 },
|
|
318
319
|
iridescenceMap: { value: null },
|
|
319
320
|
iridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },
|
|
@@ -26,9 +26,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
26
26
|
let currentBackgroundVersion = 0;
|
|
27
27
|
let currentTonemapping = null;
|
|
28
28
|
|
|
29
|
-
function
|
|
29
|
+
function getBackground( scene ) {
|
|
30
30
|
|
|
31
|
-
let forceClear = false;
|
|
32
31
|
let background = scene.isScene === true ? scene.background : null;
|
|
33
32
|
|
|
34
33
|
if ( background && background.isTexture ) {
|
|
@@ -38,6 +37,15 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
38
37
|
|
|
39
38
|
}
|
|
40
39
|
|
|
40
|
+
return background;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function render( scene ) {
|
|
45
|
+
|
|
46
|
+
let forceClear = false;
|
|
47
|
+
const background = getBackground( scene );
|
|
48
|
+
|
|
41
49
|
if ( background === null ) {
|
|
42
50
|
|
|
43
51
|
setClear( clearColor, clearAlpha );
|
|
@@ -63,10 +71,22 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
63
71
|
|
|
64
72
|
if ( renderer.autoClear || forceClear ) {
|
|
65
73
|
|
|
74
|
+
// buffers might not be writable which is required to ensure a correct clear
|
|
75
|
+
|
|
76
|
+
state.buffers.depth.setTest( true );
|
|
77
|
+
state.buffers.depth.setMask( true );
|
|
78
|
+
state.buffers.color.setMask( true );
|
|
79
|
+
|
|
66
80
|
renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
|
|
67
81
|
|
|
68
82
|
}
|
|
69
83
|
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function addToRenderList( renderList, scene ) {
|
|
87
|
+
|
|
88
|
+
const background = getBackground( scene );
|
|
89
|
+
|
|
70
90
|
if ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {
|
|
71
91
|
|
|
72
92
|
if ( boxMesh === undefined ) {
|
|
@@ -247,7 +267,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
247
267
|
setClear( clearColor, clearAlpha );
|
|
248
268
|
|
|
249
269
|
},
|
|
250
|
-
render: render
|
|
270
|
+
render: render,
|
|
271
|
+
addToRenderList: addToRenderList
|
|
251
272
|
|
|
252
273
|
};
|
|
253
274
|
|
|
@@ -57,12 +57,48 @@ function WebGLBufferRenderer( gl, extensions, info ) {
|
|
|
57
57
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
function renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
|
|
61
|
+
|
|
62
|
+
if ( drawCount === 0 ) return;
|
|
63
|
+
|
|
64
|
+
const extension = extensions.get( 'WEBGL_multi_draw' );
|
|
65
|
+
|
|
66
|
+
if ( extension === null ) {
|
|
67
|
+
|
|
68
|
+
for ( let i = 0; i < starts.length; i ++ ) {
|
|
69
|
+
|
|
70
|
+
renderInstances( starts[ i ], counts[ i ], primcount[ i ] );
|
|
71
|
+
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
} else {
|
|
75
|
+
|
|
76
|
+
extension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );
|
|
77
|
+
|
|
78
|
+
let elementCount = 0;
|
|
79
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
80
|
+
|
|
81
|
+
elementCount += counts[ i ];
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for ( let i = 0; i < primcount.length; i ++ ) {
|
|
86
|
+
|
|
87
|
+
info.update( elementCount, mode, primcount[ i ] );
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
60
95
|
//
|
|
61
96
|
|
|
62
97
|
this.setMode = setMode;
|
|
63
98
|
this.render = render;
|
|
64
99
|
this.renderInstances = renderInstances;
|
|
65
100
|
this.renderMultiDraw = renderMultiDraw;
|
|
101
|
+
this.renderMultiDrawInstances = renderMultiDrawInstances;
|
|
66
102
|
|
|
67
103
|
}
|
|
68
104
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { FloatType, HalfFloatType, RGBAFormat, UnsignedByteType } from '../../constants.js';
|
|
2
|
+
|
|
3
|
+
function WebGLCapabilities( gl, extensions, parameters, utils ) {
|
|
2
4
|
|
|
3
5
|
let maxAnisotropy;
|
|
4
6
|
|
|
@@ -22,6 +24,33 @@ function WebGLCapabilities( gl, extensions, parameters ) {
|
|
|
22
24
|
|
|
23
25
|
}
|
|
24
26
|
|
|
27
|
+
function textureFormatReadable( textureFormat ) {
|
|
28
|
+
|
|
29
|
+
if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
|
|
30
|
+
|
|
31
|
+
return false;
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return true;
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function textureTypeReadable( textureType ) {
|
|
40
|
+
|
|
41
|
+
const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );
|
|
42
|
+
|
|
43
|
+
if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
|
|
44
|
+
textureType !== FloatType && ! halfFloatSupportedByExt ) {
|
|
45
|
+
|
|
46
|
+
return false;
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return true;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
25
54
|
function getMaxPrecision( precision ) {
|
|
26
55
|
|
|
27
56
|
if ( precision === 'highp' ) {
|
|
@@ -85,6 +114,9 @@ function WebGLCapabilities( gl, extensions, parameters ) {
|
|
|
85
114
|
getMaxAnisotropy: getMaxAnisotropy,
|
|
86
115
|
getMaxPrecision: getMaxPrecision,
|
|
87
116
|
|
|
117
|
+
textureFormatReadable: textureFormatReadable,
|
|
118
|
+
textureTypeReadable: textureTypeReadable,
|
|
119
|
+
|
|
88
120
|
precision: precision,
|
|
89
121
|
logarithmicDepthBuffer: logarithmicDepthBuffer,
|
|
90
122
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { warnOnce } from '../../utils.js';
|
|
2
|
+
|
|
1
3
|
function WebGLExtensions( gl ) {
|
|
2
4
|
|
|
3
5
|
const extensions = {};
|
|
@@ -66,7 +68,7 @@ function WebGLExtensions( gl ) {
|
|
|
66
68
|
|
|
67
69
|
if ( extension === null ) {
|
|
68
70
|
|
|
69
|
-
|
|
71
|
+
warnOnce( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );
|
|
70
72
|
|
|
71
73
|
}
|
|
72
74
|
|
|
@@ -66,6 +66,41 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
|
|
|
66
66
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
function renderMultiDrawInstances( starts, counts, drawCount, primcount ) {
|
|
70
|
+
|
|
71
|
+
if ( drawCount === 0 ) return;
|
|
72
|
+
|
|
73
|
+
const extension = extensions.get( 'WEBGL_multi_draw' );
|
|
74
|
+
|
|
75
|
+
if ( extension === null ) {
|
|
76
|
+
|
|
77
|
+
for ( let i = 0; i < starts.length; i ++ ) {
|
|
78
|
+
|
|
79
|
+
renderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
} else {
|
|
84
|
+
|
|
85
|
+
extension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );
|
|
86
|
+
|
|
87
|
+
let elementCount = 0;
|
|
88
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
89
|
+
|
|
90
|
+
elementCount += counts[ i ];
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for ( let i = 0; i < primcount.length; i ++ ) {
|
|
95
|
+
|
|
96
|
+
info.update( elementCount, mode, primcount[ i ] );
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
69
104
|
//
|
|
70
105
|
|
|
71
106
|
this.setMode = setMode;
|
|
@@ -73,6 +108,7 @@ function WebGLIndexedBufferRenderer( gl, extensions, info ) {
|
|
|
73
108
|
this.render = render;
|
|
74
109
|
this.renderInstances = renderInstances;
|
|
75
110
|
this.renderMultiDraw = renderMultiDraw;
|
|
111
|
+
this.renderMultiDrawInstances = renderMultiDrawInstances;
|
|
76
112
|
|
|
77
113
|
}
|
|
78
114
|
|