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.
Files changed (172) hide show
  1. package/build/three.cjs +360 -160
  2. package/build/three.js +360 -160
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +355 -161
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/controls/OrbitControls.js +155 -25
  7. package/examples/jsm/csm/CSMShader.js +35 -1
  8. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  9. package/examples/jsm/exporters/USDZExporter.js +1 -0
  10. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  11. package/examples/jsm/libs/tween.module.js +790 -735
  12. package/examples/jsm/libs/utif.module.js +1644 -1558
  13. package/examples/jsm/loaders/DDSLoader.js +46 -3
  14. package/examples/jsm/loaders/EXRLoader.js +4 -4
  15. package/examples/jsm/loaders/FBXLoader.js +3 -1
  16. package/examples/jsm/loaders/GLTFLoader.js +25 -10
  17. package/examples/jsm/loaders/KTX2Loader.js +128 -79
  18. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  19. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  20. package/examples/jsm/loaders/MMDLoader.js +10 -7
  21. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  22. package/examples/jsm/loaders/PLYLoader.js +1 -1
  23. package/examples/jsm/loaders/RGBELoader.js +48 -66
  24. package/examples/jsm/loaders/STLLoader.js +7 -0
  25. package/examples/jsm/loaders/TGALoader.js +10 -10
  26. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  27. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  28. package/examples/jsm/misc/Volume.js +4 -6
  29. package/examples/jsm/nodes/Nodes.js +8 -6
  30. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +29 -3
  31. package/examples/jsm/nodes/accessors/CubeTextureNode.js +20 -3
  32. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +15 -4
  33. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  34. package/examples/jsm/nodes/accessors/LineMaterialNode.js +31 -0
  35. package/examples/jsm/nodes/accessors/MaterialNode.js +73 -61
  36. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +3 -0
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +2 -2
  38. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  39. package/examples/jsm/nodes/accessors/TextureNode.js +54 -9
  40. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  41. package/examples/jsm/nodes/core/AttributeNode.js +2 -2
  42. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  43. package/examples/jsm/nodes/core/Node.js +28 -3
  44. package/examples/jsm/nodes/core/NodeBuilder.js +94 -12
  45. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  46. package/examples/jsm/nodes/core/OutputStructNode.js +58 -0
  47. package/examples/jsm/nodes/core/PropertyNode.js +6 -0
  48. package/examples/jsm/nodes/core/StackNode.js +4 -4
  49. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  51. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  52. package/examples/jsm/nodes/display/ViewportNode.js +19 -5
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  54. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  55. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  56. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  57. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  58. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  59. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  61. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  62. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  63. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  65. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  66. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  67. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  68. package/examples/jsm/nodes/materials/Materials.js +2 -0
  69. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  70. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  71. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  72. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  73. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  74. package/examples/jsm/nodes/materials/NodeMaterial.js +61 -26
  75. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  76. package/examples/jsm/nodes/math/HashNode.js +35 -0
  77. package/examples/jsm/nodes/shadernode/ShaderNode.js +6 -2
  78. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  79. package/examples/jsm/objects/Reflector.js +1 -9
  80. package/examples/jsm/objects/Refractor.js +0 -8
  81. package/examples/jsm/offscreen/scene.js +0 -1
  82. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  83. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  84. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  85. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  86. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  87. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  88. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  89. package/examples/jsm/renderers/common/Backend.js +11 -8
  90. package/examples/jsm/renderers/common/Background.js +22 -20
  91. package/examples/jsm/renderers/common/Binding.js +14 -0
  92. package/examples/jsm/renderers/common/Bindings.js +7 -10
  93. package/examples/jsm/renderers/common/Geometries.js +1 -1
  94. package/examples/jsm/renderers/common/Pipelines.js +96 -47
  95. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  96. package/examples/jsm/renderers/common/RenderContexts.js +41 -5
  97. package/examples/jsm/renderers/common/RenderList.js +12 -4
  98. package/examples/jsm/renderers/common/RenderObject.js +26 -6
  99. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  100. package/examples/jsm/renderers/common/Renderer.js +82 -42
  101. package/examples/jsm/renderers/common/SampledTexture.js +2 -1
  102. package/examples/jsm/renderers/common/Sampler.js +1 -1
  103. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  104. package/examples/jsm/renderers/common/Textures.js +172 -20
  105. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +2 -2
  106. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -1
  107. package/examples/jsm/renderers/common/nodes/Nodes.js +58 -13
  108. package/examples/jsm/renderers/webgl/WebGLBackend.js +607 -0
  109. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +118 -17
  110. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  111. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  113. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +199 -0
  114. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  115. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  116. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +1 -1
  117. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +320 -84
  118. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  119. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +120 -66
  120. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  121. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  122. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +96 -5
  123. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  124. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +117 -139
  125. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +60 -142
  126. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +7 -6
  127. package/examples/jsm/shaders/FilmShader.js +11 -54
  128. package/examples/jsm/shaders/OutputShader.js +19 -2
  129. package/examples/jsm/shaders/SAOShader.js +0 -13
  130. package/examples/jsm/shaders/SSAOShader.js +33 -26
  131. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  132. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  133. package/package.json +2 -2
  134. package/src/Three.js +3 -0
  135. package/src/animation/PropertyBinding.js +1 -1
  136. package/src/audio/Audio.js +6 -0
  137. package/src/cameras/CubeCamera.js +1 -4
  138. package/src/constants.js +4 -1
  139. package/src/core/BufferAttribute.js +20 -0
  140. package/src/core/Object3D.js +2 -15
  141. package/src/core/RenderTarget.js +122 -0
  142. package/src/core/UniformsGroup.js +2 -2
  143. package/src/geometries/CapsuleGeometry.js +1 -1
  144. package/src/loaders/DataTextureLoader.js +19 -2
  145. package/src/materials/Material.js +2 -2
  146. package/src/math/Vector2.js +2 -2
  147. package/src/math/Vector3.js +3 -3
  148. package/src/math/Vector4.js +4 -4
  149. package/src/objects/Line.js +1 -1
  150. package/src/objects/Mesh.js +1 -1
  151. package/src/objects/Points.js +1 -1
  152. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  153. package/src/renderers/WebGLRenderTarget.js +3 -110
  154. package/src/renderers/WebGLRenderer.js +83 -57
  155. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  156. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  157. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  158. package/src/renderers/webgl/WebGLBackground.js +5 -14
  159. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  160. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  161. package/src/renderers/webgl/WebGLProgram.js +2 -0
  162. package/src/renderers/webgl/WebGLPrograms.js +19 -3
  163. package/src/renderers/webgl/WebGLTextures.js +101 -16
  164. package/src/renderers/webgl/WebGLUtils.js +27 -20
  165. package/src/textures/CompressedCubeTexture.js +19 -0
  166. package/src/textures/Texture.js +2 -2
  167. package/src/utils.js +9 -1
  168. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  169. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  170. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
  171. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
  172. /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
