@plastic-software/three 0.179.0 → 0.180.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 (173) hide show
  1. package/build/three.cjs +166 -106
  2. package/build/three.core.js +112 -20
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +55 -89
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +30 -5
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2896 -1048
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2896 -1048
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +1 -1
  13. package/examples/jsm/controls/ArcballControls.js +7 -7
  14. package/examples/jsm/controls/DragControls.js +6 -56
  15. package/examples/jsm/controls/FirstPersonControls.js +2 -2
  16. package/examples/jsm/controls/PointerLockControls.js +0 -8
  17. package/examples/jsm/exporters/GLTFExporter.js +30 -22
  18. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  19. package/examples/jsm/exporters/PLYExporter.js +1 -1
  20. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  21. package/examples/jsm/lines/Line2.js +3 -3
  22. package/examples/jsm/lines/LineGeometry.js +1 -1
  23. package/examples/jsm/lines/LineSegments2.js +2 -2
  24. package/examples/jsm/lines/Wireframe.js +2 -2
  25. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  26. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  27. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  28. package/examples/jsm/loaders/ColladaLoader.js +1 -1
  29. package/examples/jsm/loaders/EXRLoader.js +5 -5
  30. package/examples/jsm/loaders/GLTFLoader.js +9 -5
  31. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  32. package/examples/jsm/loaders/HDRLoader.js +486 -0
  33. package/examples/jsm/loaders/KTX2Loader.js +112 -32
  34. package/examples/jsm/loaders/RGBELoader.js +7 -473
  35. package/examples/jsm/loaders/TTFLoader.js +4 -4
  36. package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
  37. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  38. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  39. package/examples/jsm/math/ColorSpaces.js +19 -1
  40. package/examples/jsm/math/ConvexHull.js +2 -2
  41. package/examples/jsm/math/Lut.js +2 -2
  42. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  43. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  44. package/examples/jsm/misc/Volume.js +1 -1
  45. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  46. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  47. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  48. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  49. package/examples/jsm/transpiler/TSLEncoder.js +2 -10
  50. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  51. package/examples/jsm/tsl/display/AnamorphicNode.js +27 -4
  52. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  53. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  54. package/examples/jsm/tsl/display/DepthOfFieldNode.js +439 -90
  55. package/examples/jsm/tsl/display/GTAONode.js +8 -0
  56. package/examples/jsm/tsl/display/GaussianBlurNode.js +47 -35
  57. package/examples/jsm/tsl/display/OutlineNode.js +2 -2
  58. package/examples/jsm/tsl/display/SSRNode.js +180 -65
  59. package/examples/jsm/tsl/display/TRAANode.js +1 -1
  60. package/examples/jsm/tsl/display/boxBlur.js +64 -0
  61. package/examples/jsm/tsl/display/hashBlur.js +15 -18
  62. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  63. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  64. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  65. package/package.json +1 -1
  66. package/src/Three.Core.js +1 -0
  67. package/src/Three.TSL.js +29 -4
  68. package/src/animation/AnimationClip.js +17 -2
  69. package/src/constants.js +11 -3
  70. package/src/core/BufferGeometry.js +2 -2
  71. package/src/extras/TextureUtils.js +2 -1
  72. package/src/extras/lib/earcut.js +1 -1
  73. package/src/lights/webgpu/ProjectorLight.js +1 -1
  74. package/src/materials/Material.js +12 -0
  75. package/src/materials/MeshDistanceMaterial.js +1 -1
  76. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  77. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  78. package/src/materials/nodes/manager/NodeMaterialObserver.js +1 -1
  79. package/src/math/ColorManagement.js +7 -1
  80. package/src/nodes/Nodes.js +3 -0
  81. package/src/nodes/TSL.js +3 -0
  82. package/src/nodes/accessors/BufferNode.js +1 -1
  83. package/src/nodes/accessors/Camera.js +133 -7
  84. package/src/nodes/accessors/ClippingNode.js +6 -5
  85. package/src/nodes/accessors/CubeTextureNode.js +2 -2
  86. package/src/nodes/accessors/InstanceNode.js +3 -1
  87. package/src/nodes/accessors/Object3DNode.js +1 -1
  88. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  89. package/src/nodes/accessors/ReferenceNode.js +1 -1
  90. package/src/nodes/accessors/Texture3DNode.js +13 -0
  91. package/src/nodes/accessors/TextureNode.js +71 -19
  92. package/src/nodes/code/FunctionCallNode.js +19 -0
  93. package/src/nodes/code/FunctionNode.js +23 -0
  94. package/src/nodes/core/AssignNode.js +4 -3
  95. package/src/nodes/core/ContextNode.js +24 -0
  96. package/src/nodes/core/Node.js +16 -20
  97. package/src/nodes/core/NodeBuilder.js +48 -14
  98. package/src/nodes/core/NodeFrame.js +1 -1
  99. package/src/nodes/core/NodeUniform.js +1 -1
  100. package/src/nodes/core/NodeUtils.js +1 -2
  101. package/src/nodes/core/StackNode.js +29 -4
  102. package/src/nodes/core/StructNode.js +5 -5
  103. package/src/nodes/core/StructTypeNode.js +1 -0
  104. package/src/nodes/core/SubBuildNode.js +2 -2
  105. package/src/nodes/core/UniformNode.js +16 -9
  106. package/src/nodes/core/VarNode.js +0 -21
  107. package/src/nodes/display/FrontFacingNode.js +4 -8
  108. package/src/nodes/display/PassNode.js +1 -1
  109. package/src/nodes/display/ScreenNode.js +42 -13
  110. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  111. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  112. package/src/nodes/display/ViewportTextureNode.js +42 -12
  113. package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
  114. package/src/nodes/lighting/LightsNode.js +1 -1
  115. package/src/nodes/math/BitcastNode.js +156 -0
  116. package/src/nodes/math/ConditionalNode.js +18 -2
  117. package/src/nodes/math/MathNode.js +3 -15
  118. package/src/nodes/math/OperatorNode.js +4 -3
  119. package/src/nodes/tsl/TSLCore.js +432 -152
  120. package/src/nodes/utils/JoinNode.js +3 -1
  121. package/src/nodes/utils/MemberNode.js +58 -7
  122. package/src/nodes/utils/RTTNode.js +1 -1
  123. package/src/nodes/utils/ReflectorNode.js +51 -7
  124. package/src/nodes/utils/SampleNode.js +12 -2
  125. package/src/nodes/utils/SplitNode.js +11 -0
  126. package/src/nodes/utils/Timer.js +0 -47
  127. package/src/objects/BatchedMesh.js +2 -2
  128. package/src/objects/LOD.js +1 -1
  129. package/src/objects/Sprite.js +2 -2
  130. package/src/renderers/WebGLRenderer.js +0 -9
  131. package/src/renderers/common/Attributes.js +1 -1
  132. package/src/renderers/common/Backend.js +19 -1
  133. package/src/renderers/common/Bindings.js +2 -0
  134. package/src/renderers/common/ChainMap.js +1 -1
  135. package/src/renderers/common/DataMap.js +1 -1
  136. package/src/renderers/common/Pipelines.js +1 -1
  137. package/src/renderers/common/RenderContext.js +2 -2
  138. package/src/renderers/common/RenderObject.js +14 -2
  139. package/src/renderers/common/Renderer.js +39 -19
  140. package/src/renderers/common/SampledTexture.js +1 -1
  141. package/src/renderers/common/Sampler.js +25 -13
  142. package/src/renderers/common/Textures.js +34 -12
  143. package/src/renderers/common/TimestampQueryPool.js +3 -3
  144. package/src/renderers/common/XRManager.js +35 -19
  145. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  146. package/src/renderers/common/nodes/NodeLibrary.js +5 -5
  147. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  148. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  149. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  150. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  151. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  152. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  153. package/src/renderers/webgl/WebGLProgram.js +4 -4
  154. package/src/renderers/webgl/WebGLShadowMap.js +1 -1
  155. package/src/renderers/webgl/WebGLTextures.js +1 -0
  156. package/src/renderers/webgl/WebGLUtils.js +3 -2
  157. package/src/renderers/webgl-fallback/WebGLBackend.js +186 -135
  158. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +110 -17
  159. package/src/renderers/webgl-fallback/utils/WebGLState.js +1 -1
  160. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -3
  161. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -10
  162. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  163. package/src/renderers/webgpu/WebGPUBackend.js +35 -31
  164. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +124 -34
  165. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -2
  166. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +9 -18
  167. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +114 -25
  168. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +3 -3
  169. package/src/renderers/webxr/WebXRManager.js +39 -24
  170. package/src/textures/ExternalTexture.js +15 -4
  171. package/src/textures/Source.js +1 -1
  172. package/src/textures/VideoTexture.js +0 -3
  173. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -6,7 +6,7 @@ import { Fn, nodeImmutable, vec2 } from '../tsl/TSLBase.js';
