super-three 0.162.0 → 0.164.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +847 -1226
- package/build/three.module.js +846 -1225
- package/build/three.module.min.js +2 -2
- package/examples/jsm/animation/CCDIKSolver.js +4 -2
- package/examples/jsm/controls/TransformControls.js +3 -3
- package/examples/jsm/exporters/GLTFExporter.js +66 -5
- package/examples/jsm/exporters/USDZExporter.js +22 -1
- package/examples/jsm/geometries/TextGeometry.js +10 -2
- package/examples/jsm/interactive/HTMLMesh.js +7 -9
- package/examples/jsm/libs/draco/README.md +2 -2
- package/examples/jsm/libs/fflate.module.js +694 -496
- package/examples/jsm/lines/LineMaterial.js +0 -2
- package/examples/jsm/loaders/3MFLoader.js +2 -0
- package/examples/jsm/loaders/EXRLoader.js +351 -97
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +59 -0
- package/examples/jsm/loaders/KTX2Loader.js +3 -10
- package/examples/jsm/loaders/LUT3dlLoader.js +0 -15
- package/examples/jsm/loaders/LUTCubeLoader.js +0 -14
- package/examples/jsm/loaders/LUTImageLoader.js +0 -14
- package/examples/jsm/loaders/RGBMLoader.js +16 -0
- package/examples/jsm/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/misc/GPUComputationRenderer.js +0 -6
- package/examples/jsm/nodes/Nodes.js +10 -4
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +16 -1
- package/examples/jsm/nodes/accessors/BatchNode.js +78 -0
- package/examples/jsm/nodes/accessors/ClippingNode.js +3 -2
- package/examples/jsm/nodes/accessors/InstanceNode.js +25 -2
- package/examples/jsm/nodes/accessors/MaterialNode.js +107 -3
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/MorphNode.js +13 -3
- package/examples/jsm/nodes/accessors/NormalNode.js +12 -2
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/RendererReferenceNode.js +29 -0
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +9 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +51 -10
- package/examples/jsm/nodes/accessors/TextureSizeNode.js +1 -1
- package/examples/jsm/nodes/code/FunctionNode.js +0 -8
- package/examples/jsm/nodes/core/Node.js +63 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +26 -25
- package/examples/jsm/nodes/core/NodeFrame.js +10 -10
- package/examples/jsm/nodes/core/NodeUtils.js +2 -2
- package/examples/jsm/nodes/core/OutputStructNode.js +2 -1
- package/examples/jsm/nodes/core/PropertyNode.js +10 -0
- package/examples/jsm/nodes/core/UniformNode.js +20 -0
- 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 +17 -1
- package/examples/jsm/nodes/display/ToneMappingNode.js +8 -4
- package/examples/jsm/nodes/display/ViewportDepthNode.js +1 -1
- package/examples/jsm/nodes/display/ViewportNode.js +4 -2
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +6 -0
- package/examples/jsm/nodes/display/ViewportTextureNode.js +4 -1
- package/examples/jsm/nodes/fog/FogExp2Node.js +4 -5
- package/examples/jsm/nodes/fog/FogNode.js +13 -3
- package/examples/jsm/nodes/fog/FogRangeNode.js +4 -3
- package/examples/jsm/nodes/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 +164 -10
- package/examples/jsm/nodes/functions/ShadowMaskModel.js +31 -0
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -70
- package/examples/jsm/nodes/lighting/IrradianceNode.js +24 -0
- package/examples/jsm/nodes/lighting/LightsNode.js +11 -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 +10 -6
- package/examples/jsm/nodes/materials/Materials.js +1 -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 +76 -5
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +11 -4
- package/examples/jsm/nodes/materials/NodeMaterial.js +55 -43
- package/examples/jsm/nodes/materials/ShadowNodeMaterial.js +34 -0
- package/examples/jsm/nodes/pmrem/PMREMNode.js +193 -0
- package/examples/jsm/nodes/pmrem/PMREMUtils.js +288 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +3 -9
- package/examples/jsm/nodes/utils/EquirectUVNode.js +1 -1
- package/examples/jsm/objects/QuadMesh.js +7 -23
- package/examples/jsm/physics/JoltPhysics.js +281 -0
- package/examples/jsm/physics/RapierPhysics.js +4 -4
- package/examples/jsm/postprocessing/GlitchPass.js +0 -3
- package/examples/jsm/postprocessing/LUTPass.js +5 -71
- package/examples/jsm/postprocessing/RenderTransitionPass.js +193 -0
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SSAOPass.js +0 -3
- package/examples/jsm/renderers/common/Animation.js +3 -0
- package/examples/jsm/renderers/common/Background.js +8 -8
- package/examples/jsm/renderers/common/ClippingContext.js +1 -1
- package/examples/jsm/renderers/common/Info.js +11 -19
- package/examples/jsm/renderers/common/PostProcessing.js +12 -4
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderList.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +47 -5
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Renderer.js +153 -21
- package/examples/jsm/renderers/common/Textures.js +1 -1
- package/examples/jsm/renderers/common/extras/PMREMGenerator.js +773 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +34 -63
- package/examples/jsm/renderers/webgl/WebGLBackend.js +146 -36
- package/examples/jsm/renderers/webgl/WebGLBufferRenderer.js +145 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +9 -3
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +1 -1
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +1 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +64 -7
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +6 -23
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +77 -60
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +29 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +92 -18
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/utils/GPUStatsPanel.js +10 -45
- package/examples/jsm/utils/SceneUtils.js +60 -1
- package/examples/jsm/utils/TextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -2
- package/package.json +1 -1
- package/src/Three.js +0 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/constants.js +3 -3
- package/src/core/Object3D.js +10 -7
- package/src/core/RenderTarget.js +8 -0
- package/src/extras/PMREMGenerator.js +21 -11
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +2 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshPhysicalMaterial.js +20 -0
- package/src/materials/ShaderMaterial.js +0 -4
- package/src/math/Spherical.js +4 -5
- package/src/objects/BatchedMesh.js +27 -3
- package/src/objects/InstancedMesh.js +10 -0
- package/src/objects/Line.js +66 -43
- package/src/renderers/WebGLRenderer.js +130 -158
- 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/logdepthbuf_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +2 -10
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +2 -16
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +32 -22
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +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 +2 -1
- package/src/renderers/shaders/UniformsUtils.js +10 -1
- package/src/renderers/webgl/WebGLAttributes.js +6 -33
- package/src/renderers/webgl/WebGLBackground.js +18 -3
- package/src/renderers/webgl/WebGLBindingStates.js +14 -51
- package/src/renderers/webgl/WebGLBufferRenderer.js +35 -21
- package/src/renderers/webgl/WebGLCapabilities.js +35 -13
- package/src/renderers/webgl/WebGLCubeUVMaps.js +10 -6
- package/src/renderers/webgl/WebGLExtensions.js +4 -19
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +35 -21
- package/src/renderers/webgl/WebGLLights.js +6 -32
- package/src/renderers/webgl/WebGLMaterials.js +8 -3
- package/src/renderers/webgl/WebGLMorphtargets.js +79 -217
- package/src/renderers/webgl/WebGLProgram.js +21 -52
- package/src/renderers/webgl/WebGLPrograms.js +24 -31
- package/src/renderers/webgl/WebGLRenderStates.js +13 -7
- package/src/renderers/webgl/WebGLShadowMap.js +25 -25
- package/src/renderers/webgl/WebGLState.js +15 -59
- package/src/renderers/webgl/WebGLTextures.js +138 -292
- package/src/renderers/webgl/WebGLUniformsGroups.js +1 -1
- package/src/renderers/webgl/WebGLUtils.js +9 -78
- package/src/renderers/webxr/WebXRDepthSensing.js +2 -3
- package/src/renderers/webxr/WebXRManager.js +4 -6
- package/src/scenes/Scene.js +7 -1
- package/src/textures/Texture.js +11 -1
- package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -37
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +0 -320
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +0 -26
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +0 -794
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +0 -51
- package/src/renderers/WebGL1Renderer.js +0 -7
- package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -10
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
|
|
16
16
|
} from '../../renderers/common/nodes/NodeUniform.js';
|
|
17
17
|
|
|
18
|
-
import { REVISION, RenderTarget,
|
|
18
|
+
import { REVISION, RenderTarget, Color, Vector2, Vector3, Vector4, IntType, UnsignedIntType, Float16BufferAttribute } from 'three';
|
|
19
19
|
|
|
20
20
|
import { stack } from './StackNode.js';
|
|
21
21
|
import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
|
|
@@ -23,6 +23,8 @@ import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
|
|
|
23
23
|
import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
|
|
24
24
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
25
25
|
|
|
26
|
+
import PMREMGenerator from '../../renderers/common/extras/PMREMGenerator.js';
|
|
27
|
+
|
|
26
28
|
const uniformsGroupCache = new ChainMap();
|
|
27
29
|
|
|
28
30
|
const typeFromLength = new Map( [
|
|
@@ -70,7 +72,6 @@ class NodeBuilder {
|
|
|
70
72
|
this.lightsNode = null;
|
|
71
73
|
this.environmentNode = null;
|
|
72
74
|
this.fogNode = null;
|
|
73
|
-
this.toneMappingNode = null;
|
|
74
75
|
|
|
75
76
|
this.clippingContext = null;
|
|
76
77
|
|
|
@@ -113,18 +114,26 @@ class NodeBuilder {
|
|
|
113
114
|
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
|
|
117
|
+
createRenderTarget( width, height, options ) {
|
|
117
118
|
|
|
118
119
|
return new RenderTarget( width, height, options );
|
|
119
120
|
|
|
120
121
|
}
|
|
121
122
|
|
|
122
|
-
|
|
123
|
+
createCubeRenderTarget( size, options ) {
|
|
123
124
|
|
|
124
125
|
return new CubeRenderTarget( size, options );
|
|
125
126
|
|
|
126
127
|
}
|
|
127
128
|
|
|
129
|
+
createPMREMGenerator() {
|
|
130
|
+
|
|
131
|
+
// TODO: Move Materials.js to outside of the Nodes.js in order to remove this function and improve tree-shaking support
|
|
132
|
+
|
|
133
|
+
return new PMREMGenerator( this.renderer );
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
128
137
|
includes( node ) {
|
|
129
138
|
|
|
130
139
|
return this.nodes.includes( node );
|
|
@@ -474,25 +483,18 @@ class NodeBuilder {
|
|
|
474
483
|
|
|
475
484
|
}
|
|
476
485
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
let colorSpace;
|
|
486
|
+
getComponentTypeFromTexture( texture ) {
|
|
480
487
|
|
|
481
|
-
|
|
488
|
+
const type = texture.type;
|
|
482
489
|
|
|
483
|
-
|
|
490
|
+
if ( texture.isDataTexture ) {
|
|
484
491
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
colorSpace = map.texture.colorSpace;
|
|
488
|
-
|
|
489
|
-
} else {
|
|
490
|
-
|
|
491
|
-
colorSpace = NoColorSpace;
|
|
492
|
+
if ( type === IntType ) return 'int';
|
|
493
|
+
if ( type === UnsignedIntType ) return 'uint';
|
|
492
494
|
|
|
493
495
|
}
|
|
494
496
|
|
|
495
|
-
return
|
|
497
|
+
return 'float';
|
|
496
498
|
|
|
497
499
|
}
|
|
498
500
|
|
|
@@ -1084,21 +1086,18 @@ class NodeBuilder {
|
|
|
1084
1086
|
|
|
1085
1087
|
}
|
|
1086
1088
|
|
|
1087
|
-
build(
|
|
1089
|
+
build() {
|
|
1088
1090
|
|
|
1089
1091
|
const { object, material } = this;
|
|
1090
1092
|
|
|
1091
|
-
if ( convertMaterial ) {
|
|
1092
|
-
|
|
1093
|
-
if ( material !== null ) {
|
|
1094
1093
|
|
|
1095
|
-
|
|
1094
|
+
if ( material !== null ) {
|
|
1096
1095
|
|
|
1097
|
-
|
|
1096
|
+
NodeMaterial.fromMaterial( material ).build( this );
|
|
1098
1097
|
|
|
1099
|
-
|
|
1098
|
+
} else {
|
|
1100
1099
|
|
|
1101
|
-
|
|
1100
|
+
this.addFlow( 'compute', object );
|
|
1102
1101
|
|
|
1103
1102
|
}
|
|
1104
1103
|
|
|
@@ -1168,6 +1167,8 @@ class NodeBuilder {
|
|
|
1168
1167
|
|
|
1169
1168
|
createNodeMaterial( type = 'NodeMaterial' ) {
|
|
1170
1169
|
|
|
1170
|
+
// TODO: Move Materials.js to outside of the Nodes.js in order to remove this function and improve tree-shaking support
|
|
1171
|
+
|
|
1171
1172
|
return createNodeMaterialFromType( type );
|
|
1172
1173
|
|
|
1173
1174
|
}
|
|
@@ -45,17 +45,17 @@ class NodeFrame {
|
|
|
45
45
|
updateBeforeNode( node ) {
|
|
46
46
|
|
|
47
47
|
const updateType = node.getUpdateBeforeType();
|
|
48
|
-
const reference = node.
|
|
48
|
+
const reference = node.updateReference( this );
|
|
49
49
|
|
|
50
50
|
if ( updateType === NodeUpdateType.FRAME ) {
|
|
51
51
|
|
|
52
52
|
const { frameMap } = this._getMaps( this.updateBeforeMap, reference );
|
|
53
53
|
|
|
54
|
-
if ( frameMap.get(
|
|
54
|
+
if ( frameMap.get( reference ) !== this.frameId ) {
|
|
55
55
|
|
|
56
56
|
if ( node.updateBefore( this ) !== false ) {
|
|
57
57
|
|
|
58
|
-
frameMap.set(
|
|
58
|
+
frameMap.set( reference, this.frameId );
|
|
59
59
|
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -65,11 +65,11 @@ class NodeFrame {
|
|
|
65
65
|
|
|
66
66
|
const { renderMap } = this._getMaps( this.updateBeforeMap, reference );
|
|
67
67
|
|
|
68
|
-
if ( renderMap.get(
|
|
68
|
+
if ( renderMap.get( reference ) !== this.renderId ) {
|
|
69
69
|
|
|
70
70
|
if ( node.updateBefore( this ) !== false ) {
|
|
71
71
|
|
|
72
|
-
renderMap.set(
|
|
72
|
+
renderMap.set( reference, this.renderId );
|
|
73
73
|
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -86,17 +86,17 @@ class NodeFrame {
|
|
|
86
86
|
updateNode( node ) {
|
|
87
87
|
|
|
88
88
|
const updateType = node.getUpdateType();
|
|
89
|
-
const reference = node.
|
|
89
|
+
const reference = node.updateReference( this );
|
|
90
90
|
|
|
91
91
|
if ( updateType === NodeUpdateType.FRAME ) {
|
|
92
92
|
|
|
93
93
|
const { frameMap } = this._getMaps( this.updateMap, reference );
|
|
94
94
|
|
|
95
|
-
if ( frameMap.get(
|
|
95
|
+
if ( frameMap.get( reference ) !== this.frameId ) {
|
|
96
96
|
|
|
97
97
|
if ( node.update( this ) !== false ) {
|
|
98
98
|
|
|
99
|
-
frameMap.set(
|
|
99
|
+
frameMap.set( reference, this.frameId );
|
|
100
100
|
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -106,11 +106,11 @@ class NodeFrame {
|
|
|
106
106
|
|
|
107
107
|
const { renderMap } = this._getMaps( this.updateMap, reference );
|
|
108
108
|
|
|
109
|
-
if ( renderMap.get(
|
|
109
|
+
if ( renderMap.get( reference ) !== this.renderId ) {
|
|
110
110
|
|
|
111
111
|
if ( node.update( this ) !== false ) {
|
|
112
112
|
|
|
113
|
-
renderMap.set(
|
|
113
|
+
renderMap.set( reference, this.renderId );
|
|
114
114
|
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Color, Matrix3, Matrix4, Vector2, Vector3, Vector4 } from 'three';
|
|
2
2
|
|
|
3
|
-
export function getCacheKey( object ) {
|
|
3
|
+
export function getCacheKey( object, force = false ) {
|
|
4
4
|
|
|
5
5
|
let cacheKey = '{';
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ export function getCacheKey( object ) {
|
|
|
12
12
|
|
|
13
13
|
for ( const { property, childNode } of getNodeChildren( object ) ) {
|
|
14
14
|
|
|
15
|
-
cacheKey += ',' + property.slice( 0, - 4 ) + ':' + childNode.getCacheKey();
|
|
15
|
+
cacheKey += ',' + property.slice( 0, - 4 ) + ':' + childNode.getCacheKey( force );
|
|
16
16
|
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -62,11 +62,21 @@ export const sheenRoughness = nodeImmutable( PropertyNode, 'float', 'SheenRoughn
|
|
|
62
62
|
export const iridescence = nodeImmutable( PropertyNode, 'float', 'Iridescence' );
|
|
63
63
|
export const iridescenceIOR = nodeImmutable( PropertyNode, 'float', 'IridescenceIOR' );
|
|
64
64
|
export const iridescenceThickness = nodeImmutable( PropertyNode, 'float', 'IridescenceThickness' );
|
|
65
|
+
export const alphaT = nodeImmutable( PropertyNode, 'float', 'AlphaT' );
|
|
66
|
+
export const anisotropy = nodeImmutable( PropertyNode, 'float', 'Anisotropy' );
|
|
67
|
+
export const anisotropyT = nodeImmutable( PropertyNode, 'vec3', 'AnisotropyT' );
|
|
68
|
+
export const anisotropyB = nodeImmutable( PropertyNode, 'vec3', 'AnisotropyB' );
|
|
65
69
|
export const specularColor = nodeImmutable( PropertyNode, 'color', 'SpecularColor' );
|
|
70
|
+
export const specularF90 = nodeImmutable( PropertyNode, 'float', 'SpecularF90' );
|
|
66
71
|
export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' );
|
|
67
72
|
export const output = nodeImmutable( PropertyNode, 'vec4', 'Output' );
|
|
68
73
|
export const dashSize = nodeImmutable( PropertyNode, 'float', 'dashSize' );
|
|
69
74
|
export const gapSize = nodeImmutable( PropertyNode, 'float', 'gapSize' );
|
|
70
75
|
export const pointWidth = nodeImmutable( PropertyNode, 'float', 'pointWidth' );
|
|
76
|
+
export const ior = nodeImmutable( PropertyNode, 'float', 'IOR' );
|
|
77
|
+
export const transmission = nodeImmutable( PropertyNode, 'float', 'Transmission' );
|
|
78
|
+
export const thickness = nodeImmutable( PropertyNode, 'float', 'Thickness' );
|
|
79
|
+
export const attenuationDistance = nodeImmutable( PropertyNode, 'float', 'AttenuationDistance' );
|
|
80
|
+
export const attenuationColor = nodeImmutable( PropertyNode, 'color', 'AttenuationColor' );
|
|
71
81
|
|
|
72
82
|
addNodeClass( 'PropertyNode', PropertyNode );
|
|
@@ -35,6 +35,26 @@ class UniformNode extends InputNode {
|
|
|
35
35
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
onUpdate( callback, updateType ) {
|
|
39
|
+
|
|
40
|
+
const self = this.getSelf();
|
|
41
|
+
|
|
42
|
+
callback = callback.bind( self );
|
|
43
|
+
|
|
44
|
+
return super.onUpdate( ( frame ) => {
|
|
45
|
+
|
|
46
|
+
const value = callback( frame, self );
|
|
47
|
+
|
|
48
|
+
if ( value !== undefined ) {
|
|
49
|
+
|
|
50
|
+
this.value = value;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
}, updateType );
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
38
58
|
generate( builder, output ) {
|
|
39
59
|
|
|
40
60
|
const type = this.getNodeType( builder );
|
|
@@ -9,41 +9,22 @@ import { addNodeElement, tslFn, nodeProxy, float, vec2 } from '../shadernode/Sha
|
|
|
9
9
|
// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen
|
|
10
10
|
// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf
|
|
11
11
|
|
|
12
|
-
// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
|
|
13
|
-
|
|
14
12
|
const dHdxy_fwd = tslFn( ( { textureNode, bumpScale } ) => {
|
|
15
13
|
|
|
16
|
-
let texNode = textureNode;
|
|
17
|
-
|
|
18
|
-
if ( texNode.isTextureNode !== true ) {
|
|
19
|
-
|
|
20
|
-
texNode.traverse( ( node ) => {
|
|
21
|
-
|
|
22
|
-
if ( node.isTextureNode === true ) texNode = node;
|
|
23
|
-
|
|
24
|
-
} );
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if ( texNode.isTextureNode !== true ) {
|
|
29
|
-
|
|
30
|
-
throw new Error( 'THREE.TSL: dHdxy_fwd() requires a TextureNode.' );
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const Hll = float( textureNode );
|
|
35
|
-
const uvNode = texNode.uvNode || uv();
|
|
36
|
-
|
|
37
14
|
// It's used to preserve the same TextureNode instance
|
|
38
|
-
const sampleTexture = (
|
|
15
|
+
const sampleTexture = ( callback ) => textureNode.cache().context( { getUV: ( texNode ) => callback( texNode.uvNode || uv() ), forceUVContext: true } );
|
|
16
|
+
|
|
17
|
+
const Hll = float( sampleTexture( ( uvNode ) => uvNode ) );
|
|
39
18
|
|
|
40
19
|
return vec2(
|
|
41
|
-
float( sampleTexture( uvNode.add( uvNode.dFdx() ) ) ).sub( Hll ),
|
|
42
|
-
float( sampleTexture( uvNode.add( uvNode.dFdy() ) ) ).sub( Hll )
|
|
20
|
+
float( sampleTexture( ( uvNode ) => uvNode.add( uvNode.dFdx() ) ) ).sub( Hll ),
|
|
21
|
+
float( sampleTexture( ( uvNode ) => uvNode.add( uvNode.dFdy() ) ) ).sub( Hll )
|
|
43
22
|
).mul( bumpScale );
|
|
44
23
|
|
|
45
24
|
} );
|
|
46
25
|
|
|
26
|
+
// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)
|
|
27
|
+
|
|
47
28
|
const perturbNormalArb = tslFn( ( inputs ) => {
|
|
48
29
|
|
|
49
30
|
const { surf_pos, surf_norm, dHdxy } = inputs;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
2
|
import { nodeImmutable, float } from '../shadernode/ShaderNode.js';
|
|
3
|
+
import { BackSide, WebGLCoordinateSystem } from 'three';
|
|
3
4
|
|
|
4
5
|
class FrontFacingNode extends Node {
|
|
5
6
|
|
|
@@ -13,6 +14,18 @@ class FrontFacingNode extends Node {
|
|
|
13
14
|
|
|
14
15
|
generate( builder ) {
|
|
15
16
|
|
|
17
|
+
const { renderer, material } = builder;
|
|
18
|
+
|
|
19
|
+
if ( renderer.coordinateSystem === WebGLCoordinateSystem ) {
|
|
20
|
+
|
|
21
|
+
if ( material.side === BackSide ) {
|
|
22
|
+
|
|
23
|
+
return 'false';
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
16
29
|
return builder.getFrontFacing();
|
|
17
30
|
|
|
18
31
|
}
|
|
@@ -66,6 +66,7 @@ class PassNode extends TempNode {
|
|
|
66
66
|
this._depthTextureNode = nodeObject( new PassTextureNode( this, depthTexture ) );
|
|
67
67
|
|
|
68
68
|
this._depthNode = null;
|
|
69
|
+
this._viewZNode = null;
|
|
69
70
|
this._cameraNear = uniform( 0 );
|
|
70
71
|
this._cameraFar = uniform( 0 );
|
|
71
72
|
|
|
@@ -91,6 +92,21 @@ class PassNode extends TempNode {
|
|
|
91
92
|
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
getViewZNode() {
|
|
96
|
+
|
|
97
|
+
if ( this._viewZNode === null ) {
|
|
98
|
+
|
|
99
|
+
const cameraNear = this._cameraNear;
|
|
100
|
+
const cameraFar = this._cameraFar;
|
|
101
|
+
|
|
102
|
+
this._viewZNode = perspectiveDepthToViewZ( this._depthTextureNode, cameraNear, cameraFar );
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return this._viewZNode;
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
94
110
|
getDepthNode() {
|
|
95
111
|
|
|
96
112
|
if ( this._depthNode === null ) {
|
|
@@ -98,7 +114,7 @@ class PassNode extends TempNode {
|
|
|
98
114
|
const cameraNear = this._cameraNear;
|
|
99
115
|
const cameraFar = this._cameraFar;
|
|
100
116
|
|
|
101
|
-
this._depthNode = viewZToOrthographicDepth(
|
|
117
|
+
this._depthNode = viewZToOrthographicDepth( this.getViewZNode(), cameraNear, cameraFar );
|
|
102
118
|
|
|
103
119
|
}
|
|
104
120
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import TempNode from '../core/TempNode.js';
|
|
2
2
|
import { addNodeClass } from '../core/Node.js';
|
|
3
|
-
import { tslFn, nodeObject, float, mat3, vec3 } from '../shadernode/ShaderNode.js';
|
|
4
|
-
|
|
5
|
-
import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping } from 'three';
|
|
3
|
+
import { addNodeElement, tslFn, nodeObject, float, mat3, vec3 } from '../shadernode/ShaderNode.js';
|
|
4
|
+
import { rendererReference } from '../accessors/RendererReferenceNode.js';
|
|
6
5
|
import { clamp, log2, max, pow } from '../math/MathNode.js';
|
|
7
6
|
import { mul } from '../math/OperatorNode.js';
|
|
8
7
|
|
|
8
|
+
import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping } from 'three';
|
|
9
|
+
|
|
9
10
|
// exposure only
|
|
10
11
|
const LinearToneMappingNode = tslFn( ( { color, exposure } ) => {
|
|
11
12
|
|
|
@@ -127,7 +128,7 @@ const toneMappingLib = {
|
|
|
127
128
|
|
|
128
129
|
class ToneMappingNode extends TempNode {
|
|
129
130
|
|
|
130
|
-
constructor( toneMapping = NoToneMapping, exposureNode =
|
|
131
|
+
constructor( toneMapping = NoToneMapping, exposureNode = toneMappingExposure, colorNode = null ) {
|
|
131
132
|
|
|
132
133
|
super( 'vec3' );
|
|
133
134
|
|
|
@@ -180,5 +181,8 @@ class ToneMappingNode extends TempNode {
|
|
|
180
181
|
export default ToneMappingNode;
|
|
181
182
|
|
|
182
183
|
export const toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) );
|
|
184
|
+
export const toneMappingExposure = rendererReference( 'toneMappingExposure', 'float' );
|
|
185
|
+
|
|
186
|
+
addNodeElement( 'toneMapping', ( color, mapping, exposure ) => toneMapping( mapping, exposure, color ) );
|
|
183
187
|
|
|
184
188
|
addNodeClass( 'ToneMappingNode', ToneMappingNode );
|
|
@@ -75,7 +75,7 @@ export const orthographicDepthToViewZ = ( depth, near, far ) => near.sub( far ).
|
|
|
75
75
|
// NOTE: https://twitter.com/gonnavis/status/1377183786949959682
|
|
76
76
|
|
|
77
77
|
// -near maps to 0; -far maps to 1
|
|
78
|
-
export const viewZToPerspectiveDepth = ( viewZ, near, far ) => near.add( viewZ ).mul( far ).div(
|
|
78
|
+
export const viewZToPerspectiveDepth = ( viewZ, near, far ) => near.add( viewZ ).mul( far ).div( far.sub( near ).mul( viewZ ) );
|
|
79
79
|
|
|
80
80
|
// maps perspective depth in [ 0, 1 ] to viewZ
|
|
81
81
|
export const perspectiveDepthToViewZ = ( depth, near, far ) => near.mul( far ).div( far.sub( near ).mul( depth ).sub( far ) );
|
|
@@ -21,7 +21,9 @@ class ViewportNode extends Node {
|
|
|
21
21
|
|
|
22
22
|
getNodeType() {
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
if ( this.scope === ViewportNode.VIEWPORT ) return 'vec4';
|
|
25
|
+
else if ( this.scope === ViewportNode.COORDINATE ) return 'vec3';
|
|
26
|
+
else return 'vec2';
|
|
25
27
|
|
|
26
28
|
}
|
|
27
29
|
|
|
@@ -99,7 +101,7 @@ class ViewportNode extends Node {
|
|
|
99
101
|
|
|
100
102
|
const resolution = builder.getNodeProperties( viewportResolution ).outputNode.build( builder );
|
|
101
103
|
|
|
102
|
-
coord = `${ builder.getType( '
|
|
104
|
+
coord = `${ builder.getType( 'vec3' ) }( ${ coord }.x, ${ resolution }.y - ${ coord }.y, ${ coord }.z )`;
|
|
103
105
|
|
|
104
106
|
}
|
|
105
107
|
|
|
@@ -58,7 +58,10 @@ class ViewportTextureNode extends TextureNode {
|
|
|
58
58
|
|
|
59
59
|
clone() {
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
const viewportTextureNode = new this.constructor( this.uvNode, this.levelNode, this.value );
|
|
62
|
+
viewportTextureNode.generateMipmaps = this.generateMipmaps;
|
|
63
|
+
|
|
64
|
+
return viewportTextureNode;
|
|
62
65
|
|
|
63
66
|
}
|
|
64
67
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import FogNode from './FogNode.js';
|
|
2
|
-
import { positionView } from '../accessors/PositionNode.js';
|
|
3
2
|
import { addNodeClass } from '../core/Node.js';
|
|
4
3
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
5
4
|
|
|
@@ -15,12 +14,12 @@ class FogExp2Node extends FogNode {
|
|
|
15
14
|
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
setup() {
|
|
17
|
+
setup( builder ) {
|
|
19
18
|
|
|
20
|
-
const
|
|
21
|
-
const
|
|
19
|
+
const viewZ = this.getViewZNode( builder );
|
|
20
|
+
const density = this.densityNode;
|
|
22
21
|
|
|
23
|
-
return
|
|
22
|
+
return density.mul( density, viewZ, viewZ ).negate().exp().oneMinus();
|
|
24
23
|
|
|
25
24
|
}
|
|
26
25
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
|
-
import {
|
|
2
|
+
import { positionView } from '../accessors/PositionNode.js';
|
|
3
3
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
4
4
|
|
|
5
5
|
class FogNode extends Node {
|
|
@@ -15,9 +15,19 @@ class FogNode extends Node {
|
|
|
15
15
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
getViewZNode( builder ) {
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
let viewZ;
|
|
21
|
+
|
|
22
|
+
const getViewZ = builder.context.getViewZ;
|
|
23
|
+
|
|
24
|
+
if ( getViewZ !== undefined ) {
|
|
25
|
+
|
|
26
|
+
viewZ = getViewZ( this );
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return ( viewZ || positionView.z ).negate();
|
|
21
31
|
|
|
22
32
|
}
|
|
23
33
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import FogNode from './FogNode.js';
|
|
2
2
|
import { smoothstep } from '../math/MathNode.js';
|
|
3
|
-
import { positionView } from '../accessors/PositionNode.js';
|
|
4
3
|
import { addNodeClass } from '../core/Node.js';
|
|
5
4
|
import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
|
|
6
5
|
|
|
@@ -17,9 +16,11 @@ class FogRangeNode extends FogNode {
|
|
|
17
16
|
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
setup() {
|
|
19
|
+
setup( builder ) {
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
const viewZ = this.getViewZNode( builder );
|
|
22
|
+
|
|
23
|
+
return smoothstep( this.nearNode, this.farNode, viewZ );
|
|
23
24
|
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import F_Schlick from './F_Schlick.js';
|
|
2
2
|
import V_GGX_SmithCorrelated from './V_GGX_SmithCorrelated.js';
|
|
3
|
+
import V_GGX_SmithCorrelated_Anisotropic from './V_GGX_SmithCorrelated_Anisotropic.js';
|
|
3
4
|
import D_GGX from './D_GGX.js';
|
|
5
|
+
import D_GGX_Anisotropic from './D_GGX_Anisotropic.js';
|
|
4
6
|
import { transformedNormalView } from '../../accessors/NormalNode.js';
|
|
5
7
|
import { positionViewDirection } from '../../accessors/PositionNode.js';
|
|
6
|
-
import { iridescence } from '../../core/PropertyNode.js';
|
|
7
|
-
import { tslFn } from '../../shadernode/ShaderNode.js';
|
|
8
|
+
import { iridescence, alphaT, anisotropyT, anisotropyB } from '../../core/PropertyNode.js';
|
|
9
|
+
import { tslFn, defined } from '../../shadernode/ShaderNode.js';
|
|
8
10
|
|
|
9
11
|
// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility
|
|
10
12
|
const BRDF_GGX = tslFn( ( inputs ) => {
|
|
11
13
|
|
|
12
|
-
const { lightDirection, f0, f90, roughness,
|
|
14
|
+
const { lightDirection, f0, f90, roughness, f, USE_IRIDESCENCE, USE_ANISOTROPY } = inputs;
|
|
13
15
|
|
|
14
16
|
const normalView = inputs.normalView || transformedNormalView;
|
|
15
17
|
|
|
@@ -23,15 +25,32 @@ const BRDF_GGX = tslFn( ( inputs ) => {
|
|
|
23
25
|
const dotVH = positionViewDirection.dot( halfDir ).clamp();
|
|
24
26
|
|
|
25
27
|
let F = F_Schlick( { f0, f90, dotVH } );
|
|
28
|
+
let V, D;
|
|
26
29
|
|
|
27
|
-
if (
|
|
30
|
+
if ( defined( USE_IRIDESCENCE ) ) {
|
|
28
31
|
|
|
29
|
-
F = iridescence.mix( F,
|
|
32
|
+
F = iridescence.mix( F, f );
|
|
30
33
|
|
|
31
34
|
}
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
if ( defined( USE_ANISOTROPY ) ) {
|
|
37
|
+
|
|
38
|
+
const dotTL = anisotropyT.dot( lightDirection );
|
|
39
|
+
const dotTV = anisotropyT.dot( positionViewDirection );
|
|
40
|
+
const dotTH = anisotropyT.dot( halfDir );
|
|
41
|
+
const dotBL = anisotropyB.dot( lightDirection );
|
|
42
|
+
const dotBV = anisotropyB.dot( positionViewDirection );
|
|
43
|
+
const dotBH = anisotropyB.dot( halfDir );
|
|
44
|
+
|
|
45
|
+
V = V_GGX_SmithCorrelated_Anisotropic( { alphaT, alphaB: alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } );
|
|
46
|
+
D = D_GGX_Anisotropic( { alphaT, alphaB: alpha, dotNH, dotTH, dotBH } );
|
|
47
|
+
|
|
48
|
+
} else {
|
|
49
|
+
|
|
50
|
+
V = V_GGX_SmithCorrelated( { alpha, dotNL, dotNV } );
|
|
51
|
+
D = D_GGX( { alpha, dotNH } );
|
|
52
|
+
|
|
53
|
+
}
|
|
35
54
|
|
|
36
55
|
return F.mul( V ).mul( D );
|
|
37
56
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { tslFn, float, vec3 } from '../../shadernode/ShaderNode.js';
|
|
2
|
+
|
|
3
|
+
const RECIPROCAL_PI = float( 1 / Math.PI );
|
|
4
|
+
|
|
5
|
+
// https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel/anisotropicspecularbrdf
|
|
6
|
+
|
|
7
|
+
const D_GGX_Anisotropic = tslFn( ( { alphaT, alphaB, dotNH, dotTH, dotBH } ) => {
|
|
8
|
+
|
|
9
|
+
const a2 = alphaT.mul( alphaB );
|
|
10
|
+
const v = vec3( alphaB.mul( dotTH ), alphaT.mul( dotBH ), a2.mul( dotNH ) );
|
|
11
|
+
const v2 = v.dot( v );
|
|
12
|
+
const w2 = a2.div( v2 );
|
|
13
|
+
|
|
14
|
+
return RECIPROCAL_PI.mul( a2.mul( w2.pow2() ) );
|
|
15
|
+
|
|
16
|
+
} ).setLayout( {
|
|
17
|
+
name: 'D_GGX_Anisotropic',
|
|
18
|
+
type: 'float',
|
|
19
|
+
inputs: [
|
|
20
|
+
{ name: 'alphaT', type: 'float', qualifier: 'in' },
|
|
21
|
+
{ name: 'alphaB', type: 'float', qualifier: 'in' },
|
|
22
|
+
{ name: 'dotNH', type: 'float', qualifier: 'in' },
|
|
23
|
+
{ name: 'dotTH', type: 'float', qualifier: 'in' },
|
|
24
|
+
{ name: 'dotBH', type: 'float', qualifier: 'in' }
|
|
25
|
+
]
|
|
26
|
+
} );
|
|
27
|
+
|
|
28
|
+
export default D_GGX_Anisotropic;
|
|
@@ -4,9 +4,7 @@ import { tslFn } from '../../shadernode/ShaderNode.js';
|
|
|
4
4
|
|
|
5
5
|
// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2
|
|
6
6
|
// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
|
|
7
|
-
const V_GGX_SmithCorrelated = tslFn( (
|
|
8
|
-
|
|
9
|
-
const { alpha, dotNL, dotNV } = inputs;
|
|
7
|
+
const V_GGX_SmithCorrelated = tslFn( ( { alpha, dotNL, dotNV } ) => {
|
|
10
8
|
|
|
11
9
|
const a2 = alpha.pow2();
|
|
12
10
|
|