super-three 0.157.1 → 0.160.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/build/three.cjs +3100 -1537
- package/build/three.js +3100 -1537
- package/build/three.min.js +1 -1
- package/build/three.module.js +3093 -1538
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +291 -0
- package/examples/jsm/controls/FlyControls.js +26 -0
- package/examples/jsm/controls/OrbitControls.js +62 -41
- package/examples/jsm/controls/TransformControls.js +27 -11
- package/examples/jsm/csm/CSMShader.js +53 -48
- package/examples/jsm/exporters/GLTFExporter.js +151 -3
- package/examples/jsm/exporters/USDZExporter.js +27 -19
- package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
- package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
- package/examples/jsm/helpers/TextureHelper.js +237 -0
- package/examples/jsm/interactive/HTMLMesh.js +9 -2
- package/examples/jsm/libs/lottie_canvas.module.js +6 -1
- package/examples/jsm/libs/opentype.module.js +13 -75
- package/examples/jsm/libs/surfaceNet.js +201 -0
- package/examples/jsm/lines/LineMaterial.js +16 -33
- package/examples/jsm/loaders/ColladaLoader.js +0 -6
- package/examples/jsm/loaders/DRACOLoader.js +4 -3
- package/examples/jsm/loaders/FBXLoader.js +294 -124
- package/examples/jsm/loaders/GLTFLoader.js +83 -6
- package/examples/jsm/loaders/LUTImageLoader.js +162 -0
- package/examples/jsm/loaders/MaterialXLoader.js +73 -54
- package/examples/jsm/loaders/NRRDLoader.js +0 -13
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/USDZLoader.js +3 -17
- package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/math/Capsule.js +0 -55
- package/examples/jsm/math/Octree.js +85 -7
- package/examples/jsm/misc/Timer.js +119 -0
- package/examples/jsm/misc/TubePainter.js +3 -6
- package/examples/jsm/modifiers/CurveModifier.js +20 -2
- package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
- package/examples/jsm/modifiers/TessellateModifier.js +3 -3
- package/examples/jsm/nodes/Nodes.js +16 -12
- package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
- package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
- package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
- package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
- package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
- package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
- package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
- package/examples/jsm/nodes/code/CodeNode.js +3 -3
- package/examples/jsm/nodes/code/FunctionNode.js +1 -1
- package/examples/jsm/nodes/core/AssignNode.js +72 -0
- package/examples/jsm/nodes/core/AttributeNode.js +7 -1
- package/examples/jsm/nodes/core/CacheNode.js +4 -1
- package/examples/jsm/nodes/core/ConstNode.js +1 -1
- package/examples/jsm/nodes/core/LightingModel.js +3 -1
- package/examples/jsm/nodes/core/Node.js +13 -15
- package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
- package/examples/jsm/nodes/core/NodeFrame.js +10 -8
- package/examples/jsm/nodes/core/NodeUniform.js +12 -0
- package/examples/jsm/nodes/core/NodeUtils.js +7 -9
- package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
- package/examples/jsm/nodes/core/ParameterNode.js +33 -0
- package/examples/jsm/nodes/core/PropertyNode.js +15 -6
- package/examples/jsm/nodes/core/StackNode.js +7 -17
- package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/UniformGroup.js +13 -0
- package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
- package/examples/jsm/nodes/core/UniformNode.js +17 -0
- package/examples/jsm/nodes/core/VarNode.js +7 -34
- package/examples/jsm/nodes/core/VaryingNode.js +3 -7
- package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
- package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
- package/examples/jsm/nodes/display/PassNode.js +182 -0
- package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +17 -10
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
- package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
- package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
- package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
- package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
- package/examples/jsm/nodes/math/MathNode.js +2 -0
- package/examples/jsm/nodes/math/OperatorNode.js +24 -27
- package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
- package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
- package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
- package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
- package/examples/jsm/nodes/utils/JoinNode.js +11 -1
- package/examples/jsm/nodes/utils/LoopNode.js +36 -24
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +10 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/examples/jsm/objects/InstancedPoints.js +21 -0
- package/examples/jsm/objects/Lensflare.js +20 -0
- package/examples/jsm/objects/QuadMesh.js +60 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
- package/examples/jsm/objects/Refractor.js +3 -0
- package/examples/jsm/objects/Sky.js +5 -3
- package/examples/jsm/objects/Water.js +5 -2
- package/examples/jsm/objects/Water2.js +3 -0
- package/examples/jsm/physics/AmmoPhysics.js +21 -0
- package/examples/jsm/physics/RapierPhysics.js +21 -0
- package/examples/jsm/postprocessing/BokehPass.js +3 -2
- package/examples/jsm/postprocessing/GTAOPass.js +572 -0
- package/examples/jsm/postprocessing/LUTPass.js +2 -1
- package/examples/jsm/postprocessing/OutputPass.js +3 -0
- package/examples/jsm/postprocessing/Pass.js +14 -3
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SMAAPass.js +0 -2
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
- package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
- package/examples/jsm/renderers/SVGRenderer.js +9 -6
- package/examples/jsm/renderers/common/Animation.js +10 -21
- package/examples/jsm/renderers/common/Backend.js +19 -3
- package/examples/jsm/renderers/common/Background.js +20 -22
- package/examples/jsm/renderers/common/Bindings.js +31 -22
- package/examples/jsm/renderers/common/ChainMap.js +3 -3
- package/examples/jsm/renderers/common/Color4.js +37 -0
- package/examples/jsm/renderers/common/Geometries.js +4 -4
- package/examples/jsm/renderers/common/Info.js +12 -2
- package/examples/jsm/renderers/common/Pipelines.js +3 -51
- package/examples/jsm/renderers/common/PostProcessing.js +25 -0
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderContexts.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +21 -2
- package/examples/jsm/renderers/common/RenderObjects.js +5 -3
- package/examples/jsm/renderers/common/Renderer.js +137 -37
- package/examples/jsm/renderers/common/StorageTexture.js +1 -0
- package/examples/jsm/renderers/common/Textures.js +8 -37
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +121 -19
- package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -5
- package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +188 -137
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -90
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
- package/examples/jsm/shaders/AfterimageShader.js +2 -0
- package/examples/jsm/shaders/BasicShader.js +2 -0
- package/examples/jsm/shaders/BlendShader.js +2 -0
- package/examples/jsm/shaders/BokehShader.js +2 -0
- package/examples/jsm/shaders/BokehShader2.js +4 -0
- package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
- package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
- package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
- package/examples/jsm/shaders/FXAAShader.js +135 -133
- package/examples/jsm/shaders/FilmShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +2 -0
- package/examples/jsm/shaders/FreiChenShader.js +2 -0
- package/examples/jsm/shaders/GTAOShader.js +424 -0
- package/examples/jsm/shaders/GodRaysShader.js +8 -0
- package/examples/jsm/shaders/HalftoneShader.js +2 -0
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/HueSaturationShader.js +2 -0
- package/examples/jsm/shaders/KaleidoShader.js +2 -0
- package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
- package/examples/jsm/shaders/LuminosityShader.js +2 -0
- package/examples/jsm/shaders/MMDToonShader.js +2 -0
- package/examples/jsm/shaders/MirrorShader.js +2 -0
- package/examples/jsm/shaders/NormalMapShader.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +8 -5
- package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
- package/examples/jsm/shaders/SAOShader.js +7 -3
- package/examples/jsm/shaders/SMAAShader.js +6 -0
- package/examples/jsm/shaders/SSAOShader.js +8 -3
- package/examples/jsm/shaders/SSRShader.js +6 -0
- package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
- package/examples/jsm/shaders/TechnicolorShader.js +2 -0
- package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
- package/examples/jsm/shaders/VelocityShader.js +2 -0
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
- package/examples/jsm/transpiler/AST.js +270 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
- package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
- package/examples/jsm/transpiler/TSLEncoder.js +715 -0
- package/examples/jsm/transpiler/Transpiler.js +18 -0
- package/examples/jsm/utils/SortUtils.js +158 -0
- package/examples/jsm/utils/TextureUtils.js +33 -21
- package/examples/jsm/webxr/ARButton.js +14 -0
- package/examples/jsm/webxr/VRButton.js +24 -9
- package/examples/jsm/webxr/XRButton.js +27 -11
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -6
- package/src/Three.js +1 -0
- package/src/constants.js +8 -1
- package/src/core/BufferAttribute.js +21 -2
- package/src/core/InterleavedBuffer.js +21 -1
- package/src/core/Object3D.js +60 -12
- package/src/core/UniformsGroup.js +7 -1
- package/src/extras/PMREMGenerator.js +7 -1
- package/src/extras/curves/LineCurve3.js +4 -0
- package/src/loaders/AudioLoader.js +1 -1
- package/src/loaders/BufferGeometryLoader.js +0 -7
- package/src/loaders/ImageBitmapLoader.js +25 -1
- package/src/loaders/MaterialLoader.js +10 -2
- package/src/loaders/ObjectLoader.js +49 -0
- package/src/materials/Material.js +27 -13
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/Box3.js +35 -18
- package/src/math/ColorManagement.js +0 -16
- package/src/math/Quaternion.js +5 -4
- package/src/math/Sphere.js +2 -0
- package/src/math/Triangle.js +17 -5
- package/src/math/Vector3.js +11 -12
- package/src/objects/BatchedMesh.js +1020 -0
- package/src/objects/Skeleton.js +1 -3
- package/src/objects/SkinnedMesh.js +6 -7
- package/src/renderers/WebGL3DRenderTarget.js +2 -2
- package/src/renderers/WebGLArrayRenderTarget.js +2 -2
- package/src/renderers/WebGLRenderer.js +165 -43
- package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
- package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
- package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk.js +4 -0
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
- package/src/renderers/webgl/WebGLAttributes.js +39 -5
- package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLExtensions.js +1 -0
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLLights.js +11 -2
- package/src/renderers/webgl/WebGLProgram.js +100 -51
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLShadowMap.js +35 -0
- package/src/renderers/webgl/WebGLState.js +25 -4
- package/src/renderers/webgl/WebGLTextures.js +7 -11
- package/src/renderers/webgl/WebGLUniforms.js +11 -1
- package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
- package/src/renderers/webxr/WebXRManager.js +16 -0
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
|
@@ -9,7 +9,7 @@ import LightingModel from '../core/LightingModel.js';
|
|
|
9
9
|
import { diffuseColor, specularColor, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness } from '../core/PropertyNode.js';
|
|
10
10
|
import { transformedNormalView, transformedClearcoatNormalView } from '../accessors/NormalNode.js';
|
|
11
11
|
import { positionViewDirection } from '../accessors/PositionNode.js';
|
|
12
|
-
import { float, vec3, mat3 } from '../shadernode/ShaderNode.js';
|
|
12
|
+
import { tslFn, float, vec3, mat3 } from '../shadernode/ShaderNode.js';
|
|
13
13
|
import { cond } from '../math/CondNode.js';
|
|
14
14
|
import { mix, smoothstep } from '../math/MathNode.js';
|
|
15
15
|
|
|
@@ -56,11 +56,12 @@ const evalSensitivity = ( OPD, shift ) => {
|
|
|
56
56
|
xyz = vec3( xyz.x.add( x ), xyz.y, xyz.z ).div( 1.0685e-7 );
|
|
57
57
|
|
|
58
58
|
const rgb = XYZ_TO_REC709.mul( xyz );
|
|
59
|
+
|
|
59
60
|
return rgb;
|
|
60
61
|
|
|
61
62
|
};
|
|
62
63
|
|
|
63
|
-
const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0 ) => {
|
|
64
|
+
const evalIridescence = tslFn( ( { outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0 } ) => {
|
|
64
65
|
|
|
65
66
|
// Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0
|
|
66
67
|
const iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );
|
|
@@ -121,7 +122,17 @@ const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0
|
|
|
121
122
|
// Since out of gamut colors might be produced, negative color values are clamped to 0.
|
|
122
123
|
return I.max( vec3( 0.0 ) );
|
|
123
124
|
|
|
124
|
-
}
|
|
125
|
+
} ).setLayout( {
|
|
126
|
+
name: 'evalIridescence',
|
|
127
|
+
type: 'vec3',
|
|
128
|
+
inputs: [
|
|
129
|
+
{ name: 'outsideIOR', type: 'float' },
|
|
130
|
+
{ name: 'eta2', type: 'float' },
|
|
131
|
+
{ name: 'cosTheta1', type: 'float' },
|
|
132
|
+
{ name: 'thinFilmThickness', type: 'float' },
|
|
133
|
+
{ name: 'baseF0', type: 'vec3' }
|
|
134
|
+
]
|
|
135
|
+
} );
|
|
125
136
|
|
|
126
137
|
//
|
|
127
138
|
// Sheen
|
|
@@ -130,7 +141,7 @@ const evalIridescence = ( outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0
|
|
|
130
141
|
// This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from
|
|
131
142
|
// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found
|
|
132
143
|
// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing
|
|
133
|
-
const IBLSheenBRDF = ( normal, viewDir, roughness ) => {
|
|
144
|
+
const IBLSheenBRDF = tslFn( ( { normal, viewDir, roughness } ) => {
|
|
134
145
|
|
|
135
146
|
const dotNV = normal.dot( viewDir ).saturate();
|
|
136
147
|
|
|
@@ -152,7 +163,7 @@ const IBLSheenBRDF = ( normal, viewDir, roughness ) => {
|
|
|
152
163
|
|
|
153
164
|
return DG.mul( 1.0 / Math.PI ).saturate();
|
|
154
165
|
|
|
155
|
-
};
|
|
166
|
+
} );
|
|
156
167
|
|
|
157
168
|
const clearcoatF0 = vec3( 0.04 );
|
|
158
169
|
const clearcoatF90 = vec3( 1 );
|
|
@@ -161,7 +172,7 @@ const clearcoatF90 = vec3( 1 );
|
|
|
161
172
|
|
|
162
173
|
class PhysicalLightingModel extends LightingModel {
|
|
163
174
|
|
|
164
|
-
constructor( clearcoat =
|
|
175
|
+
constructor( clearcoat = false, sheen = false, iridescence = false ) {
|
|
165
176
|
|
|
166
177
|
super();
|
|
167
178
|
|
|
@@ -170,45 +181,29 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
170
181
|
this.iridescence = iridescence;
|
|
171
182
|
|
|
172
183
|
this.clearcoatRadiance = null;
|
|
173
|
-
this.
|
|
174
|
-
this.
|
|
184
|
+
this.clearcoatSpecularDirect = null;
|
|
185
|
+
this.clearcoatSpecularIndirect = null;
|
|
186
|
+
this.sheenSpecularDirect = null;
|
|
187
|
+
this.sheenSpecularIndirect = null;
|
|
175
188
|
this.iridescenceFresnel = null;
|
|
176
189
|
this.iridescenceF0 = null;
|
|
177
190
|
|
|
178
191
|
}
|
|
179
192
|
|
|
180
|
-
|
|
193
|
+
start( /*context*/ ) {
|
|
181
194
|
|
|
182
195
|
if ( this.clearcoat === true ) {
|
|
183
196
|
|
|
184
|
-
this.clearcoatRadiance = vec3().temp();
|
|
185
|
-
this.
|
|
186
|
-
|
|
187
|
-
const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
|
|
188
|
-
|
|
189
|
-
const Fcc = F_Schlick( {
|
|
190
|
-
dotVH: dotNVcc,
|
|
191
|
-
f0: clearcoatF0,
|
|
192
|
-
f90: clearcoatF90
|
|
193
|
-
} );
|
|
194
|
-
|
|
195
|
-
const outgoingLight = reflectedLight.total;
|
|
196
|
-
const clearcoatLight = outgoingLight.mul( clearcoat.mul( Fcc ).oneMinus() ).add( this.clearcoatSpecular.mul( clearcoat ) );
|
|
197
|
-
|
|
198
|
-
outgoingLight.assign( clearcoatLight );
|
|
197
|
+
this.clearcoatRadiance = vec3().temp( 'clearcoatRadiance' );
|
|
198
|
+
this.clearcoatSpecularDirect = vec3().temp( 'clearcoatSpecularDirect' );
|
|
199
|
+
this.clearcoatSpecularIndirect = vec3().temp( 'clearcoatSpecularIndirect' );
|
|
199
200
|
|
|
200
201
|
}
|
|
201
202
|
|
|
202
203
|
if ( this.sheen === true ) {
|
|
203
204
|
|
|
204
|
-
this.
|
|
205
|
-
|
|
206
|
-
const outgoingLight = reflectedLight.total;
|
|
207
|
-
|
|
208
|
-
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( 0.157 ).oneMinus();
|
|
209
|
-
const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecular );
|
|
210
|
-
|
|
211
|
-
outgoingLight.assign( sheenLight );
|
|
205
|
+
this.sheenSpecularDirect = vec3().temp( 'sheenSpecularDirect' );
|
|
206
|
+
this.sheenSpecularIndirect = vec3().temp( 'sheenSpecularIndirect' );
|
|
212
207
|
|
|
213
208
|
}
|
|
214
209
|
|
|
@@ -216,7 +211,14 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
216
211
|
|
|
217
212
|
const dotNVi = transformedNormalView.dot( positionViewDirection ).clamp();
|
|
218
213
|
|
|
219
|
-
this.iridescenceFresnel = evalIridescence(
|
|
214
|
+
this.iridescenceFresnel = evalIridescence( {
|
|
215
|
+
outsideIOR: float( 1.0 ),
|
|
216
|
+
eta2: iridescenceIOR,
|
|
217
|
+
cosTheta1: dotNVi,
|
|
218
|
+
thinFilmThickness: iridescenceThickness,
|
|
219
|
+
baseF0: specularColor
|
|
220
|
+
} );
|
|
221
|
+
|
|
220
222
|
this.iridescenceF0 = Schlick_to_F0( { f: this.iridescenceFresnel, f90: 1.0, dotVH: dotNVi } );
|
|
221
223
|
|
|
222
224
|
}
|
|
@@ -229,7 +231,9 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
229
231
|
|
|
230
232
|
computeMultiscattering( singleScatter, multiScatter, specularF90 = float( 1 ) ) {
|
|
231
233
|
|
|
232
|
-
const
|
|
234
|
+
const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
|
|
235
|
+
|
|
236
|
+
const fab = DFGApprox( { roughness, dotNV } );
|
|
233
237
|
|
|
234
238
|
const Fr = this.iridescenceF0 ? iridescence.mix( specularColor, this.iridescenceF0 ) : specularColor;
|
|
235
239
|
|
|
@@ -253,7 +257,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
253
257
|
|
|
254
258
|
if ( this.sheen === true ) {
|
|
255
259
|
|
|
256
|
-
this.
|
|
260
|
+
this.sheenSpecularDirect.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );
|
|
257
261
|
|
|
258
262
|
}
|
|
259
263
|
|
|
@@ -262,7 +266,7 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
262
266
|
const dotNLcc = transformedClearcoatNormalView.dot( lightDirection ).clamp();
|
|
263
267
|
const ccIrradiance = dotNLcc.mul( lightColor );
|
|
264
268
|
|
|
265
|
-
this.
|
|
269
|
+
this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: transformedClearcoatNormalView } ) ) );
|
|
266
270
|
|
|
267
271
|
}
|
|
268
272
|
|
|
@@ -278,13 +282,17 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
278
282
|
|
|
279
283
|
}
|
|
280
284
|
|
|
281
|
-
indirectSpecular( { radiance, iblIrradiance, reflectedLight
|
|
285
|
+
indirectSpecular( { radiance, iblIrradiance, reflectedLight } ) {
|
|
282
286
|
|
|
283
287
|
if ( this.sheen === true ) {
|
|
284
288
|
|
|
285
|
-
this.
|
|
289
|
+
this.sheenSpecularIndirect.addAssign( iblIrradiance.mul(
|
|
286
290
|
sheen,
|
|
287
|
-
IBLSheenBRDF(
|
|
291
|
+
IBLSheenBRDF( {
|
|
292
|
+
normal: transformedNormalView,
|
|
293
|
+
viewDir: positionViewDirection,
|
|
294
|
+
roughness: sheenRoughness
|
|
295
|
+
} )
|
|
288
296
|
) );
|
|
289
297
|
|
|
290
298
|
}
|
|
@@ -300,14 +308,14 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
300
308
|
roughness: clearcoatRoughness
|
|
301
309
|
} );
|
|
302
310
|
|
|
303
|
-
this.
|
|
311
|
+
this.clearcoatSpecularIndirect.addAssign( this.clearcoatRadiance.mul( clearcoatEnv ) );
|
|
304
312
|
|
|
305
313
|
}
|
|
306
314
|
|
|
307
315
|
// Both indirect specular and indirect diffuse light accumulate here
|
|
308
316
|
|
|
309
|
-
const singleScattering = vec3().temp();
|
|
310
|
-
const multiScattering = vec3().temp();
|
|
317
|
+
const singleScattering = vec3().temp( 'singleScattering' );
|
|
318
|
+
const multiScattering = vec3().temp( 'multiScattering' );
|
|
311
319
|
const cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );
|
|
312
320
|
|
|
313
321
|
this.computeMultiscattering( singleScattering, multiScattering );
|
|
@@ -332,12 +340,54 @@ class PhysicalLightingModel extends LightingModel {
|
|
|
332
340
|
|
|
333
341
|
const aoNode = ambientOcclusion.sub( aoNV.pow( aoExp ).oneMinus() ).clamp();
|
|
334
342
|
|
|
335
|
-
|
|
343
|
+
if ( this.clearcoat === true ) {
|
|
344
|
+
|
|
345
|
+
this.clearcoatSpecularIndirect.mulAssign( ambientOcclusion );
|
|
346
|
+
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
if ( this.sheen === true ) {
|
|
350
|
+
|
|
351
|
+
this.sheenSpecularIndirect.mulAssign( ambientOcclusion );
|
|
336
352
|
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
reflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );
|
|
337
356
|
reflectedLight.indirectSpecular.mulAssign( aoNode );
|
|
338
357
|
|
|
339
358
|
}
|
|
340
359
|
|
|
360
|
+
finish( context ) {
|
|
361
|
+
|
|
362
|
+
const { outgoingLight } = context;
|
|
363
|
+
|
|
364
|
+
if ( this.clearcoat === true ) {
|
|
365
|
+
|
|
366
|
+
const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
|
|
367
|
+
|
|
368
|
+
const Fcc = F_Schlick( {
|
|
369
|
+
dotVH: dotNVcc,
|
|
370
|
+
f0: clearcoatF0,
|
|
371
|
+
f90: clearcoatF90
|
|
372
|
+
} );
|
|
373
|
+
|
|
374
|
+
const clearcoatLight = outgoingLight.mul( clearcoat.mul( Fcc ).oneMinus() ).add( this.clearcoatSpecularDirect.add( this.clearcoatSpecularIndirect ).mul( clearcoat ) );
|
|
375
|
+
|
|
376
|
+
outgoingLight.assign( clearcoatLight );
|
|
377
|
+
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
if ( this.sheen === true ) {
|
|
381
|
+
|
|
382
|
+
const sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( 0.157 ).oneMinus();
|
|
383
|
+
const sheenLight = outgoingLight.mul( sheenEnergyComp ).add( this.sheenSpecularDirect, this.sheenSpecularIndirect );
|
|
384
|
+
|
|
385
|
+
outgoingLight.assign( sheenLight );
|
|
386
|
+
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
}
|
|
390
|
+
|
|
341
391
|
}
|
|
342
392
|
|
|
343
393
|
export default PhysicalLightingModel;
|
|
@@ -17,7 +17,7 @@ class ComputeNode extends Node {
|
|
|
17
17
|
this.dispatchCount = 0;
|
|
18
18
|
|
|
19
19
|
this.version = 1;
|
|
20
|
-
this.
|
|
20
|
+
this.updateBeforeType = NodeUpdateType.OBJECT;
|
|
21
21
|
|
|
22
22
|
this.updateDispatchCount();
|
|
23
23
|
|
|
@@ -50,7 +50,7 @@ class ComputeNode extends Node {
|
|
|
50
50
|
|
|
51
51
|
onInit() { }
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
updateBefore( { renderer } ) {
|
|
54
54
|
|
|
55
55
|
renderer.compute( this );
|
|
56
56
|
|
|
@@ -7,6 +7,7 @@ import { reference } from '../accessors/ReferenceNode.js';
|
|
|
7
7
|
import { texture } from '../accessors/TextureNode.js';
|
|
8
8
|
import { positionWorld } from '../accessors/PositionNode.js';
|
|
9
9
|
import { normalWorld } from '../accessors/NormalNode.js';
|
|
10
|
+
import { WebGPUCoordinateSystem } from 'three';
|
|
10
11
|
//import { add } from '../math/OperatorNode.js';
|
|
11
12
|
|
|
12
13
|
import { Color, DepthTexture, NearestFilter, LessCompare } from 'three';
|
|
@@ -27,11 +28,21 @@ class AnalyticLightNode extends LightingNode {
|
|
|
27
28
|
this.shadowNode = null;
|
|
28
29
|
|
|
29
30
|
this.color = new Color();
|
|
30
|
-
this.
|
|
31
|
+
this._defaultColorNode = uniform( this.color );
|
|
32
|
+
|
|
33
|
+
this.colorNode = this._defaultColorNode;
|
|
34
|
+
|
|
35
|
+
this.isAnalyticLightNode = true;
|
|
31
36
|
|
|
32
37
|
}
|
|
33
38
|
|
|
34
|
-
|
|
39
|
+
getCacheKey() {
|
|
40
|
+
|
|
41
|
+
return super.getCacheKey() + '-' + ( this.light.id + '-' + ( this.light.castShadow ? '1' : '0' ) );
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getHash() {
|
|
35
46
|
|
|
36
47
|
return this.light.uuid;
|
|
37
48
|
|
|
@@ -73,10 +84,18 @@ class AnalyticLightNode extends LightingNode {
|
|
|
73
84
|
.and( shadowCoord.y.lessThanEqual( 1 ) )
|
|
74
85
|
.and( shadowCoord.z.lessThanEqual( 1 ) );
|
|
75
86
|
|
|
87
|
+
let coordZ = shadowCoord.z.add( bias );
|
|
88
|
+
|
|
89
|
+
if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
|
|
90
|
+
|
|
91
|
+
coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Convertion [ 0, 1 ] to [ - 1, 1 ]
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
76
95
|
shadowCoord = vec3(
|
|
77
96
|
shadowCoord.x,
|
|
78
|
-
shadowCoord.y.oneMinus(), //
|
|
79
|
-
|
|
97
|
+
shadowCoord.y.oneMinus(), // follow webgpu standards
|
|
98
|
+
coordZ
|
|
80
99
|
);
|
|
81
100
|
|
|
82
101
|
const textureCompare = ( depthTexture, shadowCoord, compare ) => texture( depthTexture, shadowCoord ).compare( compare );
|
|
@@ -139,6 +158,7 @@ class AnalyticLightNode extends LightingNode {
|
|
|
139
158
|
setup( builder ) {
|
|
140
159
|
|
|
141
160
|
if ( this.light.castShadow ) this.setupShadow( builder );
|
|
161
|
+
else if ( this.shadowNode !== null ) this.disposeShadow();
|
|
142
162
|
|
|
143
163
|
}
|
|
144
164
|
|
|
@@ -147,17 +167,46 @@ class AnalyticLightNode extends LightingNode {
|
|
|
147
167
|
const { rtt, light } = this;
|
|
148
168
|
const { renderer, scene } = frame;
|
|
149
169
|
|
|
170
|
+
const currentOverrideMaterial = scene.overrideMaterial;
|
|
171
|
+
|
|
150
172
|
scene.overrideMaterial = depthMaterial;
|
|
151
173
|
|
|
152
174
|
rtt.setSize( light.shadow.mapSize.width, light.shadow.mapSize.height );
|
|
153
175
|
|
|
154
176
|
light.shadow.updateMatrices( light );
|
|
155
177
|
|
|
178
|
+
const currentRenderTarget = renderer.getRenderTarget();
|
|
179
|
+
const currentRenderObjectFunction = renderer.getRenderObjectFunction();
|
|
180
|
+
|
|
181
|
+
renderer.setRenderObjectFunction( ( object, ...params ) => {
|
|
182
|
+
|
|
183
|
+
if ( object.castShadow === true ) {
|
|
184
|
+
|
|
185
|
+
renderer.renderObject( object, ...params );
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
} );
|
|
190
|
+
|
|
156
191
|
renderer.setRenderTarget( rtt );
|
|
192
|
+
|
|
157
193
|
renderer.render( scene, light.shadow.camera );
|
|
158
|
-
renderer.setRenderTarget( null );
|
|
159
194
|
|
|
160
|
-
|
|
195
|
+
renderer.setRenderTarget( currentRenderTarget );
|
|
196
|
+
renderer.setRenderObjectFunction( currentRenderObjectFunction );
|
|
197
|
+
|
|
198
|
+
scene.overrideMaterial = currentOverrideMaterial;
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
disposeShadow() {
|
|
203
|
+
|
|
204
|
+
this.rtt.dispose();
|
|
205
|
+
|
|
206
|
+
this.shadowNode = null;
|
|
207
|
+
this.rtt = null;
|
|
208
|
+
|
|
209
|
+
this.colorNode = this._defaultColorNode;
|
|
161
210
|
|
|
162
211
|
}
|
|
163
212
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import LightingNode from './LightingNode.js';
|
|
2
2
|
import { cache } from '../core/CacheNode.js';
|
|
3
3
|
import { context } from '../core/ContextNode.js';
|
|
4
|
+
import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
|
|
4
5
|
import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
|
|
5
6
|
import { equirectUV } from '../utils/EquirectUVNode.js';
|
|
6
7
|
import { specularMIPLevel } from '../utils/SpecularMIPLevelNode.js';
|
|
@@ -8,7 +9,7 @@ import { cameraViewMatrix } from '../accessors/CameraNode.js';
|
|
|
8
9
|
import { transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld } from '../accessors/NormalNode.js';
|
|
9
10
|
import { positionViewDirection } from '../accessors/PositionNode.js';
|
|
10
11
|
import { addNodeClass } from '../core/Node.js';
|
|
11
|
-
import {
|
|
12
|
+
import { vec2 } from '../shadernode/ShaderNode.js';
|
|
12
13
|
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
13
14
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
14
15
|
|
|
@@ -27,7 +28,6 @@ class EnvironmentNode extends LightingNode {
|
|
|
27
28
|
setup( builder ) {
|
|
28
29
|
|
|
29
30
|
let envNode = this.envNode;
|
|
30
|
-
const properties = builder.getNodeProperties( this );
|
|
31
31
|
|
|
32
32
|
if ( envNode.isTextureNode && envNode.value.isCubeTexture !== true ) {
|
|
33
33
|
|
|
@@ -79,11 +79,6 @@ class EnvironmentNode extends LightingNode {
|
|
|
79
79
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
properties.radiance = isolateRadiance;
|
|
85
|
-
properties.irradiance = irradiance;
|
|
86
|
-
|
|
87
82
|
}
|
|
88
83
|
|
|
89
84
|
}
|
|
@@ -94,7 +89,7 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
|
|
|
94
89
|
let textureUVNode = null;
|
|
95
90
|
|
|
96
91
|
return {
|
|
97
|
-
|
|
92
|
+
getUV: ( textureNode ) => {
|
|
98
93
|
|
|
99
94
|
let node = null;
|
|
100
95
|
|
|
@@ -127,12 +122,12 @@ const createRadianceContext = ( roughnessNode, normalViewNode ) => {
|
|
|
127
122
|
return node;
|
|
128
123
|
|
|
129
124
|
},
|
|
130
|
-
|
|
125
|
+
getTextureLevel: () => {
|
|
131
126
|
|
|
132
127
|
return roughnessNode;
|
|
133
128
|
|
|
134
129
|
},
|
|
135
|
-
|
|
130
|
+
getTextureLevelAlgorithm: ( textureNode, levelNode ) => {
|
|
136
131
|
|
|
137
132
|
return specularMIPLevel( textureNode, levelNode );
|
|
138
133
|
|
|
@@ -146,7 +141,7 @@ const createIrradianceContext = ( normalWorldNode ) => {
|
|
|
146
141
|
let textureUVNode = null;
|
|
147
142
|
|
|
148
143
|
return {
|
|
149
|
-
|
|
144
|
+
getUV: ( textureNode ) => {
|
|
150
145
|
|
|
151
146
|
let node = null;
|
|
152
147
|
|
|
@@ -172,14 +167,9 @@ const createIrradianceContext = ( normalWorldNode ) => {
|
|
|
172
167
|
return node;
|
|
173
168
|
|
|
174
169
|
},
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return float( 1 );
|
|
170
|
+
getTextureLevel: ( textureNode ) => {
|
|
178
171
|
|
|
179
|
-
|
|
180
|
-
getMIPLevelAlgorithmNode: ( textureNode, levelNode ) => {
|
|
181
|
-
|
|
182
|
-
return specularMIPLevel( textureNode, levelNode );
|
|
172
|
+
return maxMipLevel( textureNode );
|
|
183
173
|
|
|
184
174
|
}
|
|
185
175
|
};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import ContextNode from '../core/ContextNode.js';
|
|
2
|
-
import { add } from '../math/OperatorNode.js';
|
|
3
|
-
import { mix } from '../math/MathNode.js';
|
|
4
2
|
import { addNodeClass } from '../core/Node.js';
|
|
5
3
|
import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode.js';
|
|
6
4
|
|
|
@@ -14,80 +12,46 @@ class LightingContextNode extends ContextNode {
|
|
|
14
12
|
this.backdropNode = backdropNode;
|
|
15
13
|
this.backdropAlphaNode = backdropAlphaNode;
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
getNodeType( /*builder*/ ) {
|
|
20
|
-
|
|
21
|
-
return 'vec3';
|
|
15
|
+
this._context = null;
|
|
22
16
|
|
|
23
17
|
}
|
|
24
18
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const { lightingModel, backdropNode, backdropAlphaNode } = this;
|
|
28
|
-
|
|
29
|
-
const context = this.context = {}; // reset context
|
|
30
|
-
const properties = builder.getNodeProperties( this );
|
|
31
|
-
|
|
32
|
-
const directDiffuse = vec3().temp(),
|
|
33
|
-
directSpecular = vec3().temp(),
|
|
34
|
-
indirectDiffuse = vec3().temp(),
|
|
35
|
-
indirectSpecular = vec3().temp();
|
|
36
|
-
|
|
37
|
-
let totalDiffuse = add( directDiffuse, indirectDiffuse );
|
|
38
|
-
|
|
39
|
-
if ( backdropNode !== null ) {
|
|
40
|
-
|
|
41
|
-
totalDiffuse = vec3( backdropAlphaNode !== null ? mix( totalDiffuse, backdropNode, backdropAlphaNode ) : backdropNode );
|
|
19
|
+
getContext() {
|
|
42
20
|
|
|
43
|
-
}
|
|
21
|
+
const { backdropNode, backdropAlphaNode } = this;
|
|
44
22
|
|
|
45
|
-
const
|
|
46
|
-
|
|
23
|
+
const directDiffuse = vec3().temp( 'directDiffuse' ),
|
|
24
|
+
directSpecular = vec3().temp( 'directSpecular' ),
|
|
25
|
+
indirectDiffuse = vec3().temp( 'indirectDiffuse' ),
|
|
26
|
+
indirectSpecular = vec3().temp( 'indirectSpecular' );
|
|
47
27
|
|
|
48
28
|
const reflectedLight = {
|
|
49
29
|
directDiffuse,
|
|
50
30
|
directSpecular,
|
|
51
31
|
indirectDiffuse,
|
|
52
|
-
indirectSpecular
|
|
53
|
-
total
|
|
32
|
+
indirectSpecular
|
|
54
33
|
};
|
|
55
34
|
|
|
56
|
-
const
|
|
57
|
-
radiance: vec3().temp(),
|
|
58
|
-
irradiance: vec3().temp(),
|
|
59
|
-
iblIrradiance: vec3().temp(),
|
|
60
|
-
ambientOcclusion: float( 1 ).temp()
|
|
35
|
+
const context = {
|
|
36
|
+
radiance: vec3().temp( 'radiance' ),
|
|
37
|
+
irradiance: vec3().temp( 'irradiance' ),
|
|
38
|
+
iblIrradiance: vec3().temp( 'iblIrradiance' ),
|
|
39
|
+
ambientOcclusion: float( 1 ).temp( 'ambientOcclusion' ),
|
|
40
|
+
reflectedLight,
|
|
41
|
+
backdrop: backdropNode,
|
|
42
|
+
backdropAlpha : backdropAlphaNode
|
|
61
43
|
};
|
|
62
44
|
|
|
63
|
-
context
|
|
64
|
-
context.lightingModel = lightingModel || context.lightingModel;
|
|
65
|
-
|
|
66
|
-
Object.assign( properties, reflectedLight, lighting );
|
|
67
|
-
Object.assign( context, lighting );
|
|
68
|
-
|
|
69
|
-
if ( lightingModel ) {
|
|
70
|
-
|
|
71
|
-
lightingModel.init( context, builder.stack, builder );
|
|
72
|
-
|
|
73
|
-
lightingModel.indirectDiffuse( context, builder.stack, builder );
|
|
74
|
-
lightingModel.indirectSpecular( context, builder.stack, builder );
|
|
75
|
-
lightingModel.ambientOcclusion( context, builder.stack, builder );
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return super.setup( builder );
|
|
45
|
+
return context;
|
|
80
46
|
|
|
81
47
|
}
|
|
82
48
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const { context } = this;
|
|
86
|
-
const type = this.getNodeType( builder );
|
|
49
|
+
setup( builder ) {
|
|
87
50
|
|
|
88
|
-
|
|
51
|
+
this.context = this._context || ( this._context = this.getContext() );
|
|
52
|
+
this.context.lightingModel = this.lightingModel || builder.context.lightingModel;
|
|
89
53
|
|
|
90
|
-
return
|
|
54
|
+
return super.setup( builder );
|
|
91
55
|
|
|
92
56
|
}
|
|
93
57
|
|