super-three 0.162.0 → 0.164.0

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