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
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
// @TODO: Is this needed? Can it be moved in MaterialNode?
|
|
2
|
-
|
|
3
1
|
import MaterialNode from './MaterialNode.js';
|
|
4
2
|
import { materialReference } from './MaterialReferenceNode.js';
|
|
5
3
|
import { normalView } from './NormalNode.js';
|
|
6
4
|
import { normalMap } from '../display/NormalMapNode.js';
|
|
5
|
+
import { bumpMap } from '../display/BumpMapNode.js';
|
|
7
6
|
import { addNodeClass } from '../core/Node.js';
|
|
8
7
|
import { nodeImmutable } from '../shadernode/ShaderNode.js';
|
|
9
8
|
|
|
@@ -39,11 +38,23 @@ class ExtendedMaterialNode extends MaterialNode {
|
|
|
39
38
|
|
|
40
39
|
if ( scope === ExtendedMaterialNode.NORMAL ) {
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
if ( material.normalMap ) {
|
|
42
|
+
|
|
43
|
+
node = normalMap( this.getTexture( builder, 'normalMap' ), materialReference( 'normalScale', 'vec2' ) );
|
|
44
|
+
|
|
45
|
+
} else if ( material.bumpMap ) {
|
|
46
|
+
|
|
47
|
+
node = bumpMap( material.bumpMap, materialReference( 'bumpScale', 'float' ) );
|
|
48
|
+
|
|
49
|
+
} else {
|
|
50
|
+
|
|
51
|
+
node = normalView;
|
|
52
|
+
|
|
53
|
+
}
|
|
43
54
|
|
|
44
55
|
} else if ( scope === ExtendedMaterialNode.CLEARCOAT_NORMAL ) {
|
|
45
56
|
|
|
46
|
-
node = material.clearcoatNormalMap ? normalMap( this.getTexture( 'clearcoatNormalMap' ), materialReference( 'clearcoatNormalScale', 'vec2' ) ) : normalView;
|
|
57
|
+
node = material.clearcoatNormalMap ? normalMap( this.getTexture( builder, 'clearcoatNormalMap' ), materialReference( 'clearcoatNormalScale', 'vec2' ) ) : normalView;
|
|
47
58
|
|
|
48
59
|
}
|
|
49
60
|
|
|
@@ -3,7 +3,7 @@ import { instancedBufferAttribute, instancedDynamicBufferAttribute } from './Buf
|
|
|
3
3
|
import { normalLocal } from './NormalNode.js';
|
|
4
4
|
import { positionLocal } from './PositionNode.js';
|
|
5
5
|
import { nodeProxy, vec3, mat3, mat4 } from '../shadernode/ShaderNode.js';
|
|
6
|
-
import { DynamicDrawUsage } from 'three';
|
|
6
|
+
import { DynamicDrawUsage, InstancedInterleavedBuffer } from 'three';
|
|
7
7
|
|
|
8
8
|
class InstanceNode extends Node {
|
|
9
9
|
|
|
@@ -24,17 +24,17 @@ class InstanceNode extends Node {
|
|
|
24
24
|
if ( instanceMatrixNode === null ) {
|
|
25
25
|
|
|
26
26
|
const instanceMesh = this.instanceMesh;
|
|
27
|
-
const
|
|
28
|
-
const
|
|
27
|
+
const instanceAttribute = instanceMesh.instanceMatrix;
|
|
28
|
+
const buffer = new InstancedInterleavedBuffer( instanceAttribute.array, 16, 1 );
|
|
29
29
|
|
|
30
|
-
const bufferFn =
|
|
30
|
+
const bufferFn = instanceAttribute.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
|
|
31
31
|
|
|
32
32
|
const instanceBuffers = [
|
|
33
33
|
// F.Signature -> bufferAttribute( array, type, stride, offset )
|
|
34
|
-
bufferFn(
|
|
35
|
-
bufferFn(
|
|
36
|
-
bufferFn(
|
|
37
|
-
bufferFn(
|
|
34
|
+
bufferFn( buffer, 'vec4', 16, 0 ),
|
|
35
|
+
bufferFn( buffer, 'vec4', 16, 4 ),
|
|
36
|
+
bufferFn( buffer, 'vec4', 16, 8 ),
|
|
37
|
+
bufferFn( buffer, 'vec4', 16, 12 )
|
|
38
38
|
];
|
|
39
39
|
|
|
40
40
|
instanceMatrixNode = mat4( ...instanceBuffers );
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import MaterialNode from './MaterialNode.js';
|
|
2
|
+
import { addNodeClass } from '../core/Node.js';
|
|
3
|
+
import { nodeImmutable } from '../shadernode/ShaderNode.js';
|
|
4
|
+
|
|
5
|
+
class LineMaterialNode extends MaterialNode {
|
|
6
|
+
|
|
7
|
+
constructor( scope ) {
|
|
8
|
+
|
|
9
|
+
super( scope );
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
construct( builder ) {
|
|
14
|
+
|
|
15
|
+
return this.getFloat( builder, this.scope );
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
LineMaterialNode.SCALE = 'scale';
|
|
22
|
+
LineMaterialNode.DASH_SIZE = 'dashSize';
|
|
23
|
+
LineMaterialNode.GAP_SIZE = 'gapSize';
|
|
24
|
+
|
|
25
|
+
export default LineMaterialNode;
|
|
26
|
+
|
|
27
|
+
export const materialLineScale = nodeImmutable( LineMaterialNode, LineMaterialNode.SCALE );
|
|
28
|
+
export const materialLineDashSize = nodeImmutable( LineMaterialNode, LineMaterialNode.DASH_SIZE );
|
|
29
|
+
export const materialLineGapSize = nodeImmutable( LineMaterialNode, LineMaterialNode.GAP_SIZE );
|
|
30
|
+
|
|
31
|
+
addNodeClass( LineMaterialNode );
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
|
+
import { reference } from './ReferenceNode.js';
|
|
2
3
|
import { materialReference } from './MaterialReferenceNode.js';
|
|
3
|
-
import { nodeImmutable } from '../shadernode/ShaderNode.js';
|
|
4
|
+
import { nodeImmutable, float } from '../shadernode/ShaderNode.js';
|
|
5
|
+
|
|
6
|
+
const cache = new WeakMap();
|
|
4
7
|
|
|
5
8
|
class MaterialNode extends Node {
|
|
6
9
|
|
|
@@ -12,54 +15,49 @@ class MaterialNode extends Node {
|
|
|
12
15
|
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
getCache( builder, property, type ) {
|
|
16
19
|
|
|
17
|
-
const scope = this.scope;
|
|
18
20
|
const material = builder.context.material;
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
let cacheMaterial = cache.get( material );
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
if ( cacheMaterial === undefined ) {
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
cacheMaterial = {};
|
|
25
27
|
|
|
26
|
-
|
|
28
|
+
cache.set( material, cacheMaterial );
|
|
29
|
+
|
|
30
|
+
}
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
let node = cacheMaterial[ property ];
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
if ( node === undefined ) {
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
node = materialReference( property, type );
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
cacheMaterial[ property ] = node;
|
|
35
39
|
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
|
|
42
|
+
return node;
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
}
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
getFloat( builder, property ) {
|
|
43
47
|
|
|
44
|
-
return
|
|
48
|
+
return this.getCache( builder, property, 'float' );
|
|
45
49
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
|
-
getColor( property ) {
|
|
52
|
+
getColor( builder, property ) {
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return materialReference( property, 'color' );
|
|
54
|
+
return this.getCache( builder, property, 'color' );
|
|
53
55
|
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
getTexture( property ) {
|
|
57
|
-
|
|
58
|
-
//@TODO: Check if it can be cached by property name.
|
|
58
|
+
getTexture( builder, property ) {
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return textureRefNode;
|
|
60
|
+
return this.getCache( builder, property, 'texture' );
|
|
63
61
|
|
|
64
62
|
}
|
|
65
63
|
|
|
@@ -70,17 +68,21 @@ class MaterialNode extends Node {
|
|
|
70
68
|
|
|
71
69
|
let node = null;
|
|
72
70
|
|
|
73
|
-
if ( scope === MaterialNode.ALPHA_TEST ) {
|
|
71
|
+
if ( scope === MaterialNode.ALPHA_TEST || scope === MaterialNode.SHININESS || scope === MaterialNode.REFLECTIVITY || scope === MaterialNode.ROTATION || scope === MaterialNode.IRIDESCENCE || scope === MaterialNode.IRIDESCENCE_IOR ) {
|
|
74
72
|
|
|
75
|
-
node = this.getFloat(
|
|
73
|
+
node = this.getFloat( builder, scope );
|
|
74
|
+
|
|
75
|
+
} else if ( scope === MaterialNode.SPECULAR_COLOR ) {
|
|
76
|
+
|
|
77
|
+
node = this.getColor( builder, 'specular' );
|
|
76
78
|
|
|
77
79
|
} else if ( scope === MaterialNode.COLOR ) {
|
|
78
80
|
|
|
79
|
-
const colorNode = this.getColor( 'color' );
|
|
81
|
+
const colorNode = this.getColor( builder, 'color' );
|
|
80
82
|
|
|
81
83
|
if ( material.map && material.map.isTexture === true ) {
|
|
82
84
|
|
|
83
|
-
node = colorNode.mul( this.getTexture( 'map' ) );
|
|
85
|
+
node = colorNode.mul( this.getTexture( builder, 'map' ) );
|
|
84
86
|
|
|
85
87
|
} else {
|
|
86
88
|
|
|
@@ -90,11 +92,11 @@ class MaterialNode extends Node {
|
|
|
90
92
|
|
|
91
93
|
} else if ( scope === MaterialNode.OPACITY ) {
|
|
92
94
|
|
|
93
|
-
const opacityNode = this.getFloat( 'opacity' );
|
|
95
|
+
const opacityNode = this.getFloat( builder, 'opacity' );
|
|
94
96
|
|
|
95
97
|
if ( material.alphaMap && material.alphaMap.isTexture === true ) {
|
|
96
98
|
|
|
97
|
-
node = opacityNode.mul( this.getTexture( 'alphaMap' ) );
|
|
99
|
+
node = opacityNode.mul( this.getTexture( builder, 'alphaMap' ) );
|
|
98
100
|
|
|
99
101
|
} else {
|
|
100
102
|
|
|
@@ -102,35 +104,25 @@ class MaterialNode extends Node {
|
|
|
102
104
|
|
|
103
105
|
}
|
|
104
106
|
|
|
105
|
-
} else if ( scope === MaterialNode.
|
|
106
|
-
|
|
107
|
-
node = this.getFloat( 'shininess' );
|
|
108
|
-
|
|
109
|
-
} else if ( scope === MaterialNode.SPECULAR_COLOR ) {
|
|
110
|
-
|
|
111
|
-
node = this.getColor( 'specular' );
|
|
112
|
-
|
|
113
|
-
} else if ( scope === MaterialNode.REFLECTIVITY ) {
|
|
114
|
-
|
|
115
|
-
const reflectivityNode = this.getFloat( 'reflectivity' );
|
|
107
|
+
} else if ( scope === MaterialNode.SPECULAR_STRENGTH ) {
|
|
116
108
|
|
|
117
109
|
if ( material.specularMap && material.specularMap.isTexture === true ) {
|
|
118
110
|
|
|
119
|
-
node =
|
|
111
|
+
node = this.getTexture( builder, 'specularMap' ).r;
|
|
120
112
|
|
|
121
113
|
} else {
|
|
122
114
|
|
|
123
|
-
node =
|
|
115
|
+
node = float( 1 );
|
|
124
116
|
|
|
125
117
|
}
|
|
126
118
|
|
|
127
119
|
} else if ( scope === MaterialNode.ROUGHNESS ) {
|
|
128
120
|
|
|
129
|
-
const roughnessNode = this.getFloat( 'roughness' );
|
|
121
|
+
const roughnessNode = this.getFloat( builder, 'roughness' );
|
|
130
122
|
|
|
131
123
|
if ( material.roughnessMap && material.roughnessMap.isTexture === true ) {
|
|
132
124
|
|
|
133
|
-
node = roughnessNode.mul( this.getTexture( 'roughnessMap' ).g );
|
|
125
|
+
node = roughnessNode.mul( this.getTexture( builder, 'roughnessMap' ).g );
|
|
134
126
|
|
|
135
127
|
} else {
|
|
136
128
|
|
|
@@ -140,11 +132,11 @@ class MaterialNode extends Node {
|
|
|
140
132
|
|
|
141
133
|
} else if ( scope === MaterialNode.METALNESS ) {
|
|
142
134
|
|
|
143
|
-
const metalnessNode = this.getFloat( 'metalness' );
|
|
135
|
+
const metalnessNode = this.getFloat( builder, 'metalness' );
|
|
144
136
|
|
|
145
137
|
if ( material.metalnessMap && material.metalnessMap.isTexture === true ) {
|
|
146
138
|
|
|
147
|
-
node = metalnessNode.mul( this.getTexture( 'metalnessMap' ).b );
|
|
139
|
+
node = metalnessNode.mul( this.getTexture( builder, 'metalnessMap' ).b );
|
|
148
140
|
|
|
149
141
|
} else {
|
|
150
142
|
|
|
@@ -154,11 +146,11 @@ class MaterialNode extends Node {
|
|
|
154
146
|
|
|
155
147
|
} else if ( scope === MaterialNode.EMISSIVE ) {
|
|
156
148
|
|
|
157
|
-
const emissiveNode = this.getColor( 'emissive' );
|
|
149
|
+
const emissiveNode = this.getColor( builder, 'emissive' );
|
|
158
150
|
|
|
159
151
|
if ( material.emissiveMap && material.emissiveMap.isTexture === true ) {
|
|
160
152
|
|
|
161
|
-
node = emissiveNode.mul( this.getTexture( 'emissiveMap' ) );
|
|
153
|
+
node = emissiveNode.mul( this.getTexture( builder, 'emissiveMap' ) );
|
|
162
154
|
|
|
163
155
|
} else {
|
|
164
156
|
|
|
@@ -168,11 +160,11 @@ class MaterialNode extends Node {
|
|
|
168
160
|
|
|
169
161
|
} else if ( scope === MaterialNode.CLEARCOAT ) {
|
|
170
162
|
|
|
171
|
-
const clearcoatNode = this.getFloat( 'clearcoat' );
|
|
163
|
+
const clearcoatNode = this.getFloat( builder, 'clearcoat' );
|
|
172
164
|
|
|
173
165
|
if ( material.clearcoatMap && material.clearcoatMap.isTexture === true ) {
|
|
174
166
|
|
|
175
|
-
node = clearcoatNode.mul( this.getTexture( 'clearcoatMap' ).r );
|
|
167
|
+
node = clearcoatNode.mul( this.getTexture( builder, 'clearcoatMap' ).r );
|
|
176
168
|
|
|
177
169
|
} else {
|
|
178
170
|
|
|
@@ -182,11 +174,11 @@ class MaterialNode extends Node {
|
|
|
182
174
|
|
|
183
175
|
} else if ( scope === MaterialNode.CLEARCOAT_ROUGHNESS ) {
|
|
184
176
|
|
|
185
|
-
const clearcoatRoughnessNode = this.getFloat( 'clearcoatRoughness' );
|
|
177
|
+
const clearcoatRoughnessNode = this.getFloat( builder, 'clearcoatRoughness' );
|
|
186
178
|
|
|
187
179
|
if ( material.clearcoatRoughnessMap && material.clearcoatRoughnessMap.isTexture === true ) {
|
|
188
180
|
|
|
189
|
-
node = clearcoatRoughnessNode.mul( this.getTexture( 'clearcoatRoughnessMap' ).r );
|
|
181
|
+
node = clearcoatRoughnessNode.mul( this.getTexture( builder, 'clearcoatRoughnessMap' ).r );
|
|
190
182
|
|
|
191
183
|
} else {
|
|
192
184
|
|
|
@@ -196,11 +188,11 @@ class MaterialNode extends Node {
|
|
|
196
188
|
|
|
197
189
|
} else if ( scope === MaterialNode.SHEEN ) {
|
|
198
190
|
|
|
199
|
-
const sheenNode = this.getColor( 'sheenColor' ).mul( this.getFloat( 'sheen' ) ); // Move this mul() to CPU
|
|
191
|
+
const sheenNode = this.getColor( builder, 'sheenColor' ).mul( this.getFloat( builder, 'sheen' ) ); // Move this mul() to CPU
|
|
200
192
|
|
|
201
193
|
if ( material.sheenColorMap && material.sheenColorMap.isTexture === true ) {
|
|
202
194
|
|
|
203
|
-
node = sheenNode.mul( this.getTexture( 'sheenColorMap' ).rgb );
|
|
195
|
+
node = sheenNode.mul( this.getTexture( builder, 'sheenColorMap' ).rgb );
|
|
204
196
|
|
|
205
197
|
} else {
|
|
206
198
|
|
|
@@ -210,11 +202,11 @@ class MaterialNode extends Node {
|
|
|
210
202
|
|
|
211
203
|
} else if ( scope === MaterialNode.SHEEN_ROUGHNESS ) {
|
|
212
204
|
|
|
213
|
-
const sheenRoughnessNode = this.getFloat( 'sheenRoughness' );
|
|
205
|
+
const sheenRoughnessNode = this.getFloat( builder, 'sheenRoughness' );
|
|
214
206
|
|
|
215
207
|
if ( material.sheenRoughnessMap && material.sheenRoughnessMap.isTexture === true ) {
|
|
216
208
|
|
|
217
|
-
node = sheenRoughnessNode.mul( this.getTexture( 'sheenRoughnessMap' ).a );
|
|
209
|
+
node = sheenRoughnessNode.mul( this.getTexture( builder, 'sheenRoughnessMap' ).a );
|
|
218
210
|
|
|
219
211
|
} else {
|
|
220
212
|
|
|
@@ -224,9 +216,21 @@ class MaterialNode extends Node {
|
|
|
224
216
|
|
|
225
217
|
node = node.clamp( 0.07, 1.0 );
|
|
226
218
|
|
|
227
|
-
} else if ( scope === MaterialNode.
|
|
219
|
+
} else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {
|
|
220
|
+
|
|
221
|
+
const iridescenceThicknessMaximum = reference( 1, 'float', material.iridescenceThicknessRange );
|
|
222
|
+
|
|
223
|
+
if ( material.iridescenceThicknessMap ) {
|
|
228
224
|
|
|
229
|
-
|
|
225
|
+
const iridescenceThicknessMinimum = reference( 0, 'float', material.iridescenceThicknessRange );
|
|
226
|
+
|
|
227
|
+
node = iridescenceThicknessMaximum.sub( iridescenceThicknessMinimum ).mul( this.getTexture( builder, 'iridescenceThicknessMap' ).g ).add( iridescenceThicknessMinimum );
|
|
228
|
+
|
|
229
|
+
} else {
|
|
230
|
+
|
|
231
|
+
node = iridescenceThicknessMaximum;
|
|
232
|
+
|
|
233
|
+
}
|
|
230
234
|
|
|
231
235
|
} else {
|
|
232
236
|
|
|
@@ -246,7 +250,8 @@ MaterialNode.ALPHA_TEST = 'alphaTest';
|
|
|
246
250
|
MaterialNode.COLOR = 'color';
|
|
247
251
|
MaterialNode.OPACITY = 'opacity';
|
|
248
252
|
MaterialNode.SHININESS = 'shininess';
|
|
249
|
-
MaterialNode.
|
|
253
|
+
MaterialNode.SPECULAR = 'specular';
|
|
254
|
+
MaterialNode.SPECULAR_STRENGTH = 'specularStrength';
|
|
250
255
|
MaterialNode.REFLECTIVITY = 'reflectivity';
|
|
251
256
|
MaterialNode.ROUGHNESS = 'roughness';
|
|
252
257
|
MaterialNode.METALNESS = 'metalness';
|
|
@@ -256,6 +261,9 @@ MaterialNode.EMISSIVE = 'emissive';
|
|
|
256
261
|
MaterialNode.ROTATION = 'rotation';
|
|
257
262
|
MaterialNode.SHEEN = 'sheen';
|
|
258
263
|
MaterialNode.SHEEN_ROUGHNESS = 'sheenRoughness';
|
|
264
|
+
MaterialNode.IRIDESCENCE = 'iridescence';
|
|
265
|
+
MaterialNode.IRIDESCENCE_IOR = 'iridescenceIOR';
|
|
266
|
+
MaterialNode.IRIDESCENCE_THICKNESS = 'iridescenceThickness';
|
|
259
267
|
|
|
260
268
|
export default MaterialNode;
|
|
261
269
|
|
|
@@ -265,6 +273,7 @@ export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHINI
|
|
|
265
273
|
export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE );
|
|
266
274
|
export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY );
|
|
267
275
|
export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR );
|
|
276
|
+
export const materialSpecularStrength = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_STRENGTH );
|
|
268
277
|
export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY );
|
|
269
278
|
export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
|
|
270
279
|
export const materialMetalness = nodeImmutable( MaterialNode, MaterialNode.METALNESS );
|
|
@@ -273,5 +282,8 @@ export const materialClearcoatRoughness = nodeImmutable( MaterialNode, MaterialN
|
|
|
273
282
|
export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION );
|
|
274
283
|
export const materialSheen = nodeImmutable( MaterialNode, MaterialNode.SHEEN );
|
|
275
284
|
export const materialSheenRoughness = nodeImmutable( MaterialNode, MaterialNode.SHEEN_ROUGHNESS );
|
|
285
|
+
export const materialIridescence = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE );
|
|
286
|
+
export const materialIridescenceIOR = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_IOR );
|
|
287
|
+
export const materialIridescenceThickness = nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_THICKNESS );
|
|
276
288
|
|
|
277
289
|
addNodeClass( MaterialNode );
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import ReferenceNode from './ReferenceNode.js';
|
|
2
|
+
import { NodeUpdateType } from '../core/constants.js';
|
|
2
3
|
import { addNodeClass } from '../core/Node.js';
|
|
3
4
|
import { nodeObject } from '../shadernode/ShaderNode.js';
|
|
4
5
|
|
|
@@ -10,6 +11,8 @@ class MaterialReferenceNode extends ReferenceNode {
|
|
|
10
11
|
|
|
11
12
|
this.material = material;
|
|
12
13
|
|
|
14
|
+
this.updateType = NodeUpdateType.RENDER;
|
|
15
|
+
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
construct( builder ) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Node, { addNodeClass } from '../core/Node.js';
|
|
2
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
|
-
import
|
|
3
|
+
import UniformNode from '../core/UniformNode.js';
|
|
4
4
|
import { nodeProxy } from '../shadernode/ShaderNode.js';
|
|
5
5
|
|
|
6
6
|
import { Vector3 } from 'three';
|
|
@@ -16,7 +16,7 @@ class Object3DNode extends Node {
|
|
|
16
16
|
|
|
17
17
|
this.updateType = NodeUpdateType.OBJECT;
|
|
18
18
|
|
|
19
|
-
this._uniformNode =
|
|
19
|
+
this._uniformNode = new UniformNode( null );
|
|
20
20
|
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -25,6 +25,10 @@ class SceneNode extends Node {
|
|
|
25
25
|
|
|
26
26
|
output = reference( 'backgroundBlurriness', 'float', scene );
|
|
27
27
|
|
|
28
|
+
} else if ( scope === SceneNode.BACKGROUND_INTENSITY ) {
|
|
29
|
+
|
|
30
|
+
output = reference( 'backgroundIntensity', 'float', scene );
|
|
31
|
+
|
|
28
32
|
} else {
|
|
29
33
|
|
|
30
34
|
console.error( 'THREE.SceneNode: Unknown scope:', scope );
|
|
@@ -38,9 +42,11 @@ class SceneNode extends Node {
|
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
SceneNode.BACKGROUND_BLURRINESS = 'backgroundBlurriness';
|
|
45
|
+
SceneNode.BACKGROUND_INTENSITY = 'backgroundIntensity';
|
|
41
46
|
|
|
42
47
|
export default SceneNode;
|
|
43
48
|
|
|
44
49
|
export const backgroundBlurriness = nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );
|
|
50
|
+
export const backgroundIntensity = nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );
|
|
45
51
|
|
|
46
52
|
addNodeClass( SceneNode );
|
|
@@ -5,12 +5,12 @@ import { colorSpaceToLinear } from '../display/ColorSpaceNode.js';
|
|
|
5
5
|
import { context } from '../core/ContextNode.js';
|
|
6
6
|
import { expression } from '../code/ExpressionNode.js';
|
|
7
7
|
import { addNodeClass } from '../core/Node.js';
|
|
8
|
-
import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
|
|
8
|
+
import { addNodeElement, nodeProxy, vec3, nodeObject } from '../shadernode/ShaderNode.js';
|
|
9
9
|
import { NodeUpdateType } from '../core/constants.js';
|
|
10
10
|
|
|
11
11
|
class TextureNode extends UniformNode {
|
|
12
12
|
|
|
13
|
-
constructor( value, uvNode = null, levelNode = null ) {
|
|
13
|
+
constructor( value, uvNode = null, levelNode = null, compareNode = null ) {
|
|
14
14
|
|
|
15
15
|
super( value );
|
|
16
16
|
|
|
@@ -18,8 +18,12 @@ class TextureNode extends UniformNode {
|
|
|
18
18
|
|
|
19
19
|
this.uvNode = uvNode;
|
|
20
20
|
this.levelNode = levelNode;
|
|
21
|
+
this.compareNode = compareNode;
|
|
21
22
|
|
|
22
|
-
this.
|
|
23
|
+
this.updateMatrix = false;
|
|
24
|
+
this.updateType = NodeUpdateType.NONE;
|
|
25
|
+
|
|
26
|
+
this.setUpdateMatrix( uvNode === null );
|
|
23
27
|
|
|
24
28
|
}
|
|
25
29
|
|
|
@@ -45,9 +49,24 @@ class TextureNode extends UniformNode {
|
|
|
45
49
|
|
|
46
50
|
getDefaultUV() {
|
|
47
51
|
|
|
52
|
+
return uv( this.value.channel );
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
getTextureMatrix( uvNode ) {
|
|
57
|
+
|
|
48
58
|
const texture = this.value;
|
|
49
59
|
|
|
50
|
-
return uniform( texture.matrix ).mul( vec3(
|
|
60
|
+
return uniform( texture.matrix ).mul( vec3( uvNode, 1 ) ).xy;
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
setUpdateMatrix( value ) {
|
|
65
|
+
|
|
66
|
+
this.updateMatrix = value;
|
|
67
|
+
this.updateType = value ? NodeUpdateType.FRAME : NodeUpdateType.NONE;
|
|
68
|
+
|
|
69
|
+
return this;
|
|
51
70
|
|
|
52
71
|
}
|
|
53
72
|
|
|
@@ -65,7 +84,13 @@ class TextureNode extends UniformNode {
|
|
|
65
84
|
|
|
66
85
|
}
|
|
67
86
|
|
|
68
|
-
|
|
87
|
+
if ( ! uvNode ) uvNode = this.getDefaultUV();
|
|
88
|
+
|
|
89
|
+
if ( this.updateMatrix ) {
|
|
90
|
+
|
|
91
|
+
uvNode = this.getTextureMatrix( uvNode );
|
|
92
|
+
|
|
93
|
+
}
|
|
69
94
|
|
|
70
95
|
//
|
|
71
96
|
|
|
@@ -88,6 +113,7 @@ class TextureNode extends UniformNode {
|
|
|
88
113
|
|
|
89
114
|
const { uvNode, levelNode } = builder.getNodeProperties( this );
|
|
90
115
|
|
|
116
|
+
const compareNode = this.compareNode;
|
|
91
117
|
const texture = this.value;
|
|
92
118
|
|
|
93
119
|
if ( ! texture || texture.isTexture !== true ) {
|
|
@@ -128,6 +154,12 @@ class TextureNode extends UniformNode {
|
|
|
128
154
|
|
|
129
155
|
snippet = builder.getTextureLevel( texture, textureProperty, uvSnippet, levelSnippet );
|
|
130
156
|
|
|
157
|
+
} else if ( compareNode !== null ) {
|
|
158
|
+
|
|
159
|
+
const compareSnippet = compareNode.build( builder, 'float' );
|
|
160
|
+
|
|
161
|
+
snippet = builder.getTextureCompare( texture, textureProperty, uvSnippet, compareSnippet );
|
|
162
|
+
|
|
131
163
|
} else {
|
|
132
164
|
|
|
133
165
|
snippet = builder.getTexture( texture, textureProperty, uvSnippet );
|
|
@@ -136,8 +168,12 @@ class TextureNode extends UniformNode {
|
|
|
136
168
|
|
|
137
169
|
builder.addLineFlowCode( `${propertyName} = ${snippet}` );
|
|
138
170
|
|
|
139
|
-
|
|
140
|
-
|
|
171
|
+
if ( builder.context.tempWrite !== false ) {
|
|
172
|
+
|
|
173
|
+
nodeData.snippet = snippet;
|
|
174
|
+
nodeData.propertyName = propertyName;
|
|
175
|
+
|
|
176
|
+
}
|
|
141
177
|
|
|
142
178
|
}
|
|
143
179
|
|
|
@@ -160,7 +196,7 @@ class TextureNode extends UniformNode {
|
|
|
160
196
|
const textureNode = this.clone();
|
|
161
197
|
textureNode.uvNode = uvNode;
|
|
162
198
|
|
|
163
|
-
return textureNode;
|
|
199
|
+
return nodeObject( textureNode );
|
|
164
200
|
|
|
165
201
|
}
|
|
166
202
|
|
|
@@ -181,6 +217,15 @@ class TextureNode extends UniformNode {
|
|
|
181
217
|
|
|
182
218
|
}
|
|
183
219
|
|
|
220
|
+
compare( compareNode ) {
|
|
221
|
+
|
|
222
|
+
const textureNode = this.clone();
|
|
223
|
+
textureNode.compareNode = nodeObject( compareNode );
|
|
224
|
+
|
|
225
|
+
return nodeObject( textureNode );
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
184
229
|
serialize( data ) {
|
|
185
230
|
|
|
186
231
|
super.serialize( data );
|
|
@@ -211,7 +256,7 @@ class TextureNode extends UniformNode {
|
|
|
211
256
|
|
|
212
257
|
clone() {
|
|
213
258
|
|
|
214
|
-
return new this.constructor( this.value, this.uvNode, this.levelNode );
|
|
259
|
+
return new this.constructor( this.value, this.uvNode, this.levelNode, this.compareNode );
|
|
215
260
|
|
|
216
261
|
}
|
|
217
262
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { addNodeClass } from '../core/Node.js';
|
|
2
|
+
import TextureNode from './TextureNode.js';
|
|
3
|
+
import { nodeProxy } from '../shadernode/ShaderNode.js';
|
|
4
|
+
|
|
5
|
+
class TextureStoreNode extends TextureNode {
|
|
6
|
+
|
|
7
|
+
constructor( value, uvNode, storeNode = null ) {
|
|
8
|
+
|
|
9
|
+
super( value, uvNode );
|
|
10
|
+
|
|
11
|
+
this.storeNode = storeNode;
|
|
12
|
+
|
|
13
|
+
this.isStoreTextureNode = true;
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getNodeType( /*builder*/ ) {
|
|
18
|
+
|
|
19
|
+
return 'void';
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default TextureStoreNode;
|
|
26
|
+
|
|
27
|
+
export const textureStore = nodeProxy( TextureStoreNode );
|
|
28
|
+
|
|
29
|
+
addNodeClass( TextureStoreNode );
|
|
@@ -20,12 +20,12 @@ class AttributeNode extends Node {
|
|
|
20
20
|
|
|
21
21
|
getNodeType( builder ) {
|
|
22
22
|
|
|
23
|
-
const attributeName = this.getAttributeName( builder );
|
|
24
|
-
|
|
25
23
|
let nodeType = super.getNodeType( builder );
|
|
26
24
|
|
|
27
25
|
if ( nodeType === null ) {
|
|
28
26
|
|
|
27
|
+
const attributeName = this.getAttributeName( builder );
|
|
28
|
+
|
|
29
29
|
if ( builder.hasGeometryAttribute( attributeName ) ) {
|
|
30
30
|
|
|
31
31
|
const attribute = builder.geometry.getAttribute( attributeName );
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
class LightingModel {
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
init( /*input, stack, builder*/ ) { }
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
this.direct = direct;
|
|
7
|
-
this.indirectDiffuse = indirectDiffuse;
|
|
8
|
-
this.indirectSpecular = indirectSpecular;
|
|
9
|
-
this.ambientOcclusion = ambientOcclusion;
|
|
5
|
+
direct( /*input, stack, builder*/ ) { }
|
|
10
6
|
|
|
11
|
-
}
|
|
7
|
+
indirectDiffuse( /*input, stack, builder*/ ) { }
|
|
8
|
+
|
|
9
|
+
indirectSpecular( /*input, stack, builder*/ ) { }
|
|
10
|
+
|
|
11
|
+
ambientOcclusion( /*input, stack, builder*/ ) { }
|
|
12
12
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export default LightingModel;
|
|
16
|
-
|
|
17
|
-
export const lightingModel = ( ...params ) => new LightingModel( ...params );
|