6
6
  import { Vector2 } from '../../math/Vector2.js';
7
7
  import { Vector4 } from '../../math/Vector4.js';
8
8
 
9
- let screenSizeVec, viewportVec;
9
+ let _screenSizeVec, _viewportVec;
10
10
 
11
11
  /**
12
12
  * This node provides a collection of screen related metrics.
@@ -26,7 +26,7 @@ class ScreenNode extends Node {
26
26
  /**
27
27
  * Constructs a new screen node.
28
28
  *
29
- * @param {('coordinate'|'viewport'|'size'|'uv')} scope - The node's scope.
29
+ * @param {('coordinate'|'viewport'|'size'|'uv'|'dpr')} scope - The node's scope.
30
30
  */
31
31
  constructor( scope ) {
32
32
 
@@ -39,11 +39,20 @@ class ScreenNode extends Node {
39
39
  * - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector.
40
40
  * - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer.
41
41
  * - `ScreenNode.UV`: Normalized coordinates.
42
+ * - `ScreenNode.DPR`: Device pixel ratio.
42
43
  *
43
- * @type {('coordinate'|'viewport'|'size'|'uv')}
44
+ * @type {('coordinate'|'viewport'|'size'|'uv'|'dpr')}
44
45
  */
45
46
  this.scope = scope;
46
47
 
48
+ /**
49
+ * This output node.
50
+ *
51
+ * @type {?Node}
52
+ * @default null
53
+ */
54
+ this._output = null;
55
+
47
56
  /**
48
57
  * This flag can be used for type testing.
49
58
  *
@@ -58,10 +67,11 @@ class ScreenNode extends Node {
58
67
  /**
59
68
  * This method is overwritten since the node type depends on the selected scope.
60
69
  *
61
- * @return {('vec2'|'vec4')} The node type.
70
+ * @return {('float'|'vec2'|'vec4')} The node type.
62
71
  */
63
72
  getNodeType() {
64
73
 
74
+ if ( this.scope === ScreenNode.DPR ) return 'float';
65
75
  if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';
66
76
  else return 'vec2';
67
77
 
@@ -76,7 +86,7 @@ class ScreenNode extends Node {
76
86
 
77
87
  let updateType = NodeUpdateType.NONE;
78
88
 
79
- if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT ) {
89
+ if ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT || this.scope === ScreenNode.DPR ) {
80
90
 
81
91
  updateType = NodeUpdateType.RENDER;
82
92
 
@@ -102,26 +112,30 @@ class ScreenNode extends Node {
102
112
 
103
113
  if ( renderTarget !== null ) {
104
114
 
105
- viewportVec.copy( renderTarget.viewport );
115
+ _viewportVec.copy( renderTarget.viewport );
106
116
 
107
117
  } else {
108
118
 
109
- renderer.getViewport( viewportVec );
119
+ renderer.getViewport( _viewportVec );
110
120
 
111
- viewportVec.multiplyScalar( renderer.getPixelRatio() );
121
+ _viewportVec.multiplyScalar( renderer.getPixelRatio() );
112
122
 
113
123
  }
114
124
 
125
+ } else if ( this.scope === ScreenNode.DPR ) {
126
+
127
+ this._output.value = renderer.getPixelRatio();
128
+
115
129
  } else {
116
130
 
117
131
  if ( renderTarget !== null ) {
118
132
 
119
- screenSizeVec.width = renderTarget.width;
120
- screenSizeVec.height = renderTarget.height;
133
+ _screenSizeVec.width = renderTarget.width;
134
+ _screenSizeVec.height = renderTarget.height;
121
135
 
122
136
  } else {
123
137
 
124
- renderer.getDrawingBufferSize( screenSizeVec );
138
+ renderer.getDrawingBufferSize( _screenSizeVec );
125
139
 
126
140
  }
127
141
 
@@ -137,11 +151,15 @@ class ScreenNode extends Node {
137
151
 
138
152
  if ( scope === ScreenNode.SIZE ) {
139
153
 
140
- output = uniform( screenSizeVec || ( screenSizeVec = new Vector2() ) );
154
+ output = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) );
141
155
 
142
156
  } else if ( scope === ScreenNode.VIEWPORT ) {
143
157
 
144
- output = uniform( viewportVec || ( viewportVec = new Vector4() ) );
158
+ output = uniform( _viewportVec || ( _viewportVec = new Vector4() ) );
159
+
160
+ } else if ( scope === ScreenNode.DPR ) {
161
+
162
+ output = uniform( 1 );
145
163
 
146
164
  } else {
147
165
 
@@ -149,6 +167,8 @@ class ScreenNode extends Node {
149
167
 
150
168
  }
151
169
 
170
+ this._output = output;
171
+
152
172
  return output;
153
173
 
154
174
  }
@@ -183,11 +203,20 @@ ScreenNode.COORDINATE = 'coordinate';
183
203
  ScreenNode.VIEWPORT = 'viewport';
184
204
  ScreenNode.SIZE = 'size';
185
205
  ScreenNode.UV = 'uv';
206
+ ScreenNode.DPR = 'dpr';
186
207
 
187
208
  export default ScreenNode;
188
209
 
189
210
  // Screen
190
211
 
212
+ /**
213
+ * TSL object that represents the current DPR.
214
+ *
215
+ * @tsl
216
+ * @type {ScreenNode<float>}
217
+ */
218
+ export const screenDPR = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.DPR );
219
+
191
220
  /**
192
221
  * TSL object that represents normalized screen coordinates, unitless in `[0, 1]`.
193
222
  *
@@ -4,7 +4,7 @@ import { screenUV } from './ScreenNode.js';
4
4
 
5
5
  import { DepthTexture } from '../../textures/DepthTexture.js';
6
6
 
7
- let sharedDepthbuffer = null;
7
+ let _sharedDepthbuffer = null;
8
8
 
9
9
  /**
10
10
  * Represents the depth of the current viewport as a texture. This module
@@ -29,13 +29,25 @@ class ViewportDepthTextureNode extends ViewportTextureNode {
29
29
  */
30
30
  constructor( uvNode = screenUV, levelNode = null ) {
31
31
 
32
- if ( sharedDepthbuffer === null ) {
32
+ if ( _sharedDepthbuffer === null ) {
33
33
 
34
- sharedDepthbuffer = new DepthTexture();
34
+ _sharedDepthbuffer = new DepthTexture();
35
35
 
36
36
  }
37
37
 
38
- super( uvNode, levelNode, sharedDepthbuffer );
38
+ super( uvNode, levelNode, _sharedDepthbuffer );
39
+
40
+ }
41
+
42
+ /**
43
+ * Overwritten so the method always returns the unique shared
44
+ * depth texture.
45
+ *
46
+ * @return {DepthTexture} The shared depth texture.
47
+ */
48
+ getTextureForReference() {
49
+
50
+ return _sharedDepthbuffer;
39
51
 
40
52
  }
41
53
 
@@ -39,6 +39,18 @@ class ViewportSharedTextureNode extends ViewportTextureNode {
39
39
 
40
40
  }
41
41
 
42
+ /**
43
+ * Overwritten so the method always returns the unique shared
44
+ * framebuffer texture.
45
+ *
46
+ * @return {FramebufferTexture} The shared framebuffer texture.
47
+ */
48
+ getTextureForReference() {
49
+
50
+ return _sharedFramebuffer;
51
+
52
+ }
53
+
42
54
  updateReference() {
43
55
 
44
56
  return this;
@@ -80,13 +80,13 @@ class ViewportTextureNode extends TextureNode {
80
80
  this.isOutputTextureNode = true;
81
81
 
82
82
  /**
83
- * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node renders the
84
- * scene once per render in its {@link ViewportTextureNode#updateBefore} method.
83
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the
84
+ * scene once per frame in its {@link ViewportTextureNode#updateBefore} method.
85
85
  *
86
86
  * @type {string}
87
87
  * @default 'frame'
88
88
  */
89
- this.updateBeforeType = NodeUpdateType.RENDER;
89
+ this.updateBeforeType = NodeUpdateType.FRAME;
90
90
 
91
91
  /**
92
92
  * The framebuffer texture for the current renderer context.
@@ -94,13 +94,35 @@ class ViewportTextureNode extends TextureNode {
94
94
  * @type {WeakMap<RenderTarget, FramebufferTexture>}
95
95
  * @private
96
96
  */
97
- this._textures = new WeakMap();
97
+ this._cacheTextures = new WeakMap();
98
98
 
99
99
  }
100
100
 
101
- getFrameBufferTexture( reference = null ) {
101
+ /**
102
+ * This methods returns a texture for the given render target reference.
103
+ *
104
+ * To avoid rendering errors, `ViewportTextureNode` must use unique framebuffer textures
105
+ * for different render contexts.
106
+ *
107
+ * @param {?RenderTarget} [reference=null] - The render target reference.
108
+ * @return {Texture} The framebuffer texture.
109
+ */
110
+ getTextureForReference( reference = null ) {
111
+
112
+ let defaultFramebuffer;
113
+ let cacheTextures;
114
+
115
+ if ( this.referenceNode ) {
116
+
117
+ defaultFramebuffer = this.referenceNode.defaultFramebuffer;
118
+ cacheTextures = this.referenceNode._cacheTextures;
119
+
120
+ } else {
102
121
 
103
- const defaultFramebuffer = this.referenceNode ? this.referenceNode.defaultFramebuffer : this.defaultFramebuffer;
122
+ defaultFramebuffer = this.defaultFramebuffer;
123
+ cacheTextures = this._cacheTextures;
124
+
125
+ }
104
126
 
105
127
  if ( reference === null ) {
106
128
 
@@ -108,15 +130,25 @@ class ViewportTextureNode extends TextureNode {
108
130
 
109
131
  }
110
132
 
111
- if ( this._textures.has( reference ) === false ) {
133
+ if ( cacheTextures.has( reference ) === false ) {
112
134
 
113
135
  const framebufferTexture = defaultFramebuffer.clone();
114
136
 
115
- this._textures.set( reference, framebufferTexture );
137
+ cacheTextures.set( reference, framebufferTexture );
116
138
 
117
139
  }
118
140
 
119
- return this._textures.get( reference );
141
+ return cacheTextures.get( reference );
142
+
143
+ }
144
+
145
+ updateReference( frame ) {
146
+
147
+ const renderTarget = frame.renderer.getRenderTarget();
148
+
149
+ this.value = this.getTextureForReference( renderTarget );
150
+
151
+ return this.value;
120
152
 
121
153
  }
122
154
 
@@ -137,7 +169,7 @@ class ViewportTextureNode extends TextureNode {
137
169
 
138
170
  //
139
171
 
140
- const framebufferTexture = this.getFrameBufferTexture( renderTarget );
172
+ const framebufferTexture = this.getTextureForReference( renderTarget );
141
173
 
142
174
  if ( framebufferTexture.image.width !== _size.width || framebufferTexture.image.height !== _size.height ) {
143
175
 
@@ -156,8 +188,6 @@ class ViewportTextureNode extends TextureNode {
156
188
 
157
189
  framebufferTexture.generateMipmaps = currentGenerateMipmaps;
158
190
 
159
- this.value = framebufferTexture;
160
-
161
191
  }
162
192
 
163
193
  clone() {