super-three 0.154.1 → 0.156.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 +360 -160
- package/build/three.js +360 -160
- package/build/three.min.js +1 -1
- package/build/three.module.js +355 -161
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +155 -25
- package/examples/jsm/csm/CSMShader.js +35 -1
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +1 -0
- package/examples/jsm/interactive/SelectionHelper.js +7 -0
- package/examples/jsm/libs/tween.module.js +790 -735
- package/examples/jsm/libs/utif.module.js +1644 -1558
- package/examples/jsm/loaders/DDSLoader.js +46 -3
- package/examples/jsm/loaders/EXRLoader.js +4 -4
- package/examples/jsm/loaders/FBXLoader.js +3 -1
- package/examples/jsm/loaders/GLTFLoader.js +25 -10
- package/examples/jsm/loaders/KTX2Loader.js +128 -79
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LogLuvLoader.js +2 -2
- package/examples/jsm/loaders/MMDLoader.js +10 -7
- package/examples/jsm/loaders/NRRDLoader.js +3 -3
- package/examples/jsm/loaders/PLYLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +48 -66
- package/examples/jsm/loaders/STLLoader.js +7 -0
- package/examples/jsm/loaders/TGALoader.js +10 -10
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
- package/examples/jsm/misc/Volume.js +4 -6
- package/examples/jsm/nodes/Nodes.js +8 -6
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
- package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
- package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
- package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
- package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
- package/examples/jsm/nodes/core/AttributeNode.js +2 -2
- package/examples/jsm/nodes/core/LightingModel.js +7 -9
- package/examples/jsm/nodes/core/Node.js +28 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
- package/examples/jsm/nodes/core/NodeUniform.js +1 -1
- package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
- package/examples/jsm/nodes/core/PropertyNode.js +6 -0
- package/examples/jsm/nodes/core/StackNode.js +4 -4
- package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +19 -5
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
- package/examples/jsm/nodes/lighting/AONode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
- package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
- package/examples/jsm/nodes/materials/Materials.js +2 -0
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/math/HashNode.js +35 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
- package/examples/jsm/nodes/utils/SplitNode.js +1 -1
- package/examples/jsm/objects/Reflector.js +1 -9
- package/examples/jsm/objects/Refractor.js +0 -8
- package/examples/jsm/offscreen/scene.js +0 -1
- package/examples/jsm/postprocessing/FilmPass.js +3 -5
- package/examples/jsm/postprocessing/MaskPass.js +4 -1
- package/examples/jsm/postprocessing/OutputPass.js +33 -14
- package/examples/jsm/postprocessing/RenderPass.js +30 -12
- package/examples/jsm/postprocessing/SAOPass.js +23 -98
- package/examples/jsm/postprocessing/SSAOPass.js +10 -30
- package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
- package/examples/jsm/renderers/common/Backend.js +11 -8
- package/examples/jsm/renderers/common/Background.js +22 -20
- package/examples/jsm/renderers/common/Binding.js +14 -0
- package/examples/jsm/renderers/common/Bindings.js +7 -10
- package/examples/jsm/renderers/common/Geometries.js +1 -1
- package/examples/jsm/renderers/common/Pipelines.js +96 -47
- package/examples/jsm/renderers/common/RenderContext.js +1 -0
- package/examples/jsm/renderers/common/RenderContexts.js +41 -5
- package/examples/jsm/renderers/common/RenderList.js +12 -4
- package/examples/jsm/renderers/common/RenderObject.js +26 -6
- package/examples/jsm/renderers/common/RenderObjects.js +10 -7
- package/examples/jsm/renderers/common/Renderer.js +82 -42
- package/examples/jsm/renderers/common/SampledTexture.js +2 -1
- package/examples/jsm/renderers/common/Sampler.js +1 -1
- package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +172 -20
- package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
- package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
- package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
- package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
- package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
- package/examples/jsm/shaders/FilmShader.js +11 -54
- package/examples/jsm/shaders/OutputShader.js +19 -2
- package/examples/jsm/shaders/SAOShader.js +0 -13
- package/examples/jsm/shaders/SSAOShader.js +33 -26
- package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
- package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
- package/package.json +2 -2
- package/src/Three.js +3 -0
- package/src/animation/PropertyBinding.js +1 -1
- package/src/audio/Audio.js +6 -0
- package/src/cameras/CubeCamera.js +1 -4
- package/src/constants.js +4 -1
- package/src/core/BufferAttribute.js +20 -0
- package/src/core/Object3D.js +2 -15
- package/src/core/RenderTarget.js +122 -0
- package/src/core/UniformsGroup.js +2 -2
- package/src/geometries/CapsuleGeometry.js +1 -1
- package/src/loaders/DataTextureLoader.js +19 -2
- package/src/materials/Material.js +2 -2
- package/src/math/Vector2.js +2 -2
- package/src/math/Vector3.js +3 -3
- package/src/math/Vector4.js +4 -4
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
- package/src/renderers/WebGLRenderTarget.js +3 -110
- package/src/renderers/WebGLRenderer.js +83 -57
- package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
- package/src/renderers/webgl/WebGLBackground.js +5 -14
- package/src/renderers/webgl/WebGLGeometries.js +5 -1
- package/src/renderers/webgl/WebGLMaterials.js +1 -1
- package/src/renderers/webgl/WebGLProgram.js +2 -0
- package/src/renderers/webgl/WebGLPrograms.js +19 -3
- package/src/renderers/webgl/WebGLTextures.js +101 -16
- package/src/renderers/webgl/WebGLUtils.js +27 -20
- package/src/textures/CompressedCubeTexture.js +19 -0
- package/src/textures/Texture.js +2 -2
- package/src/utils.js +9 -1
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
- package/examples/jsm/renderers/common/RenderTarget.js +0 -15
- package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
- /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +0 -0
|
@@ -17,20 +17,17 @@ class DirectionalLightNode extends AnalyticLightNode {
|
|
|
17
17
|
|
|
18
18
|
super.construct( builder );
|
|
19
19
|
|
|
20
|
+
const lightingModel = builder.context.lightingModel;
|
|
21
|
+
|
|
20
22
|
const lightColor = this.colorNode;
|
|
21
23
|
const lightDirection = lightTargetDirection( this.light );
|
|
22
|
-
const lightingModelFunctionNode = builder.context.lightingModelNode;
|
|
23
24
|
const reflectedLight = builder.context.reflectedLight;
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
reflectedLight
|
|
31
|
-
} );
|
|
32
|
-
|
|
33
|
-
}
|
|
26
|
+
lightingModel.direct( {
|
|
27
|
+
lightDirection,
|
|
28
|
+
lightColor,
|
|
29
|
+
reflectedLight
|
|
30
|
+
} );
|
|
34
31
|
|
|
35
32
|
}
|
|
36
33
|
|
|
@@ -12,6 +12,8 @@ import { float, vec2 } from '../shadernode/ShaderNode.js';
|
|
|
12
12
|
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
13
13
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
14
14
|
|
|
15
|
+
const envNodeCache = new WeakMap();
|
|
16
|
+
|
|
15
17
|
class EnvironmentNode extends LightingNode {
|
|
16
18
|
|
|
17
19
|
constructor( envNode = null ) {
|
|
@@ -29,13 +31,23 @@ class EnvironmentNode extends LightingNode {
|
|
|
29
31
|
|
|
30
32
|
if ( envNode.isTextureNode && envNode.value.isCubeTexture !== true ) {
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
let cacheEnvNode = envNodeCache.get( envNode.value );
|
|
35
|
+
|
|
36
|
+
if ( cacheEnvNode === undefined ) {
|
|
37
|
+
|
|
38
|
+
const texture = envNode.value;
|
|
39
|
+
const renderer = builder.renderer;
|
|
40
|
+
|
|
41
|
+
// @TODO: Add dispose logic here
|
|
42
|
+
const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
|
|
34
43
|
|
|
35
|
-
|
|
36
|
-
const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
|
|
44
|
+
cacheEnvNode = cubeTexture( cubeRTT.texture );
|
|
37
45
|
|
|
38
|
-
|
|
46
|
+
envNodeCache.set( envNode.value, cacheEnvNode );
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
envNode = cacheEnvNode;
|
|
39
51
|
|
|
40
52
|
}
|
|
41
53
|
|
|
@@ -56,22 +68,20 @@ class EnvironmentNode extends LightingNode {
|
|
|
56
68
|
|
|
57
69
|
//
|
|
58
70
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if ( builder.context.clearcoatRadiance ) {
|
|
71
|
+
const clearcoatRadiance = builder.context.lightingModel.clearcoatRadiance;
|
|
62
72
|
|
|
63
|
-
|
|
73
|
+
if ( clearcoatRadiance ) {
|
|
64
74
|
|
|
65
|
-
|
|
75
|
+
const clearcoatRadianceContext = context( envNode, createRadianceContext( clearcoatRoughness, transformedClearcoatNormalView ) ).mul( intensity );
|
|
76
|
+
const isolateClearcoatRadiance = cache( clearcoatRadianceContext );
|
|
66
77
|
|
|
67
|
-
|
|
78
|
+
clearcoatRadiance.addAssign( isolateClearcoatRadiance );
|
|
68
79
|
|
|
69
80
|
}
|
|
70
81
|
|
|
71
82
|
//
|
|
72
83
|
|
|
73
84
|
properties.radiance = isolateRadiance;
|
|
74
|
-
properties.clearcoatRadiance = isolateClearcoatRadiance;
|
|
75
85
|
properties.irradiance = irradiance;
|
|
76
86
|
|
|
77
87
|
}
|
|
@@ -6,11 +6,11 @@ import { addNodeElement, nodeProxy, float, vec3 } from '../shadernode/ShaderNode
|
|
|
6
6
|
|
|
7
7
|
class LightingContextNode extends ContextNode {
|
|
8
8
|
|
|
9
|
-
constructor( node,
|
|
9
|
+
constructor( node, lightingModel = null, backdropNode = null, backdropAlphaNode = null ) {
|
|
10
10
|
|
|
11
11
|
super( node );
|
|
12
12
|
|
|
13
|
-
this.
|
|
13
|
+
this.lightingModel = lightingModel;
|
|
14
14
|
this.backdropNode = backdropNode;
|
|
15
15
|
this.backdropAlphaNode = backdropAlphaNode;
|
|
16
16
|
|
|
@@ -24,7 +24,7 @@ class LightingContextNode extends ContextNode {
|
|
|
24
24
|
|
|
25
25
|
construct( builder ) {
|
|
26
26
|
|
|
27
|
-
const {
|
|
27
|
+
const { lightingModel, backdropNode, backdropAlphaNode } = this;
|
|
28
28
|
|
|
29
29
|
const context = this.context = {}; // reset context
|
|
30
30
|
const properties = builder.getNodeProperties( this );
|
|
@@ -61,17 +61,20 @@ class LightingContextNode extends ContextNode {
|
|
|
61
61
|
};
|
|
62
62
|
|
|
63
63
|
context.reflectedLight = reflectedLight;
|
|
64
|
-
context.
|
|
64
|
+
context.lightingModel = lightingModel || context.lightingModel;
|
|
65
65
|
|
|
66
66
|
Object.assign( properties, reflectedLight, lighting );
|
|
67
67
|
Object.assign( context, lighting );
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
if ( lightingModelNode && lightingModelNode.init ) lightingModelNode.init( context, builder.stack, builder );
|
|
69
|
+
if ( lightingModel ) {
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
+
}
|
|
75
78
|
|
|
76
79
|
return super.construct( builder );
|
|
77
80
|
|
|
@@ -34,6 +34,8 @@ class PointLightNode extends AnalyticLightNode {
|
|
|
34
34
|
|
|
35
35
|
const { colorNode, cutoffDistanceNode, decayExponentNode, light } = this;
|
|
36
36
|
|
|
37
|
+
const lightingModel = builder.context.lightingModel;
|
|
38
|
+
|
|
37
39
|
const lVector = objectViewPosition( light ).sub( positionView ); // @TODO: Add it into LightNode
|
|
38
40
|
|
|
39
41
|
const lightDirection = lVector.normalize();
|
|
@@ -47,18 +49,13 @@ class PointLightNode extends AnalyticLightNode {
|
|
|
47
49
|
|
|
48
50
|
const lightColor = colorNode.mul( lightAttenuation );
|
|
49
51
|
|
|
50
|
-
const lightingModelFunctionNode = builder.context.lightingModelNode;
|
|
51
52
|
const reflectedLight = builder.context.reflectedLight;
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
reflectedLight
|
|
59
|
-
} );
|
|
60
|
-
|
|
61
|
-
}
|
|
54
|
+
lightingModel.direct( {
|
|
55
|
+
lightDirection,
|
|
56
|
+
lightColor,
|
|
57
|
+
reflectedLight
|
|
58
|
+
} );
|
|
62
59
|
|
|
63
60
|
}
|
|
64
61
|
|
|
@@ -50,6 +50,8 @@ class SpotLightNode extends AnalyticLightNode {
|
|
|
50
50
|
|
|
51
51
|
super.construct( builder );
|
|
52
52
|
|
|
53
|
+
const lightingModel = builder.context.lightingModel;
|
|
54
|
+
|
|
53
55
|
const { colorNode, cutoffDistanceNode, decayExponentNode, light } = this;
|
|
54
56
|
|
|
55
57
|
const lVector = objectViewPosition( light ).sub( positionView ); // @TODO: Add it into LightNode
|
|
@@ -68,18 +70,13 @@ class SpotLightNode extends AnalyticLightNode {
|
|
|
68
70
|
|
|
69
71
|
const lightColor = colorNode.mul( spotAttenuation ).mul( lightAttenuation );
|
|
70
72
|
|
|
71
|
-
const lightingModelFunctionNode = builder.context.lightingModelNode;
|
|
72
73
|
const reflectedLight = builder.context.reflectedLight;
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
reflectedLight
|
|
80
|
-
} );
|
|
81
|
-
|
|
82
|
-
}
|
|
75
|
+
lightingModel.direct( {
|
|
76
|
+
lightDirection,
|
|
77
|
+
lightColor,
|
|
78
|
+
reflectedLight
|
|
79
|
+
} );
|
|
83
80
|
|
|
84
81
|
}
|
|
85
82
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
|
|
2
|
+
import { attribute } from '../core/AttributeNode.js';
|
|
3
|
+
import { varying } from '../core/VaryingNode.js';
|
|
4
|
+
import { materialLineDashSize, materialLineGapSize, materialLineScale } from '../accessors/LineMaterialNode.js';
|
|
5
|
+
import { dashSize, gapSize } from '../core/PropertyNode.js';
|
|
6
|
+
import { float } from '../shadernode/ShaderNode.js';
|
|
7
|
+
import { LineDashedMaterial } from 'three';
|
|
8
|
+
|
|
9
|
+
const defaultValues = new LineDashedMaterial();
|
|
10
|
+
|
|
11
|
+
class LineDashedNodeMaterial extends NodeMaterial {
|
|
12
|
+
|
|
13
|
+
constructor( parameters ) {
|
|
14
|
+
|
|
15
|
+
super();
|
|
16
|
+
|
|
17
|
+
this.isLineDashedNodeMaterial = true;
|
|
18
|
+
|
|
19
|
+
this.lights = false;
|
|
20
|
+
this.normals = false;
|
|
21
|
+
|
|
22
|
+
this.setDefaultValues( defaultValues );
|
|
23
|
+
|
|
24
|
+
this.offsetNode = null;
|
|
25
|
+
this.dashScaleNode = null;
|
|
26
|
+
this.dashSizeNode = null;
|
|
27
|
+
this.gapSizeNode = null;
|
|
28
|
+
|
|
29
|
+
this.setValues( parameters );
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
constructVariants( { stack } ) {
|
|
34
|
+
|
|
35
|
+
const offsetNode = this.offsetNode;
|
|
36
|
+
const dashScaleNode = this.dashScaleNode ? float( this.dashScaleNode ) : materialLineScale;
|
|
37
|
+
const dashSizeNode = this.dashSizeNode ? float( this.dashSizeNode ) : materialLineDashSize;
|
|
38
|
+
const gapSizeNode = this.dashSizeNode ? float( this.dashGapNode ) : materialLineGapSize;
|
|
39
|
+
|
|
40
|
+
stack.assign( dashSize, dashSizeNode );
|
|
41
|
+
stack.assign( gapSize, gapSizeNode );
|
|
42
|
+
|
|
43
|
+
const vLineDistance = varying( attribute( 'lineDistance' ).mul( dashScaleNode ) );
|
|
44
|
+
const vLineDistanceOffset = offsetNode ? vLineDistance.add( offsetNode ) : vLineDistance;
|
|
45
|
+
|
|
46
|
+
stack.add( vLineDistanceOffset.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard() );
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default LineDashedNodeMaterial;
|
|
53
|
+
|
|
54
|
+
addNodeMaterial( LineDashedNodeMaterial );
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
export { default as NodeMaterial, addNodeMaterial, createNodeMaterialFromType } from './NodeMaterial.js';
|
|
4
4
|
export { default as LineBasicNodeMaterial } from './LineBasicNodeMaterial.js';
|
|
5
|
+
export { default as LineDashedNodeMaterial } from './LineDashedNodeMaterial.js';
|
|
5
6
|
export { default as MeshNormalNodeMaterial } from './MeshNormalNodeMaterial.js';
|
|
6
7
|
export { default as MeshBasicNodeMaterial } from './MeshBasicNodeMaterial.js';
|
|
8
|
+
export { default as MeshLambertNodeMaterial } from './MeshLambertNodeMaterial.js';
|
|
7
9
|
export { default as MeshPhongNodeMaterial } from './MeshPhongNodeMaterial.js';
|
|
8
10
|
export { default as MeshStandardNodeMaterial } from './MeshStandardNodeMaterial.js';
|
|
9
11
|
export { default as MeshPhysicalNodeMaterial } from './MeshPhysicalNodeMaterial.js';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
|
|
2
|
+
import PhongLightingModel from '../functions/PhongLightingModel.js';
|
|
3
|
+
|
|
4
|
+
import { MeshLambertMaterial } from 'three';
|
|
5
|
+
|
|
6
|
+
const defaultValues = new MeshLambertMaterial();
|
|
7
|
+
|
|
8
|
+
class MeshLambertNodeMaterial extends NodeMaterial {
|
|
9
|
+
|
|
10
|
+
constructor( parameters ) {
|
|
11
|
+
|
|
12
|
+
super();
|
|
13
|
+
|
|
14
|
+
this.isMeshLambertNodeMaterial = true;
|
|
15
|
+
|
|
16
|
+
this.lights = true;
|
|
17
|
+
|
|
18
|
+
this.setDefaultValues( defaultValues );
|
|
19
|
+
|
|
20
|
+
this.setValues( parameters );
|
|
21
|
+
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
constructLightingModel( /*builder*/ ) {
|
|
25
|
+
|
|
26
|
+
return new PhongLightingModel( false ); // ( specular ) -> force lambert
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default MeshLambertNodeMaterial;
|
|
33
|
+
|
|
34
|
+
addNodeMaterial( MeshLambertNodeMaterial );
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import NodeMaterial, { addNodeMaterial } from './NodeMaterial.js';
|
|
2
2
|
import { shininess, specularColor } from '../core/PropertyNode.js';
|
|
3
3
|
import { materialShininess, materialSpecularColor } from '../accessors/MaterialNode.js';
|
|
4
|
-
import phongLightingModel from '../functions/PhongLightingModel.js';
|
|
5
4
|
import { float } from '../shadernode/ShaderNode.js';
|
|
5
|
+
import PhongLightingModel from '../functions/PhongLightingModel.js';
|
|
6
6
|
|
|
7
7
|
import { MeshPhongMaterial } from 'three';
|
|
8
8
|
|
|
@@ -29,7 +29,7 @@ class MeshPhongNodeMaterial extends NodeMaterial {
|
|
|
29
29
|
|
|
30
30
|
constructLightingModel( /*builder*/ ) {
|
|
31
31
|
|
|
32
|
-
return
|
|
32
|
+
return new PhongLightingModel();
|
|
33
33
|
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { addNodeMaterial } from './NodeMaterial.js';
|
|
2
2
|
import { transformedClearcoatNormalView } from '../accessors/NormalNode.js';
|
|
3
|
-
import { clearcoat, clearcoatRoughness, sheen, sheenRoughness } from '../core/PropertyNode.js';
|
|
3
|
+
import { clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness } from '../core/PropertyNode.js';
|
|
4
4
|
import { materialClearcoatNormal } from '../accessors/ExtendedMaterialNode.js';
|
|
5
|
-
import { materialClearcoat, materialClearcoatRoughness, materialSheen, materialSheenRoughness } from '../accessors/MaterialNode.js';
|
|
5
|
+
import { materialClearcoat, materialClearcoatRoughness, materialSheen, materialSheenRoughness, materialIridescence, materialIridescenceIOR, materialIridescenceThickness } from '../accessors/MaterialNode.js';
|
|
6
6
|
import { float, vec3 } from '../shadernode/ShaderNode.js';
|
|
7
|
+
import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
|
|
7
8
|
import MeshStandardNodeMaterial from './MeshStandardNodeMaterial.js';
|
|
8
9
|
|
|
9
10
|
import { MeshPhysicalMaterial } from 'three';
|
|
@@ -43,6 +44,12 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
|
|
|
43
44
|
|
|
44
45
|
}
|
|
45
46
|
|
|
47
|
+
constructLightingModel( /*builder*/ ) {
|
|
48
|
+
|
|
49
|
+
return new PhysicalLightingModel(); // @TODO: Optimize shader using parameters.
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
46
53
|
constructVariants( builder ) {
|
|
47
54
|
|
|
48
55
|
super.constructVariants( builder );
|
|
@@ -65,6 +72,16 @@ class MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {
|
|
|
65
72
|
stack.assign( sheen, sheenNode );
|
|
66
73
|
stack.assign( sheenRoughness, sheenRoughnessNode );
|
|
67
74
|
|
|
75
|
+
// IRIDESCENCE
|
|
76
|
+
|
|
77
|
+
const iridescenceNode = this.iridescenceNode ? float( this.iridescenceNode ) : materialIridescence;
|
|
78
|
+
const iridescenceIORNode = this.iridescenceIORNode ? float( this.iridescenceIORNode ) : materialIridescenceIOR;
|
|
79
|
+
const iridescenceThicknessNode = this.iridescenceThicknessNode ? float( this.iridescenceThicknessNode ) : materialIridescenceThickness;
|
|
80
|
+
|
|
81
|
+
stack.assign( iridescence, iridescenceNode );
|
|
82
|
+
stack.assign( iridescenceIOR, iridescenceIORNode );
|
|
83
|
+
stack.assign( iridescenceThickness, iridescenceThicknessNode );
|
|
84
|
+
|
|
68
85
|
}
|
|
69
86
|
|
|
70
87
|
constructNormal( builder ) {
|
|
@@ -3,7 +3,7 @@ import { diffuseColor, metalness, roughness, specularColor } from '../core/Prope
|
|
|
3
3
|
import { mix } from '../math/MathNode.js';
|
|
4
4
|
import { materialRoughness, materialMetalness } from '../accessors/MaterialNode.js';
|
|
5
5
|
import getRoughness from '../functions/material/getRoughness.js';
|
|
6
|
-
import
|
|
6
|
+
import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
|
|
7
7
|
import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
|
|
8
8
|
|
|
9
9
|
import { MeshStandardMaterial } from 'three';
|
|
@@ -31,7 +31,7 @@ class MeshStandardNodeMaterial extends NodeMaterial {
|
|
|
31
31
|
|
|
32
32
|
constructLightingModel( /*builder*/ ) {
|
|
33
33
|
|
|
34
|
-
return
|
|
34
|
+
return new PhysicalLightingModel( false, false ); // ( clearcoat, sheen ) -> standard
|
|
35
35
|
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Material, ShaderMaterial, NoColorSpace } from 'three';
|
|
1
|
+
import { Material, ShaderMaterial, NoColorSpace, LinearSRGBColorSpace } from 'three';
|
|
2
2
|
import { getNodeChildren, getCacheKey } from '../core/NodeUtils.js';
|
|
3
3
|
import { attribute } from '../core/AttributeNode.js';
|
|
4
|
-
import { diffuseColor } from '../core/PropertyNode.js';
|
|
4
|
+
import { output, diffuseColor } from '../core/PropertyNode.js';
|
|
5
5
|
import { materialNormal } from '../accessors/ExtendedMaterialNode.js';
|
|
6
6
|
import { materialAlphaTest, materialColor, materialOpacity, materialEmissive } from '../accessors/MaterialNode.js';
|
|
7
7
|
import { modelViewProjection } from '../accessors/ModelViewProjectionNode.js';
|
|
@@ -16,6 +16,7 @@ import { lightsWithoutWrap } from '../lighting/LightsNode.js';
|
|
|
16
16
|
import { mix, dFdx, dFdy } from '../math/MathNode.js';
|
|
17
17
|
import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
|
|
18
18
|
import AONode from '../lighting/AONode.js';
|
|
19
|
+
import { lightingContext } from '../lighting/LightingContextNode.js';
|
|
19
20
|
import EnvironmentNode from '../lighting/EnvironmentNode.js';
|
|
20
21
|
|
|
21
22
|
const NodeMaterials = new Map();
|
|
@@ -32,8 +33,12 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
32
33
|
|
|
33
34
|
this.forceSinglePass = false;
|
|
34
35
|
|
|
36
|
+
this.unlit = this.constructor === NodeMaterial.prototype.constructor; // Extended materials are not unlit by default
|
|
37
|
+
|
|
38
|
+
this.fog = true;
|
|
35
39
|
this.lights = true;
|
|
36
40
|
this.normals = true;
|
|
41
|
+
this.colorSpace = true;
|
|
37
42
|
|
|
38
43
|
this.lightsNode = null;
|
|
39
44
|
this.envNode = null;
|
|
@@ -46,7 +51,9 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
46
51
|
this.alphaTestNode = null;
|
|
47
52
|
|
|
48
53
|
this.positionNode = null;
|
|
49
|
-
|
|
54
|
+
|
|
55
|
+
this.outputNode = null; // @TODO: Rename to fragmentNode
|
|
56
|
+
this.vertexNode = null;
|
|
50
57
|
|
|
51
58
|
}
|
|
52
59
|
|
|
@@ -76,7 +83,9 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
76
83
|
|
|
77
84
|
builder.addStack();
|
|
78
85
|
|
|
79
|
-
|
|
86
|
+
let outputNode;
|
|
87
|
+
|
|
88
|
+
if ( this.unlit === false ) {
|
|
80
89
|
|
|
81
90
|
if ( this.normals === true ) this.constructNormal( builder );
|
|
82
91
|
|
|
@@ -85,14 +94,24 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
85
94
|
|
|
86
95
|
const outgoingLightNode = this.constructLighting( builder );
|
|
87
96
|
|
|
88
|
-
|
|
97
|
+
outputNode = this.constructOutput( builder, vec4( outgoingLightNode, diffuseColor.a ) );
|
|
98
|
+
|
|
99
|
+
// OUTPUT NODE
|
|
100
|
+
|
|
101
|
+
builder.stack.assign( output, outputNode );
|
|
102
|
+
|
|
103
|
+
//
|
|
104
|
+
|
|
105
|
+
if ( this.outputNode !== null ) outputNode = this.outputNode;
|
|
89
106
|
|
|
90
107
|
} else {
|
|
91
108
|
|
|
92
|
-
|
|
109
|
+
outputNode = this.constructOutput( builder, this.outputNode || vec4( 0, 0, 0, 1 ) );
|
|
93
110
|
|
|
94
111
|
}
|
|
95
112
|
|
|
113
|
+
builder.stack.outputNode = outputNode;
|
|
114
|
+
|
|
96
115
|
builder.addFlow( 'fragment', builder.removeStack() );
|
|
97
116
|
|
|
98
117
|
}
|
|
@@ -130,7 +149,7 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
130
149
|
|
|
131
150
|
builder.context.vertex = builder.removeStack();
|
|
132
151
|
|
|
133
|
-
return modelViewProjection();
|
|
152
|
+
return this.vertexNode || modelViewProjection();
|
|
134
153
|
|
|
135
154
|
}
|
|
136
155
|
|
|
@@ -272,7 +291,7 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
272
291
|
|
|
273
292
|
const lightingModelNode = this.constructLightingModel( builder );
|
|
274
293
|
|
|
275
|
-
outgoingLightNode =
|
|
294
|
+
outgoingLightNode = lightingContext( lightsNode, lightingModelNode, backdropNode, backdropAlphaNode );
|
|
276
295
|
|
|
277
296
|
} else if ( backdropNode !== null ) {
|
|
278
297
|
|
|
@@ -284,7 +303,7 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
284
303
|
|
|
285
304
|
if ( ( emissiveNode && emissiveNode.isNode === true ) || ( material.emissive && material.emissive.isColor === true ) ) {
|
|
286
305
|
|
|
287
|
-
outgoingLightNode = outgoingLightNode.add( emissiveNode ?
|
|
306
|
+
outgoingLightNode = outgoingLightNode.add( vec3( emissiveNode ? emissiveNode : materialEmissive ) );
|
|
288
307
|
|
|
289
308
|
}
|
|
290
309
|
|
|
@@ -306,29 +325,49 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
306
325
|
|
|
307
326
|
}
|
|
308
327
|
|
|
328
|
+
// FOG
|
|
329
|
+
|
|
330
|
+
if ( this.fog === true ) {
|
|
331
|
+
|
|
332
|
+
const fogNode = builder.fogNode;
|
|
333
|
+
|
|
334
|
+
if ( fogNode ) outputNode = vec4( fogNode.mixAssign( outputNode.rgb ), outputNode.a );
|
|
335
|
+
|
|
336
|
+
}
|
|
337
|
+
|
|
309
338
|
// ENCODING
|
|
310
339
|
|
|
311
|
-
|
|
340
|
+
if ( this.colorSpace === true ) {
|
|
312
341
|
|
|
313
|
-
|
|
342
|
+
const renderTarget = renderer.getRenderTarget();
|
|
314
343
|
|
|
315
|
-
|
|
344
|
+
let outputColorSpace;
|
|
316
345
|
|
|
317
|
-
|
|
346
|
+
if ( renderTarget !== null ) {
|
|
318
347
|
|
|
319
|
-
|
|
348
|
+
if ( Array.isArray( renderTarget.texture ) ) {
|
|
320
349
|
|
|
321
|
-
|
|
350
|
+
outputColorSpace = renderTarget.texture[ 0 ].colorSpace;
|
|
322
351
|
|
|
323
|
-
|
|
352
|
+
} else {
|
|
324
353
|
|
|
325
|
-
|
|
354
|
+
outputColorSpace = renderTarget.texture.colorSpace;
|
|
326
355
|
|
|
327
|
-
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
} else {
|
|
359
|
+
|
|
360
|
+
outputColorSpace = renderer.outputColorSpace;
|
|
328
361
|
|
|
329
|
-
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if ( outputColorSpace !== LinearSRGBColorSpace && outputColorSpace !== NoColorSpace ) {
|
|
330
365
|
|
|
331
|
-
|
|
366
|
+
outputNode = outputNode.linearToColorSpace( outputColorSpace );
|
|
367
|
+
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
}
|
|
332
371
|
|
|
333
372
|
return outputNode;
|
|
334
373
|
|
|
@@ -429,12 +468,6 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
429
468
|
|
|
430
469
|
}
|
|
431
470
|
|
|
432
|
-
get isUnlit() {
|
|
433
|
-
|
|
434
|
-
return this.constructor === NodeMaterial.prototype.constructor;
|
|
435
|
-
|
|
436
|
-
}
|
|
437
|
-
|
|
438
471
|
copy( source ) {
|
|
439
472
|
|
|
440
473
|
this.lightsNode = source.lightsNode;
|
|
@@ -448,7 +481,9 @@ class NodeMaterial extends ShaderMaterial {
|
|
|
448
481
|
this.alphaTestNode = source.alphaTestNode;
|
|
449
482
|
|
|
450
483
|
this.positionNode = source.positionNode;
|
|
484
|
+
|
|
451
485
|
this.outputNode = source.outputNode;
|
|
486
|
+
this.vertexNode = source.vertexNode;
|
|
452
487
|
|
|
453
488
|
return super.copy( source );
|
|
454
489
|
|
|
@@ -4,7 +4,7 @@ import { cameraProjectionMatrix } from '../accessors/CameraNode.js';
|
|
|
4
4
|
import { materialRotation } from '../accessors/MaterialNode.js';
|
|
5
5
|
import { modelViewMatrix, modelWorldMatrix } from '../accessors/ModelNode.js';
|
|
6
6
|
import { positionLocal } from '../accessors/PositionNode.js';
|
|
7
|
-
import { vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
|
|
7
|
+
import { float, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
|
|
8
8
|
|
|
9
9
|
import { SpriteMaterial } from 'three';
|
|
10
10
|
|
|
@@ -66,7 +66,7 @@ class SpriteNodeMaterial extends NodeMaterial {
|
|
|
66
66
|
|
|
67
67
|
alignedPosition = alignedPosition.mul( scale );
|
|
68
68
|
|
|
69
|
-
const rotation = rotationNode || materialRotation;
|
|
69
|
+
const rotation = float( rotationNode || materialRotation );
|
|
70
70
|
|
|
71
71
|
const cosAngle = rotation.cos();
|
|
72
72
|
const sinAngle = rotation.sin();
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
|
+
import { add, mul, bitXor, shiftRight } from './OperatorNode.js';
|
|
3
|
+
import { addNodeElement, nodeProxy, uint } from '../shadernode/ShaderNode.js';
|
|
4
|
+
|
|
5
|
+
class HashNode extends Node {
|
|
6
|
+
|
|
7
|
+
constructor( seedNode ) {
|
|
8
|
+
|
|
9
|
+
super();
|
|
10
|
+
|
|
11
|
+
this.seedNode = seedNode;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
construct( /*builder*/ ) {
|
|
16
|
+
|
|
17
|
+
const seed = this.seedNode;
|
|
18
|
+
|
|
19
|
+
const state = add( mul( uint( seed ), 747796405 ), 2891336453 );
|
|
20
|
+
const word = mul( bitXor( shiftRight( state, add( shiftRight( state, 28 ), 4 ) ), state ), 277803737 );
|
|
21
|
+
const uintResult = bitXor( shiftRight( word, 22 ), word );
|
|
22
|
+
|
|
23
|
+
return mul( 1 / 2 ** 32, uintResult ); // Convert to range [0, 1)
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default HashNode;
|
|
30
|
+
|
|
31
|
+
export const hash = nodeProxy( HashNode );
|
|
32
|
+
|
|
33
|
+
addNodeElement( 'hash', hash );
|
|
34
|
+
|
|
35
|
+
addNodeClass( HashNode );
|