super-three 0.160.1 → 0.162.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 (225) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +867 -499
  3. package/build/three.module.js +867 -496
  4. package/build/three.module.min.js +1 -1
  5. package/examples/jsm/Addons.js +5 -1
  6. package/examples/jsm/capabilities/WebGPU.js +13 -9
  7. package/examples/jsm/controls/DragControls.js +91 -30
  8. package/examples/jsm/controls/OrbitControls.js +130 -15
  9. package/examples/jsm/controls/TransformControls.js +6 -6
  10. package/examples/jsm/curves/NURBSUtils.js +59 -4
  11. package/examples/jsm/curves/NURBSVolume.js +62 -0
  12. package/examples/jsm/exporters/GLTFExporter.js +11 -1
  13. package/examples/jsm/exporters/USDZExporter.js +8 -7
  14. package/examples/jsm/helpers/TextureHelper.js +3 -3
  15. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  16. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  17. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  18. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  19. package/examples/jsm/libs/tween.module.js +32 -14
  20. package/examples/jsm/loaders/3DMLoader.js +57 -64
  21. package/examples/jsm/loaders/DDSLoader.js +1 -0
  22. package/examples/jsm/loaders/KTX2Loader.js +20 -5
  23. package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
  24. package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
  25. package/examples/jsm/loaders/LUTImageLoader.js +3 -2
  26. package/examples/jsm/loaders/MaterialXLoader.js +115 -16
  27. package/examples/jsm/loaders/SVGLoader.js +4 -3
  28. package/examples/jsm/loaders/VOXLoader.js +9 -2
  29. package/examples/jsm/loaders/VRMLLoader.js +7 -3
  30. package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
  31. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  32. package/examples/jsm/misc/Timer.js +13 -4
  33. package/examples/jsm/nodes/Nodes.js +24 -11
  34. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  35. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
  36. package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
  37. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  38. package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
  39. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  41. package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
  42. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +45 -0
  45. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  46. package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
  48. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  49. package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
  50. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  51. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  52. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  53. package/examples/jsm/nodes/core/Node.js +14 -4
  54. package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
  55. package/examples/jsm/nodes/core/NodeFrame.js +18 -10
  56. package/examples/jsm/nodes/core/TempNode.js +1 -1
  57. package/examples/jsm/nodes/core/constants.js +1 -0
  58. package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
  59. package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
  60. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  61. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
  62. package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
  63. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  64. package/examples/jsm/nodes/display/PassNode.js +3 -2
  65. package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
  66. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
  67. package/examples/jsm/nodes/display/ViewportNode.js +0 -2
  68. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
  69. package/examples/jsm/nodes/fog/FogNode.js +2 -1
  70. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  71. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
  72. package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
  73. package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
  74. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
  75. package/examples/jsm/nodes/materials/Materials.js +1 -0
  76. package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
  77. package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
  78. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
  79. package/examples/jsm/nodes/math/CondNode.js +42 -7
  80. package/examples/jsm/nodes/math/MathNode.js +32 -2
  81. package/examples/jsm/nodes/math/MathUtils.js +15 -0
  82. package/examples/jsm/nodes/math/OperatorNode.js +13 -5
  83. package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
  84. package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
  85. package/examples/jsm/nodes/utils/JoinNode.js +2 -2
  86. package/examples/jsm/nodes/utils/LoopNode.js +5 -3
  87. package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
  88. package/examples/jsm/nodes/utils/RotateNode.js +68 -0
  89. package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
  90. package/examples/jsm/nodes/utils/SplitNode.js +4 -4
  91. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  92. package/examples/jsm/objects/GroundedSkybox.js +50 -0
  93. package/examples/jsm/objects/QuadMesh.js +8 -2
  94. package/examples/jsm/objects/Water2.js +8 -8
  95. package/examples/jsm/postprocessing/GTAOPass.js +11 -1
  96. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  97. package/examples/jsm/renderers/common/Backend.js +14 -0
  98. package/examples/jsm/renderers/common/Background.js +2 -2
  99. package/examples/jsm/renderers/common/Bindings.js +1 -1
  100. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  101. package/examples/jsm/renderers/common/DataMap.js +1 -1
  102. package/examples/jsm/renderers/common/Info.js +25 -1
  103. package/examples/jsm/renderers/common/Pipelines.js +8 -8
  104. package/examples/jsm/renderers/common/PostProcessing.js +2 -2
  105. package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
  106. package/examples/jsm/renderers/common/RenderContext.js +2 -0
  107. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  108. package/examples/jsm/renderers/common/RenderObject.js +46 -1
  109. package/examples/jsm/renderers/common/RenderObjects.js +3 -1
  110. package/examples/jsm/renderers/common/Renderer.js +290 -17
  111. package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
  112. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  113. package/examples/jsm/renderers/common/Textures.js +28 -18
  114. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  115. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
  116. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  117. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  118. package/examples/jsm/renderers/common/nodes/Nodes.js +5 -2
  119. package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
  120. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
  121. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
  122. package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
  123. package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
  124. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
  125. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
  126. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
  127. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
  128. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
  129. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
  130. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
  131. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
  132. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
  133. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
  134. package/examples/jsm/shaders/OutputShader.js +4 -0
  135. package/examples/jsm/transpiler/AST.js +1 -1
  136. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  137. package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
  138. package/examples/jsm/transpiler/TSLEncoder.js +1 -1
  139. package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
  140. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  141. package/examples/jsm/utils/SortUtils.js +2 -0
  142. package/examples/jsm/webxr/ARButton.js +12 -2
  143. package/examples/jsm/webxr/VRButton.js +25 -7
  144. package/examples/jsm/webxr/XRButton.js +12 -3
  145. package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
  146. package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
  147. package/package.json +5 -4
  148. package/src/Three.Legacy.js +20 -0
  149. package/src/Three.js +0 -1
  150. package/src/audio/Audio.js +1 -3
  151. package/src/cameras/PerspectiveCamera.js +35 -0
  152. package/src/constants.js +2 -6
  153. package/src/core/BufferAttribute.js +2 -12
  154. package/src/core/BufferGeometry.js +23 -29
  155. package/src/core/InterleavedBuffer.js +2 -1
  156. package/src/core/InterleavedBufferAttribute.js +20 -0
  157. package/src/core/Object3D.js +11 -0
  158. package/src/core/Raycaster.js +18 -4
  159. package/src/core/RenderTarget.js +44 -21
  160. package/src/extras/PMREMGenerator.js +2 -0
  161. package/src/extras/curves/EllipseCurve.js +2 -2
  162. package/src/helpers/SpotLightHelper.js +18 -1
  163. package/src/loaders/DataTextureLoader.js +0 -4
  164. package/src/loaders/MaterialLoader.js +1 -0
  165. package/src/loaders/ObjectLoader.js +2 -1
  166. package/src/materials/Material.js +2 -1
  167. package/src/materials/MeshBasicMaterial.js +3 -0
  168. package/src/materials/MeshLambertMaterial.js +3 -0
  169. package/src/materials/MeshPhongMaterial.js +3 -0
  170. package/src/materials/MeshStandardMaterial.js +3 -0
  171. package/src/materials/ShaderMaterial.js +2 -1
  172. package/src/math/Quaternion.js +13 -12
  173. package/src/math/Triangle.js +0 -30
  174. package/src/math/Vector3.js +7 -7
  175. package/src/objects/BatchedMesh.js +6 -7
  176. package/src/objects/InstancedMesh.js +53 -0
  177. package/src/objects/Mesh.js +0 -1
  178. package/src/objects/SkinnedMesh.js +0 -8
  179. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  180. package/src/renderers/WebGLRenderer.js +20 -23
  181. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
  182. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
  183. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  184. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  185. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  186. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  187. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  188. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  189. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +38 -7
  190. package/src/renderers/shaders/ShaderChunk.js +2 -0
  191. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  192. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -2
  193. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
  194. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
  195. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
  196. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  197. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
  198. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
  199. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  200. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
  201. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
  202. package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
  203. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  204. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderLib.js +2 -1
  206. package/src/renderers/shaders/UniformsLib.js +1 -0
  207. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  208. package/src/renderers/webgl/WebGLBackground.js +18 -0
  209. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  210. package/src/renderers/webgl/WebGLMaterials.js +24 -1
  211. package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
  212. package/src/renderers/webgl/WebGLProgram.js +42 -4
  213. package/src/renderers/webgl/WebGLPrograms.js +38 -27
  214. package/src/renderers/webgl/WebGLState.js +11 -21
  215. package/src/renderers/webgl/WebGLTextures.js +170 -66
  216. package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
  217. package/src/renderers/webxr/WebXRManager.js +46 -0
  218. package/src/scenes/Scene.js +8 -0
  219. package/src/textures/Source.js +1 -0
  220. package/src/textures/Texture.js +1 -29
  221. package/build/three.js +0 -54519
  222. package/build/three.min.js +0 -7
  223. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  224. package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
  225. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -1,20 +1,24 @@
