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
@@ -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
- if ( lightingModelFunctionNode && lightingModelFunctionNode.direct ) {
26
-
27
- lightingModelFunctionNode.direct( {
28
- lightDirection,
29
- lightColor,
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
- const texture = envNode.value;
33
- const renderer = builder.renderer;
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
- // @TODO: Add dispose logic here
36
- const cubeRTT = builder.getCubeRenderTarget( 512 ).fromEquirectangularTexture( renderer, texture );
44
+ cacheEnvNode = cubeTexture( cubeRTT.texture );
37
45
 
38
- envNode = cubeTexture( cubeRTT.texture );
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
- let isolateClearcoatRadiance = null;
60
-
61
- if ( builder.context.clearcoatRadiance  ) {
71
+ const clearcoatRadiance = builder.context.lightingModel.clearcoatRadiance;
62
72
 
63
- const clearcoatRadiance = context( envNode, createRadianceContext( clearcoatRoughness, transformedClearcoatNormalView ) ).mul( intensity );
73
+ if ( clearcoatRadiance ) {
64
74
 
65
- isolateClearcoatRadiance = cache( clearcoatRadiance );
75
+ const clearcoatRadianceContext = context( envNode, createRadianceContext( clearcoatRoughness, transformedClearcoatNormalView ) ).mul( intensity );
76
+ const isolateClearcoatRadiance = cache( clearcoatRadianceContext );
66
77
 
67
- builder.context.clearcoatRadiance.addAssign( isolateClearcoatRadiance );
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
  }
@@ -33,7 +33,7 @@ class HemisphereLightNode extends AnalyticLightNode {
33
33
 
34
34
  }
35
35
 
36
- generate( builder ) {
36
+ construct( builder ) {
37
37
 
38
38
  const { colorNode, groundColorNode, lightDirectionNode } = this;
39
39
 
@@ -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, lightingModelNode = null, backdropNode = null, backdropAlphaNode = null ) {
9
+ constructor( node, lightingModel = null, backdropNode = null, backdropAlphaNode = null ) {
10
10
 
11
11
  super( node );
12
12
 
13
- this.lightingModelNode = lightingModelNode;
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 { lightingModelNode, backdropNode, backdropAlphaNode } = this;
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.lightingModelNode = lightingModelNode || context.lightingModelNode;
64
+ context.lightingModel = lightingModel || context.lightingModel;
65
65
 
66
66
  Object.assign( properties, reflectedLight, lighting );
67
67
  Object.assign( context, lighting );
68
68
 
69
- // @TODO: Call needed return a new node ( or rename the ShaderNodeInternal.call() function ), it's not moment to run
70
- if ( lightingModelNode && lightingModelNode.init ) lightingModelNode.init( context, builder.stack, builder );
69
+ if ( lightingModel ) {
71
70
 
72
- if ( lightingModelNode && lightingModelNode.indirectDiffuse ) lightingModelNode.indirectDiffuse( context, builder.stack, builder );
73
- if ( lightingModelNode && lightingModelNode.indirectSpecular ) lightingModelNode.indirectSpecular( context, builder.stack, builder );
74
- if ( lightingModelNode && lightingModelNode.ambientOcclusion ) lightingModelNode.ambientOcclusion( context, builder.stack, builder );
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
- if ( lightingModelFunctionNode && lightingModelFunctionNode.direct ) {
54
-
55
- lightingModelFunctionNode.direct( {
56
- lightDirection,
57
- lightColor,
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
- if ( lightingModelFunctionNode && lightingModelFunctionNode.direct ) {
75
-
76
- lightingModelFunctionNode.direct( {
77
- lightDirection,
78
- lightColor,
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 );
@@ -17,6 +17,8 @@ class MeshNormalNodeMaterial extends NodeMaterial {
17
17
 
18
18
  this.isMeshNormalNodeMaterial = true;
19
19
 
20
+ this.colorSpace = false;
21
+
20
22
  this.setDefaultValues( defaultValues );
21
23
 
22
24
  this.setValues( parameters );
@@ -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 phongLightingModel;
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 physicalLightingModel from '../functions/PhysicalLightingModel.js';
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 physicalLightingModel;
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
- this.outputNode = null;
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
- if ( this.isUnlit === false ) {
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
- builder.stack.outputNode = this.constructOutput( builder, vec4( outgoingLightNode, diffuseColor.a ) );
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
- builder.stack.outputNode = this.constructOutput( builder, this.outputNode || vec4( 0, 0, 0, 1 ) );
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 = lightsNode.lightingContext( lightingModelNode, backdropNode, backdropAlphaNode );
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 ? vec3( emissiveNode ) : materialEmissive );
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
- const renderTarget = renderer.getRenderTarget();
340
+ if ( this.colorSpace === true ) {
312
341
 
313
- let outputColorSpace;
342
+ const renderTarget = renderer.getRenderTarget();
314
343
 
315
- if ( renderTarget !== null ) {
344
+ let outputColorSpace;
316
345
 
317
- outputColorSpace = renderTarget.texture.colorSpace;
346
+ if ( renderTarget !== null ) {
318
347
 
319
- } else {
348
+ if ( Array.isArray( renderTarget.texture ) ) {
320
349
 
321
- outputColorSpace = renderer.outputColorSpace;
350
+ outputColorSpace = renderTarget.texture[ 0 ].colorSpace;
322
351
 
323
- }
352
+ } else {
324
353
 
325
- if ( outputColorSpace !== NoColorSpace ) outputNode = outputNode.linearToColorSpace( outputColorSpace );
354
+ outputColorSpace = renderTarget.texture.colorSpace;
326
355
 
327
- // FOG
356
+ }
357
+
358
+ } else {
359
+
360
+ outputColorSpace = renderer.outputColorSpace;
328
361
 
329
- const fogNode = builder.fogNode;
362
+ }
363
+
364
+ if ( outputColorSpace !== LinearSRGBColorSpace && outputColorSpace !== NoColorSpace ) {
330
365
 
331
- if ( fogNode ) outputNode = vec4( fogNode.mixAssign( outputNode.rgb ), outputNode.a );
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 );