- node = material.normalMap ? normalMap( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
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 instaceAttribute = instanceMesh.instanceMatrix;
28
- const array = instaceAttribute.array;
27
+ const instanceAttribute = instanceMesh.instanceMatrix;
28
+ const buffer = new InstancedInterleavedBuffer( instanceAttribute.array, 16, 1 );
29
29
 
30
- const bufferFn = instaceAttribute.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
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( array, 'vec4', 16, 0 ),
35
- bufferFn( array, 'vec4', 16, 4 ),
36
- bufferFn( array, 'vec4', 16, 8 ),
37
- bufferFn( array, 'vec4', 16, 12 )
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
- getNodeType( builder ) {
18
+ getCache( builder, property, type ) {
16
19
 
17
- const scope = this.scope;
18
20
  const material = builder.context.material;
19
21
 
20
- if ( scope === MaterialNode.COLOR ) {
22
+ let cacheMaterial = cache.get( material );
21
23
 
22
- return material.map !== null ? 'vec4' : 'vec3';
24
+ if ( cacheMaterial === undefined ) {
23
25
 
24
- } else if ( scope === MaterialNode.OPACITY || scope === MaterialNode.ROTATION ) {
26
+ cacheMaterial = {};
25
27
 
26
- return 'float';
28
+ cache.set( material, cacheMaterial );
29
+
30
+ }
27
31
 
28
- } else if ( scope === MaterialNode.EMISSIVE || scope === MaterialNode.SHEEN ) {
32
+ let node = cacheMaterial[ property ];
29
33
 
30
- return 'vec3';
34
+ if ( node === undefined ) {
31
35
 
32
- } else if ( scope === MaterialNode.ROUGHNESS || scope === MaterialNode.METALNESS || scope === MaterialNode.SPECULAR || scope === MaterialNode.SHININESS || scope === MaterialNode.CLEARCOAT_ROUGHNESS || scope === MaterialNode.SHEEN_ROUGHNESS ) {
36
+ node = materialReference( property, type );
33
37
 
34
- return 'float';
38
+ cacheMaterial[ property ] = node;
35
39
 
36
40
  }
37
41
 
38
- }
42
+ return node;
39
43
 
40
- getFloat( property ) {
44
+ }
41
45
 
42
- //@TODO: Check if it can be cached by property name.
46
+ getFloat( builder, property ) {
43
47
 
44
- return materialReference( property, 'float' );
48
+ return this.getCache( builder, property, 'float' );
45
49
 
46
50
  }
47
51
 
48
- getColor( property ) {
52
+ getColor( builder, property ) {
49
53
 
50
- //@TODO: Check if it can be cached by property name.
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
- const textureRefNode = materialReference( property, 'texture' );
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( 'alphaTest' );
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.SHININESS ) {
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 = reflectivityNode.mul( this.getTexture( 'specularMap' ).r );
111
+ node = this.getTexture( builder, 'specularMap' ).r;
120
112
 
121
113
  } else {
122
114
 
123
- node = reflectivityNode;
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.ROTATION ) {
219
+ } else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {
220
+
221
+ const iridescenceThicknessMaximum = reference( 1, 'float', material.iridescenceThicknessRange );
222
+
223
+ if ( material.iridescenceThicknessMap ) {
228
224
 
229
- node = this.getFloat( 'rotation' );
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.SPECULAR_COLOR = 'specularColor';
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 { uniform } from '../core/UniformNode.js';
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 = uniform( null );
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.updateType = NodeUpdateType.FRAME;
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( uv( texture.channel ), 1 ) );
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
- uvNode || ( uvNode = this.getDefaultUV() );
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
- nodeData.snippet = snippet;
140
- nodeData.propertyName = propertyName;
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
- constructor( init = null, direct = null, indirectDiffuse = null, indirectSpecular = null, ambientOcclusion = null ) {
3
+ init( /*input, stack, builder*/ ) { }
4
4
 
5
- this.init = init;
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 );