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
|
@@ -46,6 +46,7 @@ import { WebGLGeometries } from './webgl/WebGLGeometries.js';
|
|
|
46
46
|
import { WebGLIndexedBufferRenderer } from './webgl/WebGLIndexedBufferRenderer.js';
|
|
47
47
|
import { WebGLInfo } from './webgl/WebGLInfo.js';
|
|
48
48
|
import { WebGLMorphtargets } from './webgl/WebGLMorphtargets.js';
|
|
49
|
+
import { WebGLMultiview } from './webgl/WebGLMultiview.js';
|
|
49
50
|
import { WebGLObjects } from './webgl/WebGLObjects.js';
|
|
50
51
|
import { WebGLPrograms } from './webgl/WebGLPrograms.js';
|
|
51
52
|
import { WebGLProperties } from './webgl/WebGLProperties.js';
|
|
@@ -79,6 +80,7 @@ class WebGLRenderer {
|
|
|
79
80
|
preserveDrawingBuffer = false,
|
|
80
81
|
powerPreference = 'default',
|
|
81
82
|
failIfMajorPerformanceCaveat = false,
|
|
83
|
+
multiviewStereo = false,
|
|
82
84
|
} = parameters;
|
|
83
85
|
|
|
84
86
|
this.isWebGLRenderer = true;
|
|
@@ -313,6 +315,7 @@ class WebGLRenderer {
|
|
|
313
315
|
let extensions, capabilities, state, info;
|
|
314
316
|
let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;
|
|
315
317
|
let programCache, materials, renderLists, renderStates, clipping, shadowMap;
|
|
318
|
+
let multiview;
|
|
316
319
|
|
|
317
320
|
let background, morphtargets, bufferRenderer, indexedBufferRenderer;
|
|
318
321
|
|
|
@@ -346,6 +349,7 @@ class WebGLRenderer {
|
|
|
346
349
|
renderLists = new WebGLRenderLists();
|
|
347
350
|
renderStates = new WebGLRenderStates( extensions, capabilities );
|
|
348
351
|
background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );
|
|
352
|
+
multiview = new WebGLMultiview( _this, extensions, _gl );
|
|
349
353
|
shadowMap = new WebGLShadowMap( _this, objects, capabilities );
|
|
350
354
|
uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
|
|
351
355
|
|
|
@@ -368,7 +372,7 @@ class WebGLRenderer {
|
|
|
368
372
|
|
|
369
373
|
// xr
|
|
370
374
|
|
|
371
|
-
const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl ) : new WebVRManager( _this );
|
|
375
|
+
const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl, extensions, multiviewStereo ) : new WebVRManager( _this );
|
|
372
376
|
|
|
373
377
|
this.xr = xr;
|
|
374
378
|
|
|
@@ -630,7 +634,12 @@ class WebGLRenderer {
|
|
|
630
634
|
}
|
|
631
635
|
|
|
632
636
|
if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;
|
|
633
|
-
if ( stencil )
|
|
637
|
+
if ( stencil ) {
|
|
638
|
+
|
|
639
|
+
bits |= _gl.STENCIL_BUFFER_BIT;
|
|
640
|
+
this.state.buffers.stencil.setMask( 0xffffffff );
|
|
641
|
+
|
|
642
|
+
}
|
|
634
643
|
|
|
635
644
|
_gl.clear( bits );
|
|
636
645
|
|
|
@@ -913,36 +922,40 @@ class WebGLRenderer {
|
|
|
913
922
|
|
|
914
923
|
// Compile
|
|
915
924
|
|
|
916
|
-
|
|
925
|
+
function prepareMaterial( material, scene, object ) {
|
|
917
926
|
|
|
918
|
-
|
|
927
|
+
if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
|
|
919
928
|
|
|
920
|
-
|
|
929
|
+
material.side = BackSide;
|
|
930
|
+
material.needsUpdate = true;
|
|
931
|
+
getProgram( material, scene, object );
|
|
921
932
|
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
933
|
+
material.side = FrontSide;
|
|
934
|
+
material.needsUpdate = true;
|
|
935
|
+
getProgram( material, scene, object );
|
|
925
936
|
|
|
926
|
-
|
|
927
|
-
material.needsUpdate = true;
|
|
928
|
-
getProgram( material, scene, object );
|
|
937
|
+
material.side = DoubleSide;
|
|
929
938
|
|
|
930
|
-
|
|
939
|
+
} else {
|
|
931
940
|
|
|
932
|
-
|
|
941
|
+
getProgram( material, scene, object );
|
|
942
|
+
|
|
943
|
+
}
|
|
933
944
|
|
|
934
|
-
|
|
945
|
+
}
|
|
935
946
|
|
|
936
|
-
|
|
947
|
+
this.compile = function ( scene, camera, targetScene = null ) {
|
|
937
948
|
|
|
938
|
-
|
|
949
|
+
if ( targetScene === null ) targetScene = scene;
|
|
939
950
|
|
|
940
|
-
currentRenderState = renderStates.get(
|
|
951
|
+
currentRenderState = renderStates.get( targetScene );
|
|
941
952
|
currentRenderState.init();
|
|
942
953
|
|
|
943
954
|
renderStateStack.push( currentRenderState );
|
|
944
955
|
|
|
945
|
-
scene
|
|
956
|
+
// gather lights from both the target scene and the new object that will be added to the scene.
|
|
957
|
+
|
|
958
|
+
targetScene.traverseVisible( function ( object ) {
|
|
946
959
|
|
|
947
960
|
if ( object.isLight && object.layers.test( camera.layers ) ) {
|
|
948
961
|
|
|
@@ -958,8 +971,32 @@ class WebGLRenderer {
|
|
|
958
971
|
|
|
959
972
|
} );
|
|
960
973
|
|
|
974
|
+
if ( scene !== targetScene ) {
|
|
975
|
+
|
|
976
|
+
scene.traverseVisible( function ( object ) {
|
|
977
|
+
|
|
978
|
+
if ( object.isLight && object.layers.test( camera.layers ) ) {
|
|
979
|
+
|
|
980
|
+
currentRenderState.pushLight( object );
|
|
981
|
+
|
|
982
|
+
if ( object.castShadow ) {
|
|
983
|
+
|
|
984
|
+
currentRenderState.pushShadow( object );
|
|
985
|
+
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
} );
|
|
991
|
+
|
|
992
|
+
}
|
|
993
|
+
|
|
961
994
|
currentRenderState.setupLights( _this._useLegacyLights );
|
|
962
995
|
|
|
996
|
+
// Only initialize materials in the new scene, not the targetScene.
|
|
997
|
+
|
|
998
|
+
const materials = new Set();
|
|
999
|
+
|
|
963
1000
|
scene.traverse( function ( object ) {
|
|
964
1001
|
|
|
965
1002
|
const material = object.material;
|
|
@@ -972,13 +1009,15 @@ class WebGLRenderer {
|
|
|
972
1009
|
|
|
973
1010
|
const material2 = material[ i ];
|
|
974
1011
|
|
|
975
|
-
|
|
1012
|
+
prepareMaterial( material2, targetScene, object );
|
|
1013
|
+
materials.add( material2 );
|
|
976
1014
|
|
|
977
1015
|
}
|
|
978
1016
|
|
|
979
1017
|
} else {
|
|
980
1018
|
|
|
981
|
-
|
|
1019
|
+
prepareMaterial( material, targetScene, object );
|
|
1020
|
+
materials.add( material );
|
|
982
1021
|
|
|
983
1022
|
}
|
|
984
1023
|
|
|
@@ -989,6 +1028,70 @@ class WebGLRenderer {
|
|
|
989
1028
|
renderStateStack.pop();
|
|
990
1029
|
currentRenderState = null;
|
|
991
1030
|
|
|
1031
|
+
return materials;
|
|
1032
|
+
|
|
1033
|
+
};
|
|
1034
|
+
|
|
1035
|
+
// compileAsync
|
|
1036
|
+
|
|
1037
|
+
this.compileAsync = function ( scene, camera, targetScene = null ) {
|
|
1038
|
+
|
|
1039
|
+
const materials = this.compile( scene, camera, targetScene );
|
|
1040
|
+
|
|
1041
|
+
// Wait for all the materials in the new object to indicate that they're
|
|
1042
|
+
// ready to be used before resolving the promise.
|
|
1043
|
+
|
|
1044
|
+
return new Promise( ( resolve ) => {
|
|
1045
|
+
|
|
1046
|
+
function checkMaterialsReady() {
|
|
1047
|
+
|
|
1048
|
+
materials.forEach( function ( material ) {
|
|
1049
|
+
|
|
1050
|
+
const materialProperties = properties.get( material );
|
|
1051
|
+
const program = materialProperties.currentProgram;
|
|
1052
|
+
|
|
1053
|
+
if ( program.isReady() ) {
|
|
1054
|
+
|
|
1055
|
+
// remove any programs that report they're ready to use from the list
|
|
1056
|
+
materials.delete( material );
|
|
1057
|
+
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
} );
|
|
1061
|
+
|
|
1062
|
+
// once the list of compiling materials is empty, call the callback
|
|
1063
|
+
|
|
1064
|
+
if ( materials.size === 0 ) {
|
|
1065
|
+
|
|
1066
|
+
resolve( scene );
|
|
1067
|
+
return;
|
|
1068
|
+
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
// if some materials are still not ready, wait a bit and check again
|
|
1072
|
+
|
|
1073
|
+
setTimeout( checkMaterialsReady, 10 );
|
|
1074
|
+
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
if ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {
|
|
1078
|
+
|
|
1079
|
+
// If we can check the compilation status of the materials without
|
|
1080
|
+
// blocking then do so right away.
|
|
1081
|
+
|
|
1082
|
+
checkMaterialsReady();
|
|
1083
|
+
|
|
1084
|
+
} else {
|
|
1085
|
+
|
|
1086
|
+
// Otherwise start by waiting a bit to give the materials we just
|
|
1087
|
+
// initialized a chance to finish.
|
|
1088
|
+
|
|
1089
|
+
setTimeout( checkMaterialsReady, 10 );
|
|
1090
|
+
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
} );
|
|
1094
|
+
|
|
992
1095
|
};
|
|
993
1096
|
|
|
994
1097
|
// Animation Loop
|
|
@@ -1115,13 +1218,23 @@ class WebGLRenderer {
|
|
|
1115
1218
|
|
|
1116
1219
|
if ( camera.isArrayCamera ) {
|
|
1117
1220
|
|
|
1118
|
-
|
|
1221
|
+
if ( xr.enabled && xr.isMultiview ) {
|
|
1119
1222
|
|
|
1120
|
-
|
|
1223
|
+
textures.setDeferTextureUploads( true );
|
|
1121
1224
|
|
|
1122
|
-
|
|
1225
|
+
renderScene( currentRenderList, scene, camera, camera.cameras[ 0 ].viewport );
|
|
1123
1226
|
|
|
1124
|
-
|
|
1227
|
+
} else {
|
|
1228
|
+
|
|
1229
|
+
const cameras = camera.cameras;
|
|
1230
|
+
|
|
1231
|
+
for ( let i = 0, l = cameras.length; i < l; i ++ ) {
|
|
1232
|
+
|
|
1233
|
+
const camera2 = cameras[ i ];
|
|
1234
|
+
|
|
1235
|
+
renderScene( currentRenderList, scene, camera2, camera2.viewport );
|
|
1236
|
+
|
|
1237
|
+
}
|
|
1125
1238
|
|
|
1126
1239
|
}
|
|
1127
1240
|
|
|
@@ -1149,6 +1262,8 @@ class WebGLRenderer {
|
|
|
1149
1262
|
|
|
1150
1263
|
if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
|
|
1151
1264
|
|
|
1265
|
+
textures.runDeferredUploads();
|
|
1266
|
+
|
|
1152
1267
|
if ( xr.enabled && xr.submitFrame ) {
|
|
1153
1268
|
|
|
1154
1269
|
xr.submitFrame();
|
|
@@ -1330,6 +1445,14 @@ class WebGLRenderer {
|
|
|
1330
1445
|
|
|
1331
1446
|
function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {
|
|
1332
1447
|
|
|
1448
|
+
const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;
|
|
1449
|
+
|
|
1450
|
+
if ( overrideMaterial !== null ) {
|
|
1451
|
+
|
|
1452
|
+
return;
|
|
1453
|
+
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1333
1456
|
const isWebGL2 = capabilities.isWebGL2;
|
|
1334
1457
|
|
|
1335
1458
|
if ( _transmissionRenderTarget === null ) {
|
|
@@ -1589,16 +1712,26 @@ class WebGLRenderer {
|
|
|
1589
1712
|
|
|
1590
1713
|
}
|
|
1591
1714
|
|
|
1592
|
-
const progUniforms = program.getUniforms();
|
|
1593
|
-
const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
|
|
1594
|
-
|
|
1595
1715
|
materialProperties.currentProgram = program;
|
|
1596
|
-
materialProperties.uniformsList =
|
|
1716
|
+
materialProperties.uniformsList = null;
|
|
1597
1717
|
|
|
1598
1718
|
return program;
|
|
1599
1719
|
|
|
1600
1720
|
}
|
|
1601
1721
|
|
|
1722
|
+
function getUniformList( materialProperties ) {
|
|
1723
|
+
|
|
1724
|
+
if ( materialProperties.uniformsList === null ) {
|
|
1725
|
+
|
|
1726
|
+
const progUniforms = materialProperties.currentProgram.getUniforms();
|
|
1727
|
+
materialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );
|
|
1728
|
+
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
return materialProperties.uniformsList;
|
|
1732
|
+
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1602
1735
|
function updateCommonMaterialProperties( material, parameters ) {
|
|
1603
1736
|
|
|
1604
1737
|
const materialProperties = properties.get( material );
|
|
@@ -1616,6 +1749,7 @@ class WebGLRenderer {
|
|
|
1616
1749
|
materialProperties.vertexAlphas = parameters.vertexAlphas;
|
|
1617
1750
|
materialProperties.vertexTangents = parameters.vertexTangents;
|
|
1618
1751
|
materialProperties.toneMapping = parameters.toneMapping;
|
|
1752
|
+
materialProperties.numMultiviewViews = parameters.numMultiviewViews;
|
|
1619
1753
|
|
|
1620
1754
|
}
|
|
1621
1755
|
|
|
@@ -1647,6 +1781,8 @@ class WebGLRenderer {
|
|
|
1647
1781
|
|
|
1648
1782
|
}
|
|
1649
1783
|
|
|
1784
|
+
const numMultiviewViews = _currentRenderTarget && _currentRenderTarget.isWebGLMultiviewRenderTarget ? _currentRenderTarget.numViews : 0;
|
|
1785
|
+
|
|
1650
1786
|
const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
|
|
1651
1787
|
const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
|
|
1652
1788
|
|
|
@@ -1750,6 +1886,10 @@ class WebGLRenderer {
|
|
|
1750
1886
|
|
|
1751
1887
|
needsProgramChange = true;
|
|
1752
1888
|
|
|
1889
|
+
} else if ( materialProperties.numMultiviewViews !== numMultiviewViews ) {
|
|
1890
|
+
|
|
1891
|
+
needsProgramChange = true;
|
|
1892
|
+
|
|
1753
1893
|
}
|
|
1754
1894
|
|
|
1755
1895
|
} else {
|
|
@@ -1796,8 +1936,17 @@ class WebGLRenderer {
|
|
|
1796
1936
|
|
|
1797
1937
|
// common camera uniforms
|
|
1798
1938
|
|
|
1799
|
-
|
|
1800
|
-
|
|
1939
|
+
if ( program.numMultiviewViews > 0 ) {
|
|
1940
|
+
|
|
1941
|
+
multiview.updateCameraProjectionMatricesUniform( camera, p_uniforms );
|
|
1942
|
+
multiview.updateCameraViewMatricesUniform( camera, p_uniforms );
|
|
1943
|
+
|
|
1944
|
+
} else {
|
|
1945
|
+
|
|
1946
|
+
p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
|
|
1947
|
+
p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
|
|
1948
|
+
|
|
1949
|
+
}
|
|
1801
1950
|
|
|
1802
1951
|
const uCamPos = p_uniforms.map.cameraPosition;
|
|
1803
1952
|
|
|
@@ -1926,13 +2075,13 @@ class WebGLRenderer {
|
|
|
1926
2075
|
|
|
1927
2076
|
materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
|
|
1928
2077
|
|
|
1929
|
-
WebGLUniforms.upload( _gl, materialProperties
|
|
2078
|
+
WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
|
|
1930
2079
|
|
|
1931
2080
|
}
|
|
1932
2081
|
|
|
1933
2082
|
if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
|
|
1934
2083
|
|
|
1935
|
-
WebGLUniforms.upload( _gl, materialProperties
|
|
2084
|
+
WebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );
|
|
1936
2085
|
material.uniformsNeedUpdate = false;
|
|
1937
2086
|
|
|
1938
2087
|
}
|
|
@@ -1945,8 +2094,17 @@ class WebGLRenderer {
|
|
|
1945
2094
|
|
|
1946
2095
|
// common matrices
|
|
1947
2096
|
|
|
1948
|
-
|
|
1949
|
-
|
|
2097
|
+
if ( program.numMultiviewViews > 0 ) {
|
|
2098
|
+
|
|
2099
|
+
multiview.updateObjectMatricesUniforms( object, camera, p_uniforms );
|
|
2100
|
+
|
|
2101
|
+
} else {
|
|
2102
|
+
|
|
2103
|
+
p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
|
|
2104
|
+
p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
|
|
2105
|
+
|
|
2106
|
+
}
|
|
2107
|
+
|
|
1950
2108
|
p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
|
|
1951
2109
|
|
|
1952
2110
|
// UBOs
|
|
@@ -2056,20 +2214,16 @@ class WebGLRenderer {
|
|
|
2056
2214
|
const renderTargetProperties = properties.get( renderTarget );
|
|
2057
2215
|
renderTargetProperties.__hasExternalTextures = true;
|
|
2058
2216
|
|
|
2059
|
-
|
|
2217
|
+
renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
|
|
2060
2218
|
|
|
2061
|
-
|
|
2219
|
+
if ( ! renderTargetProperties.__autoAllocateDepthBuffer && ! _currentRenderTarget.isWebGLMultiviewRenderTarget ) {
|
|
2062
2220
|
|
|
2063
|
-
|
|
2221
|
+
// The multisample_render_to_texture extension doesn't work properly if there
|
|
2222
|
+
// are midframe flushes and an external depth buffer. Disable use of the extension.
|
|
2223
|
+
if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
|
|
2064
2224
|
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
|
|
2068
|
-
|
|
2069
|
-
console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
|
|
2070
|
-
renderTargetProperties.__useRenderToTexture = false;
|
|
2071
|
-
|
|
2072
|
-
}
|
|
2225
|
+
console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
|
|
2226
|
+
renderTargetProperties.__useRenderToTexture = false;
|
|
2073
2227
|
|
|
2074
2228
|
}
|
|
2075
2229
|
|
|
@@ -6,6 +6,14 @@ export default /* glsl */`
|
|
|
6
6
|
|
|
7
7
|
reflectedLight.indirectDiffuse *= ambientOcclusion;
|
|
8
8
|
|
|
9
|
+
#if defined( USE_CLEARCOAT )
|
|
10
|
+
clearcoatSpecularIndirect *= ambientOcclusion;
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
#if defined( USE_SHEEN )
|
|
14
|
+
sheenSpecularIndirect *= ambientOcclusion;
|
|
15
|
+
#endif
|
|
16
|
+
|
|
9
17
|
#if defined( USE_ENVMAP ) && defined( STANDARD )
|
|
10
18
|
|
|
11
19
|
float dotNV = saturate( dot( geometryNormal, geometryViewDir ) );
|
|
@@ -24,8 +24,9 @@ export default /* glsl */`
|
|
|
24
24
|
|
|
25
25
|
vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
vec3
|
|
27
|
+
// normalize is done to ensure that the bump map looks the same regardless of the texture's scale
|
|
28
|
+
vec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );
|
|
29
|
+
vec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );
|
|
29
30
|
vec3 vN = surf_norm; // normalized
|
|
30
31
|
|
|
31
32
|
vec3 R1 = cross( vSigmaY, vN );
|
|
@@ -17,7 +17,7 @@ vec3 geometryPosition = - vViewPosition;
|
|
|
17
17
|
vec3 geometryNormal = normal;
|
|
18
18
|
vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
|
|
19
19
|
|
|
20
|
-
vec3 geometryClearcoatNormal;
|
|
20
|
+
vec3 geometryClearcoatNormal = vec3( 0.0 );
|
|
21
21
|
|
|
22
22
|
#ifdef USE_CLEARCOAT
|
|
23
23
|
|
|
@@ -49,8 +49,10 @@ struct PhysicalMaterial {
|
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
// temporary
|
|
52
|
-
vec3
|
|
53
|
-
vec3
|
|
52
|
+
vec3 clearcoatSpecularDirect = vec3( 0.0 );
|
|
53
|
+
vec3 clearcoatSpecularIndirect = vec3( 0.0 );
|
|
54
|
+
vec3 sheenSpecularDirect = vec3( 0.0 );
|
|
55
|
+
vec3 sheenSpecularIndirect = vec3(0.0 );
|
|
54
56
|
|
|
55
57
|
vec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {
|
|
56
58
|
float x = clamp( 1.0 - dotVH, 0.0, 1.0 );
|
|
@@ -485,13 +487,13 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
|
|
|
485
487
|
|
|
486
488
|
vec3 ccIrradiance = dotNLcc * directLight.color;
|
|
487
489
|
|
|
488
|
-
|
|
490
|
+
clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );
|
|
489
491
|
|
|
490
492
|
#endif
|
|
491
493
|
|
|
492
494
|
#ifdef USE_SHEEN
|
|
493
495
|
|
|
494
|
-
|
|
496
|
+
sheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );
|
|
495
497
|
|
|
496
498
|
#endif
|
|
497
499
|
|
|
@@ -510,13 +512,13 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
|
|
|
510
512
|
|
|
511
513
|
#ifdef USE_CLEARCOAT
|
|
512
514
|
|
|
513
|
-
|
|
515
|
+
clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
|
|
514
516
|
|
|
515
517
|
#endif
|
|
516
518
|
|
|
517
519
|
#ifdef USE_SHEEN
|
|
518
520
|
|
|
519
|
-
|
|
521
|
+
sheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );
|
|
520
522
|
|
|
521
523
|
#endif
|
|
522
524
|
|
|
@@ -197,7 +197,7 @@ void main() {
|
|
|
197
197
|
// https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
|
|
198
198
|
float sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );
|
|
199
199
|
|
|
200
|
-
outgoingLight = outgoingLight * sheenEnergyComp +
|
|
200
|
+
outgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;
|
|
201
201
|
|
|
202
202
|
#endif
|
|
203
203
|
|
|
@@ -207,7 +207,7 @@ void main() {
|
|
|
207
207
|
|
|
208
208
|
vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );
|
|
209
209
|
|
|
210
|
-
outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) +
|
|
210
|
+
outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;
|
|
211
211
|
|
|
212
212
|
#endif
|
|
213
213
|
|
|
@@ -68,7 +68,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
|
|
|
68
68
|
if ( boxMesh === undefined ) {
|
|
69
69
|
|
|
70
70
|
boxMesh = new Mesh(
|
|
71
|
-
new BoxGeometry(
|
|
71
|
+
new BoxGeometry( 10000, 10000, 10000 ),
|
|
72
72
|
new ShaderMaterial( {
|
|
73
73
|
name: 'BackgroundCubeMaterial',
|
|
74
74
|
uniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @author fernandojsg / http://fernandojsg.com
|
|
3
|
+
* @author Takahiro https://github.com/takahirox
|
|
4
|
+
*/
|
|
5
|
+
import { Matrix3 } from '../../math/Matrix3.js';
|
|
6
|
+
import { Matrix4 } from '../../math/Matrix4.js';
|
|
7
|
+
|
|
8
|
+
class WebGLMultiview {
|
|
9
|
+
|
|
10
|
+
constructor( renderer, extensions, gl ) {
|
|
11
|
+
|
|
12
|
+
this.renderer = renderer;
|
|
13
|
+
|
|
14
|
+
this.DEFAULT_NUMVIEWS = 2;
|
|
15
|
+
this.maxNumViews = 0;
|
|
16
|
+
this.gl = gl;
|
|
17
|
+
|
|
18
|
+
this.extensions = extensions;
|
|
19
|
+
|
|
20
|
+
this.available = this.extensions.has( 'OCULUS_multiview' );
|
|
21
|
+
|
|
22
|
+
if ( this.available ) {
|
|
23
|
+
|
|
24
|
+
const extension = this.extensions.get( 'OCULUS_multiview' );
|
|
25
|
+
|
|
26
|
+
this.maxNumViews = this.gl.getParameter( extension.MAX_VIEWS_OVR );
|
|
27
|
+
|
|
28
|
+
this.mat4 = [];
|
|
29
|
+
this.mat3 = [];
|
|
30
|
+
this.cameraArray = [];
|
|
31
|
+
|
|
32
|
+
for ( var i = 0; i < this.maxNumViews; i ++ ) {
|
|
33
|
+
|
|
34
|
+
this.mat4[ i ] = new Matrix4();
|
|
35
|
+
this.mat3[ i ] = new Matrix3();
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//
|
|
44
|
+
getCameraArray( camera ) {
|
|
45
|
+
|
|
46
|
+
if ( camera.isArrayCamera ) return camera.cameras;
|
|
47
|
+
|
|
48
|
+
this.cameraArray[ 0 ] = camera;
|
|
49
|
+
|
|
50
|
+
return this.cameraArray;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
updateCameraProjectionMatricesUniform( camera, uniforms ) {
|
|
55
|
+
|
|
56
|
+
var cameras = this.getCameraArray( camera );
|
|
57
|
+
|
|
58
|
+
for ( var i = 0; i < cameras.length; i ++ ) {
|
|
59
|
+
|
|
60
|
+
this.mat4[ i ].copy( cameras[ i ].projectionMatrix );
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
uniforms.setValue( this.gl, 'projectionMatrices', this.mat4 );
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
updateCameraViewMatricesUniform( camera, uniforms ) {
|
|
69
|
+
|
|
70
|
+
var cameras = this.getCameraArray( camera );
|
|
71
|
+
|
|
72
|
+
for ( var i = 0; i < cameras.length; i ++ ) {
|
|
73
|
+
|
|
74
|
+
this.mat4[ i ].copy( cameras[ i ].matrixWorldInverse );
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
uniforms.setValue( this.gl, 'viewMatrices', this.mat4 );
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
updateObjectMatricesUniforms( object, camera, uniforms ) {
|
|
83
|
+
|
|
84
|
+
var cameras = this.getCameraArray( camera );
|
|
85
|
+
|
|
86
|
+
for ( var i = 0; i < cameras.length; i ++ ) {
|
|
87
|
+
|
|
88
|
+
this.mat4[ i ].multiplyMatrices( cameras[ i ].matrixWorldInverse, object.matrixWorld );
|
|
89
|
+
this.mat3[ i ].getNormalMatrix( this.mat4[ i ] );
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
uniforms.setValue( this.gl, 'modelViewMatrices', this.mat4 );
|
|
94
|
+
uniforms.setValue( this.gl, 'normalMatrices', this.mat3 );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export { WebGLMultiview };
|