1
1
  import TempNode from '../core/TempNode.js';
2
- import { nodeObject, addNodeElement, tslFn, float, vec2, vec3, vec4 } from '../shadernode/ShaderNode.js';
2
+ import { nodeObject, addNodeElement, tslFn, float, vec2, vec4 } from '../shadernode/ShaderNode.js';
3
3
  import { NodeUpdateType } from '../core/constants.js';
4
4
  import { mul } from '../math/OperatorNode.js';
5
5
  import { uv } from '../accessors/UVNode.js';
6
- import { texture } from '../accessors/TextureNode.js';
6
+ import { texturePass } from './PassNode.js';
7
7
  import { uniform } from '../core/UniformNode.js';
8
8
  import { Vector2, RenderTarget } from 'three';
9
9
  import QuadMesh from '../../objects/QuadMesh.js';
10
10
 
11
- const quadMesh = new QuadMesh();
11
+ // WebGPU: The use of a single QuadMesh for both gaussian blur passes results in a single RenderObject with a SampledTexture binding that
12
+ // alternates between source textures and triggers creation of new BindGroups and BindGroupLayouts every frame.
13
+
14
+ const quadMesh1 = new QuadMesh();
15
+ const quadMesh2 = new QuadMesh();
12
16
 
13
17
  class GaussianBlurNode extends TempNode {
14
18
 
15
19
  constructor( textureNode, sigma = 2 ) {
16
20
 
17
- super( textureNode );
21
+ super( 'vec4' );
18
22
 
19
23
  this.textureNode = textureNode;
20
24
  this.sigma = sigma;
@@ -25,7 +29,11 @@ class GaussianBlurNode extends TempNode {
25
29
  this._passDirection = uniform( new Vector2() );
26
30
 
27
31
  this._horizontalRT = new RenderTarget();
32
+ this._horizontalRT.texture.name = 'GaussianBlurNode.horizontal';
28
33
  this._verticalRT = new RenderTarget();
34
+ this._verticalRT.texture.name = 'GaussianBlurNode.vertical';
35
+
36
+ this._textureNode = texturePass( this, this._verticalRT.texture );
29
37
 
30
38
  this.updateBeforeType = NodeUpdateType.RENDER;
31
39
 
@@ -54,17 +62,23 @@ class GaussianBlurNode extends TempNode {
54
62
  const currentRenderTarget = renderer.getRenderTarget();
55
63
  const currentTexture = textureNode.value;
56
64
 
57
- quadMesh.material = this._material;
65
+ quadMesh1.material = this._material;
66
+ quadMesh2.material = this._material;
58
67
 
59
68
  this.setSize( map.image.width, map.image.height );
60
69
 
70
+ const textureType = map.type;
71
+
72
+ this._horizontalRT.texture.type = textureType;
73
+ this._verticalRT.texture.type = textureType;
74
+
61
75
  // horizontal
62
76
 
63
77
  renderer.setRenderTarget( this._horizontalRT );
64
78
 
65
79
  this._passDirection.value.set( 1, 0 );
66
80
 
67
- quadMesh.render( renderer );
81
+ quadMesh1.render( renderer );
68
82
 
69
83
  // vertical
70
84
 
@@ -73,7 +87,7 @@ class GaussianBlurNode extends TempNode {
73
87
 
74
88
  this._passDirection.value.set( 0, 1 );
75
89
 
76
- quadMesh.render( renderer );
90
+ quadMesh2.render( renderer );
77
91
 
78
92
  // restore
79
93
 
@@ -82,6 +96,12 @@ class GaussianBlurNode extends TempNode {
82
96
 
83
97
  }
84
98
 
99
+ getTextureNode() {
100
+
101
+ return this._textureNode;
102
+
103
+ }
104
+
85
105
  setup( builder ) {
86
106
 
87
107
  const textureNode = this.textureNode;
@@ -109,7 +129,7 @@ class GaussianBlurNode extends TempNode {
109
129
  const direction = vec2( this.directionNode ).mul( this._passDirection );
110
130
 
111
131
  const weightSum = float( gaussianCoefficients[ 0 ] ).toVar();
112
- const diffuseSum = vec3( sampleTexture( uvNode ).mul( weightSum ) ).toVar();
132
+ const diffuseSum = vec4( sampleTexture( uvNode ).mul( weightSum ) ).toVar();
113
133
 
114
134
  for ( let i = 1; i < kernelSize; i ++ ) {
115
135
 
@@ -118,21 +138,21 @@ class GaussianBlurNode extends TempNode {
118
138
 
119
139
  const uvOffset = vec2( direction.mul( invSize.mul( x ) ) ).toVar();
120
140
 
121
- const sample1 = vec3( sampleTexture( uvNode.add( uvOffset ) ) );
122
- const sample2 = vec3( sampleTexture( uvNode.sub( uvOffset ) ) );
141
+ const sample1 = vec4( sampleTexture( uvNode.add( uvOffset ) ) );
142
+ const sample2 = vec4( sampleTexture( uvNode.sub( uvOffset ) ) );
123
143
 
124
144
  diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
125
145
  weightSum.addAssign( mul( 2.0, w ) );
126
146
 
127
147
  }
128
148
 
129
- return vec4( diffuseSum.div( weightSum ), 1.0 );
149
+ return diffuseSum.div( weightSum );
130
150
 
131
151
  } );
132
152
 
133
153
  //
134
154
 
135
- const material = this._material || ( this._material = builder.createNodeMaterial( 'MeshBasicNodeMaterial' ) );
155
+ const material = this._material || ( this._material = builder.createNodeMaterial() );
136
156
  material.fragmentNode = blur();
137
157
 
138
158
  //
@@ -142,7 +162,7 @@ class GaussianBlurNode extends TempNode {
142
162
 
143
163
  //
144
164
 
145
- return texture( this._verticalRT.texture );
165
+ return this._textureNode;
146
166
 
147
167
  }
148
168
 
@@ -1,14 +1,14 @@
1
1
  import TempNode from '../core/TempNode.js';
2
2
  import { add } from '../math/OperatorNode.js';
3
- import { bitangentView } from '../accessors/BitangentNode.js';
3
+
4
4
  import { modelNormalMatrix } from '../accessors/ModelNode.js';
5
5
  import { normalView } from '../accessors/NormalNode.js';
6
6
  import { positionView } from '../accessors/PositionNode.js';
7
- import { tangentView } from '../accessors/TangentNode.js';
7
+ import { TBNViewMatrix } from '../accessors/AccessorsUtils.js';
8
8
  import { uv } from '../accessors/UVNode.js';
9
9
  import { faceDirection } from './FrontFacingNode.js';
10
10
  import { addNodeClass } from '../core/Node.js';
11
- import { addNodeElement, tslFn, nodeProxy, vec3, mat3 } from '../shadernode/ShaderNode.js';
11
+ import { addNodeElement, tslFn, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
12
12
 
13
13
  import { TangentSpaceNormalMap, ObjectSpaceNormalMap } from 'three';
14
14
 
@@ -101,8 +101,6 @@ export default NormalMapNode;
101
101
 
102
102
  export const normalMap = nodeProxy( NormalMapNode );
103
103
 
104
- export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView );
105
-
106
104
  addNodeElement( 'normalMap', normalMap );
107
105
 
108
106
  addNodeClass( 'NormalMapNode', NormalMapNode );
@@ -5,7 +5,7 @@ import { NodeUpdateType } from '../core/constants.js';
5
5
  import { nodeObject } from '../shadernode/ShaderNode.js';
6
6
  import { uniform } from '../core/UniformNode.js';
7
7
  import { viewZToOrthographicDepth, perspectiveDepthToViewZ } from './ViewportDepthNode.js';
8
- import { RenderTarget, Vector2, HalfFloatType, DepthTexture, FloatType, NoToneMapping } from 'three';
8
+ import { RenderTarget, Vector2, HalfFloatType, DepthTexture, NoToneMapping/*, FloatType*/ } from 'three';
9
9
 
10
10
  class PassTextureNode extends TextureNode {
11
11
 
@@ -51,7 +51,7 @@ class PassNode extends TempNode {
51
51
 
52
52
  const depthTexture = new DepthTexture();
53
53
  depthTexture.isRenderTargetTexture = true;
54
- depthTexture.type = FloatType;
54
+ //depthTexture.type = FloatType;
55
55
  depthTexture.name = 'PostProcessingDepth';
56
56
 
57
57
  const renderTarget = new RenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );
@@ -177,6 +177,7 @@ PassNode.DEPTH = 'depth';
177
177
  export default PassNode;
178
178
 
179
179
  export const pass = ( scene, camera ) => nodeObject( new PassNode( PassNode.COLOR, scene, camera ) );
180
+ export const texturePass = ( pass, texture ) => nodeObject( new PassTextureNode( pass, texture ) );
180
181
  export const depthPass = ( scene, camera ) => nodeObject( new PassNode( PassNode.DEPTH, scene, camera ) );
181
182
 
182
183
  addNodeClass( 'PassNode', PassNode );
@@ -1,8 +1,10 @@
1
1
  import TempNode from '../core/TempNode.js';
2
2
  import { addNodeClass } from '../core/Node.js';
3
- import { tslFn, nodeObject, float, mat3 } from '../shadernode/ShaderNode.js';
3
+ import { tslFn, nodeObject, float, mat3, vec3 } from '../shadernode/ShaderNode.js';
4
4
 
5
- import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping } from 'three';
5
+ import { NoToneMapping, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping } from 'three';
6
+ import { clamp, log2, max, pow } from '../math/MathNode.js';
7
+ import { mul } from '../math/OperatorNode.js';
6
8
 
7
9
  // exposure only
8
10
  const LinearToneMappingNode = tslFn( ( { color, exposure } ) => {
@@ -75,11 +77,52 @@ const ACESFilmicToneMappingNode = tslFn( ( { color, exposure } ) => {
75
77
 
76
78
  } );
77
79
 
80
+
81
+
82
+ const LINEAR_REC2020_TO_LINEAR_SRGB = mat3( vec3( 1.6605, - 0.1246, - 0.0182 ), vec3( - 0.5876, 1.1329, - 0.1006 ), vec3( - 0.0728, - 0.0083, 1.1187 ) );
83
+ const LINEAR_SRGB_TO_LINEAR_REC2020 = mat3( vec3( 0.6274, 0.0691, 0.0164 ), vec3( 0.3293, 0.9195, 0.0880 ), vec3( 0.0433, 0.0113, 0.8956 ) );
84
+
85
+ const agxDefaultContrastApprox = tslFn( ( [ x_immutable ] ) => {
86
+
87
+ const x = vec3( x_immutable ).toVar();
88
+ const x2 = vec3( x.mul( x ) ).toVar();
89
+ const x4 = vec3( x2.mul( x2 ) ).toVar();
90
+
91
+ return float( 15.5 ).mul( x4.mul( x2 ) ).sub( mul( 40.14, x4.mul( x ) ) ).add( mul( 31.96, x4 ).sub( mul( 6.868, x2.mul( x ) ) ).add( mul( 0.4298, x2 ).add( mul( 0.1191, x ).sub( 0.00232 ) ) ) );
92
+
93
+ } );
94
+
95
+ const AGXToneMappingNode = tslFn( ( { color, exposure } ) => {
96
+
97
+ const colortone = vec3( color ).toVar();
98
+ const AgXInsetMatrix = mat3( vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) );
99
+ const AgXOutsetMatrix = mat3( vec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ), vec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ), vec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 ) );
100
+ const AgxMinEv = float( - 12.47393 );
101
+ const AgxMaxEv = float( 4.026069 );
102
+ colortone.mulAssign( exposure );
103
+ colortone.assign( LINEAR_SRGB_TO_LINEAR_REC2020.mul( colortone ) );
104
+ colortone.assign( AgXInsetMatrix.mul( colortone ) );
105
+ colortone.assign( max( colortone, 1e-10 ) );
106
+ colortone.assign( log2( colortone ) );
107
+ colortone.assign( colortone.sub( AgxMinEv ).div( AgxMaxEv.sub( AgxMinEv ) ) );
108
+ colortone.assign( clamp( colortone, 0.0, 1.0 ) );
109
+ colortone.assign( agxDefaultContrastApprox( colortone ) );
110
+ colortone.assign( AgXOutsetMatrix.mul( colortone ) );
111
+ colortone.assign( pow( max( vec3( 0.0 ), colortone ), vec3( 2.2 ) ) );
112
+ colortone.assign( LINEAR_REC2020_TO_LINEAR_SRGB.mul( colortone ) );
113
+ colortone.assign( clamp( colortone, 0.0, 1.0 ) );
114
+
115
+ return colortone;
116
+
117
+ } );
118
+
119
+
78
120
  const toneMappingLib = {
79
121
  [ LinearToneMapping ]: LinearToneMappingNode,
80
122
  [ ReinhardToneMapping ]: ReinhardToneMappingNode,
81
123
  [ CineonToneMapping ]: OptimizedCineonToneMappingNode,
82
- [ ACESFilmicToneMapping ]: ACESFilmicToneMappingNode
124
+ [ ACESFilmicToneMapping ]: ACESFilmicToneMappingNode,
125
+ [ AgXToneMapping ]: AGXToneMappingNode
83
126
  };
84
127
 
85
128
  class ToneMappingNode extends TempNode {
@@ -2,7 +2,7 @@ import ViewportTextureNode from './ViewportTextureNode.js';
2
2
  import { addNodeClass } from '../core/Node.js';
3
3
  import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
4
  import { viewportTopLeft } from './ViewportNode.js';
5
- import { DepthTexture, NearestMipmapNearestFilter, DepthFormat, UnsignedIntType } from 'three';
5
+ import { DepthTexture } from 'three';
6
6
 
7
7
  let sharedDepthbuffer = null;
8
8
 
@@ -13,9 +13,6 @@ class ViewportDepthTextureNode extends ViewportTextureNode {
13
13
  if ( sharedDepthbuffer === null ) {
14
14
 
15
15
  sharedDepthbuffer = new DepthTexture();
16
- sharedDepthbuffer.minFilter = NearestMipmapNearestFilter;
17
- sharedDepthbuffer.type = UnsignedIntType;
18
- sharedDepthbuffer.format = DepthFormat;
19
16
 
20
17
  }
21
18
 
@@ -59,8 +59,6 @@ class ViewportNode extends Node {
59
59
 
60
60
  const scope = this.scope;
61
61
 
62
- if ( scope === ViewportNode.COORDINATE ) return;
63
-
64
62
  let output = null;
65
63
 
66
64
  if ( scope === ViewportNode.RESOLUTION ) {
@@ -4,19 +4,19 @@ import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
4
  import { viewportTopLeft } from './ViewportNode.js';
5
5
  import { FramebufferTexture } from 'three';
6
6
 
7
- let sharedFramebuffer = null;
7
+ let _sharedFramebuffer = null;
8
8
 
9
9
  class ViewportSharedTextureNode extends ViewportTextureNode {
10
10
 
11
11
  constructor( uvNode = viewportTopLeft, levelNode = null ) {
12
12
 
13
- if ( sharedFramebuffer === null ) {
13
+ if ( _sharedFramebuffer === null ) {
14
14
 
15
- sharedFramebuffer = new FramebufferTexture();
15
+ _sharedFramebuffer = new FramebufferTexture();
16
16
 
17
17
  }
18
18
 
19
- super( uvNode, levelNode, sharedFramebuffer );
19
+ super( uvNode, levelNode, _sharedFramebuffer );
20
20
 
21
21
  }
22
22
 
@@ -1,4 +1,5 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
+ import { mix } from '../math/MathNode.js';
2
3
  import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
3
4
 
4
5
  class FogNode extends Node {
@@ -16,7 +17,7 @@ class FogNode extends Node {
16
17
 
17
18
  mixAssign( outputNode ) {
18
19
 
19
- return this.mix( outputNode, this.colorNode );
20
+ return mix( outputNode, this.colorNode, this );
20
21
 
21
22
  }
22
23
 
@@ -14,7 +14,7 @@ class AmbientLightNode extends AnalyticLightNode {
14
14
 
15
15
  setup( { context } ) {
16
16
 
17
- context.irradiance.addAssign(this.colorNode );
17
+ context.irradiance.addAssign( this.colorNode );
18
18
 
19
19
  }
20
20
 
@@ -2,7 +2,7 @@ import LightingNode from './LightingNode.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { addNodeClass } from '../core/Node.js';
5
- import { /*vec2,*/ vec3 } from '../shadernode/ShaderNode.js';
5
+ import { /*vec2,*/ vec3, vec4 } from '../shadernode/ShaderNode.js';
6
6
  import { reference } from '../accessors/ReferenceNode.js';
7
7
  import { texture } from '../accessors/TextureNode.js';
8
8
  import { positionWorld } from '../accessors/PositionNode.js';
@@ -12,7 +12,7 @@ import { WebGPUCoordinateSystem } from 'three';
12
12
 
13
13
  import { Color, DepthTexture, NearestFilter, LessCompare } from 'three';
14
14
 
15
- let depthMaterial = null;
15
+ let overrideMaterial = null;
16
16
 
17
17
  class AnalyticLightNode extends LightingNode {
18
18
 
@@ -54,7 +54,13 @@ class AnalyticLightNode extends LightingNode {
54
54
 
55
55
  if ( shadowNode === null ) {
56
56
 
57
- if ( depthMaterial === null ) depthMaterial = builder.createNodeMaterial( 'MeshBasicNodeMaterial' );
57
+ if ( overrideMaterial === null ) {
58
+
59
+ overrideMaterial = builder.createNodeMaterial();
60
+ overrideMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
61
+ overrideMaterial.isShadowNodeMaterial = true; // Use to avoid other overrideMaterial override material.fragmentNode unintentionally when using material.shadowNode
62
+
63
+ }
58
64
 
59
65
  const shadow = this.light.shadow;
60
66
  const rtt = builder.getRenderTarget( shadow.mapSize.width, shadow.mapSize.height );
@@ -142,8 +148,10 @@ class AnalyticLightNode extends LightingNode {
142
148
  */
143
149
  //
144
150
 
151
+ const shadowColor = texture( rtt.texture, shadowCoord );
152
+
145
153
  this.rtt = rtt;
146
- this.colorNode = this.colorNode.mul( frustumTest.mix( 1, shadowNode ) );
154
+ this.colorNode = this.colorNode.mul( frustumTest.mix( 1, shadowNode.mix( shadowColor.a.mix( 1, shadowColor ), 1 ) ) );
147
155
 
148
156
  this.shadowNode = shadowNode;
149
157
 
@@ -169,7 +177,7 @@ class AnalyticLightNode extends LightingNode {
169
177
 
170
178
  const currentOverrideMaterial = scene.overrideMaterial;
171
179
 
172
- scene.overrideMaterial = depthMaterial;
180
+ scene.overrideMaterial = overrideMaterial;
173
181
 
174
182
  rtt.setSize( light.shadow.mapSize.width, light.shadow.mapSize.height );
175
183
 
@@ -39,7 +39,7 @@ class LightingContextNode extends ContextNode {
39
39
  ambientOcclusion: float( 1 ).temp( 'ambientOcclusion' ),
40
40
  reflectedLight,
41
41
  backdrop: backdropNode,
42
- backdropAlpha : backdropAlphaNode
42
+ backdropAlpha: backdropAlphaNode
43
43
  };
44
44
 
45
45
  return context;
@@ -169,7 +169,7 @@ class LightsNode extends Node {
169
169
  export default LightsNode;
170
170
 
171
171
  export const lights = ( lights ) => nodeObject( new LightsNode().fromLights( lights ) );
172
- export const lightNodes = nodeProxy( LightsNode );
172
+ export const lightsNode = nodeProxy( LightsNode );
173
173
 
174
174
  export function addLightNode( lightClass, lightNodeClass ) {
175
175
 
@@ -133,50 +133,38 @@ class Line2NodeMaterial extends NodeMaterial {
133
133
  if ( useWorldUnits ) {
134
134
 
135
135
  // get the offset direction as perpendicular to the view vector
136
- const worldDir = end.xyz.sub( start.xyz ).normalize();
137
136
 
138
- const offset = positionGeometry.y.lessThan( 0.5 ).cond(
139
- start.xyz.cross( worldDir ).normalize(),
140
- end.xyz.cross( worldDir ).normalize()
137
+ const worldDir = end.xyz.sub( start.xyz ).normalize();
138
+ const tmpFwd = mix( start.xyz, end.xyz, 0.5 ).normalize();
139
+ const worldUp = worldDir.cross( tmpFwd ).normalize();
140
+ const worldFwd = worldDir.cross( worldUp );
141
141
 
142
- );
142
+ const worldPos = varyingProperty( 'vec4', 'worldPos' );
143
143
 
144
- // sign flip
145
- offset.assign( positionGeometry.x.lessThan( 0.0 ).cond( offset.negate(), offset ) );
144
+ worldPos.assign( positionGeometry.y.lessThan( 0.5 ).cond( start, end) );
146
145
 
147
- const forwardOffset = worldDir.dot( vec3( 0.0, 0.0, 1.0 ) );
146
+ // height offset
147
+ const hw = materialLineWidth.mul( 0.5 );
148
+ worldPos.addAssign( vec4( positionGeometry.x.lessThan( 0.0 ).cond( worldUp.mul( hw ), worldUp.mul( hw ).negate() ), 0 ) );
148
149
 
149
150
  // don't extend the line if we're rendering dashes because we
150
151
  // won't be rendering the endcaps
151
152
  if ( ! useDash ) {
152
153
 
153
- // extend the line bounds to encompass endcaps
154
- start.assign( start.sub( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
155
- end.assign( end.add( vec4( worldDir.mul( materialLineWidth ).mul( 0.5 ), 0 ) ) );
154
+ // cap extension
155
+ worldPos.addAssign( vec4( positionGeometry.y.lessThan( 0.5 ).cond( worldDir.mul( hw ).negate(), worldDir.mul( hw ) ), 0 ) );
156
156
 
157
- // shift the position of the quad so it hugs the forward edge of the line
158
- offset.assign( offset.sub( vec3( dir.mul( forwardOffset ), 0 ) ) );
159
- offset.z.assign( offset.z.add( 0.5 ) );
160
-
161
- }
162
-
163
- // endcaps
157
+ // add width to the box
158
+ worldPos.addAssign( vec4( worldFwd.mul( hw ), 0 ) );
164
159
 
165
- If( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), () => {
160
+ // endcaps
161
+ If( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), () => {
166
162
 
167
- offset.assign( offset.add( vec3( dir.mul( 2.0 ).mul( forwardOffset ), 0 ) ) );
163
+ worldPos.subAssign( vec4( worldFwd.mul( 2.0 ).mul( hw ), 0 ) );
168
164
 
169
- } );
170
-
171
- // adjust for linewidth
172
- offset.assign( offset.mul( materialLineWidth ).mul( 0.5 ) );
173
-
174
- // set the world position
175
-
176
- const worldPos = varyingProperty( 'vec4', 'worldPos' );
165
+ } );
177
166
 
178
- worldPos.assign( positionGeometry.y.lessThan( 0.5 ).cond( start, end ) );
179
- worldPos.assign( worldPos.add( vec4( offset, 0 ) ) );
167
+ }
180
168
 
181
169
  // project the worldpos
182
170
  clip.assign( cameraProjectionMatrix.mul( worldPos ) );
@@ -11,5 +11,6 @@ export { default as MeshLambertNodeMaterial } from './MeshLambertNodeMaterial.js
11
11
  export { default as MeshPhongNodeMaterial } from './MeshPhongNodeMaterial.js';
12
12
  export { default as MeshStandardNodeMaterial } from './MeshStandardNodeMaterial.js';
13
13
  export { default as MeshPhysicalNodeMaterial } from './MeshPhysicalNodeMaterial.js';
14
+ export { default as MeshSSSNodeMaterial } from './MeshSSSNodeMaterial.js';
14
15
  export { default as PointsNodeMaterial } from './PointsNodeMaterial.js';
15
16
  export { default as SpriteNodeMaterial } from './SpriteNodeMaterial.js';
@@ -0,0 +1,84 @@
1
+ import { addNodeMaterial } from './NodeMaterial.js';
2
+ import { transformedNormalView } from '../accessors/NormalNode.js';
3
+ import { positionViewDirection } from '../accessors/PositionNode.js';
4
+ import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
5
+ import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
6
+ import { float, vec3 } from '../shadernode/ShaderNode.js';
7
+
8
+ class SSSLightingModel extends PhysicalLightingModel {
9
+
10
+ constructor( useClearcoat, useSheen, useIridescence, useSSS ) {
11
+
12
+ super( useClearcoat, useSheen, useIridescence );
13
+
14
+ this.useSSS = useSSS;
15
+
16
+ }
17
+
18
+ direct( { lightDirection, lightColor, reflectedLight }, stack, builder ) {
19
+
20
+ if ( this.useSSS === true ) {
21
+
22
+ const material = builder.material;
23
+
24
+ const { thicknessColorNode, thicknessDistortionNode, thicknessAmbientNode, thicknessAttenuationNode, thicknessPowerNode, thicknessScaleNode } = material;
25
+
26
+ const scatteringHalf = lightDirection.add( transformedNormalView.mul( thicknessDistortionNode ) ).normalize();
27
+ const scatteringDot = float( positionViewDirection.dot( scatteringHalf.negate() ).saturate().pow( thicknessPowerNode ).mul( thicknessScaleNode ) );
28
+ const scatteringIllu = vec3( scatteringDot.add( thicknessAmbientNode ).mul( thicknessColorNode ) );
29
+
30
+ reflectedLight.directDiffuse.addAssign( scatteringIllu.mul( thicknessAttenuationNode.mul( lightColor ) ) );
31
+
32
+ }
33
+
34
+ super.direct( { lightDirection, lightColor, reflectedLight }, stack, builder );
35
+
36
+ }
37
+
38
+ }
39
+
40
+ class MeshSSSNodeMaterial extends MeshPhysicalNodeMaterial {
41
+
42
+ constructor( parameters ) {
43
+
44
+ super( parameters );
45
+
46
+ this.thicknessColorNode = null;
47
+ this.thicknessDistortionNode = float( 0.1 );
48
+ this.thicknessAmbientNode = float( 0.0 );
49
+ this.thicknessAttenuationNode = float( .1 );
50
+ this.thicknessPowerNode = float( 2.0 );
51
+ this.thicknessScaleNode = float( 10.0 );
52
+
53
+ }
54
+
55
+ get useSSS() {
56
+
57
+ return this.thicknessColorNode !== null;
58
+
59
+ }
60
+
61
+ setupLightingModel( /*builder*/ ) {
62
+
63
+ return new SSSLightingModel( this.useClearcoat, this.useSheen, this.useIridescence, this.useSSS );
64
+
65
+ }
66
+
67
+ copy( source ) {
68
+
69
+ this.thicknessColorNode = source.thicknessColorNode;
70
+ this.thicknessDistortionNode = source.thicknessDistortionNode;
71
+ this.thicknessAmbientNode = source.thicknessAmbientNode;
72
+ this.thicknessAttenuationNode = source.thicknessAttenuationNode;
73
+ this.thicknessPowerNode = source.thicknessPowerNode;
74
+ this.thicknessScaleNode = source.thicknessScaleNode;
75
+
76
+ return super.copy( source );
77
+
78
+ }
79
+
80
+ }
81
+
82
+ export default MeshSSSNodeMaterial;
83
+
84
+ addNodeMaterial( 'MeshSSSNodeMaterial', MeshSSSNodeMaterial );