super-three 0.155.0 → 0.157.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 (268) hide show
  1. package/build/three.cjs +361 -324
  2. package/build/three.js +361 -324
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +354 -323
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/capabilities/WebGL.js +17 -0
  7. package/examples/jsm/controls/DragControls.js +3 -2
  8. package/examples/jsm/controls/OrbitControls.js +13 -5
  9. package/examples/jsm/csm/CSMShader.js +59 -21
  10. package/examples/jsm/exporters/EXRExporter.js +102 -24
  11. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  15. package/examples/jsm/libs/tween.module.js +790 -735
  16. package/examples/jsm/libs/utif.module.js +1644 -1558
  17. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  18. package/examples/jsm/lines/LineMaterial.js +90 -156
  19. package/examples/jsm/loaders/3DMLoader.js +378 -104
  20. package/examples/jsm/loaders/DDSLoader.js +46 -3
  21. package/examples/jsm/loaders/EXRLoader.js +4 -4
  22. package/examples/jsm/loaders/FBXLoader.js +2 -0
  23. package/examples/jsm/loaders/GLTFLoader.js +18 -8
  24. package/examples/jsm/loaders/KTX2Loader.js +126 -77
  25. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  26. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  27. package/examples/jsm/loaders/MMDLoader.js +10 -7
  28. package/examples/jsm/loaders/RGBELoader.js +48 -66
  29. package/examples/jsm/loaders/STLLoader.js +7 -0
  30. package/examples/jsm/loaders/USDZLoader.js +215 -12
  31. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  32. package/examples/jsm/nodes/Nodes.js +8 -1
  33. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +30 -4
  35. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  36. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/CubeTextureNode.js +19 -4
  38. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +4 -5
  39. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/LineMaterialNode.js +29 -0
  41. package/examples/jsm/nodes/accessors/MaterialNode.js +23 -13
  42. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +12 -9
  43. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  44. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  45. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  46. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/Object3DNode.js +3 -3
  48. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  49. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  51. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  52. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  54. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  55. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  56. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  57. package/examples/jsm/nodes/accessors/TextureNode.js +18 -8
  58. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  60. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  61. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  62. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  63. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  64. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  65. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  66. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  67. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  68. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  69. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  70. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  71. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  72. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  73. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  74. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  75. package/examples/jsm/nodes/core/InputNode.js +1 -1
  76. package/examples/jsm/nodes/core/Node.js +45 -14
  77. package/examples/jsm/nodes/core/NodeBuilder.js +83 -15
  78. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  79. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  80. package/examples/jsm/nodes/core/OutputStructNode.js +62 -0
  81. package/examples/jsm/nodes/core/PropertyNode.js +3 -1
  82. package/examples/jsm/nodes/core/StackNode.js +5 -5
  83. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  84. package/examples/jsm/nodes/core/TempNode.js +1 -1
  85. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  86. package/examples/jsm/nodes/core/VarNode.js +1 -1
  87. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  88. package/examples/jsm/nodes/core/constants.js +1 -1
  89. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  90. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  91. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  92. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  93. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  94. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  95. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  96. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  97. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  98. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  99. package/examples/jsm/nodes/display/ViewportNode.js +21 -7
  100. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  101. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  102. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  103. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  104. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  105. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  106. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  107. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  108. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  110. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  111. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  112. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  113. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  114. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  115. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  116. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  117. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  118. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  119. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  120. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  121. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  122. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  123. package/examples/jsm/nodes/materials/Materials.js +2 -0
  124. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  125. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  126. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  127. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  128. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  129. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  130. package/examples/jsm/nodes/materials/NodeMaterial.js +39 -29
  131. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  132. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  133. package/examples/jsm/nodes/math/CondNode.js +1 -1
  134. package/examples/jsm/nodes/math/HashNode.js +34 -0
  135. package/examples/jsm/nodes/math/MathNode.js +2 -2
  136. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  137. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  138. package/examples/jsm/nodes/shadernode/ShaderNode.js +85 -28
  139. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  140. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  141. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  142. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  143. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  144. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  145. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  146. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  147. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  148. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  149. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  150. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  151. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  152. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  153. package/examples/jsm/nodes/utils/SplitNode.js +2 -2
  154. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  155. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  156. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  157. package/examples/jsm/objects/Sky.js +1 -3
  158. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  159. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  160. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  161. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  162. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  163. package/examples/jsm/renderers/common/Backend.js +11 -8
  164. package/examples/jsm/renderers/common/Background.js +2 -2
  165. package/examples/jsm/renderers/common/Binding.js +6 -0
  166. package/examples/jsm/renderers/common/Bindings.js +4 -5
  167. package/examples/jsm/renderers/common/Pipelines.js +9 -9
  168. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  169. package/examples/jsm/renderers/common/RenderContexts.js +26 -1
  170. package/examples/jsm/renderers/common/RenderList.js +12 -4
  171. package/examples/jsm/renderers/common/RenderObject.js +43 -15
  172. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  173. package/examples/jsm/renderers/common/Renderer.js +52 -16
  174. package/examples/jsm/renderers/common/SampledTexture.js +6 -3
  175. package/examples/jsm/renderers/common/Sampler.js +1 -1
  176. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  177. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  178. package/examples/jsm/renderers/common/Textures.js +166 -21
  179. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  180. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +21 -11
  181. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -7
  182. package/examples/jsm/renderers/common/nodes/Nodes.js +79 -18
  183. package/examples/jsm/renderers/webgl/WebGLBackend.js +702 -0
  184. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +207 -20
  185. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  186. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  187. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  188. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +212 -0
  189. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  190. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  191. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +4 -4
  192. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +14 -2
  193. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +282 -43
  194. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  195. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +93 -60
  196. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  197. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
  198. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -14
  199. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  200. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +205 -284
  201. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
  202. package/examples/jsm/shaders/FilmShader.js +11 -54
  203. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  204. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  205. package/examples/jsm/shaders/OutputShader.js +2 -2
  206. package/examples/jsm/shaders/SAOShader.js +0 -13
  207. package/examples/jsm/shaders/SSAOShader.js +33 -26
  208. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  209. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  210. package/package.json +1 -1
  211. package/src/Three.js +1 -2
  212. package/src/animation/AnimationUtils.js +3 -20
  213. package/src/animation/KeyframeTrack.js +8 -8
  214. package/src/audio/Audio.js +6 -0
  215. package/src/cameras/Camera.js +1 -5
  216. package/src/cameras/CubeCamera.js +14 -8
  217. package/src/constants.js +10 -1
  218. package/src/core/Object3D.js +1 -14
  219. package/src/core/RenderTarget.js +16 -7
  220. package/src/core/UniformsGroup.js +2 -2
  221. package/src/extras/core/CurvePath.js +4 -1
  222. package/src/loaders/DataTextureLoader.js +0 -2
  223. package/src/loaders/MaterialLoader.js +1 -1
  224. package/src/loaders/ObjectLoader.js +6 -0
  225. package/src/materials/Material.js +10 -10
  226. package/src/math/Color.js +1 -5
  227. package/src/math/ColorManagement.js +82 -60
  228. package/src/math/Vector2.js +2 -2
  229. package/src/math/Vector3.js +3 -3
  230. package/src/math/Vector4.js +4 -4
  231. package/src/objects/Line.js +1 -1
  232. package/src/objects/Mesh.js +1 -1
  233. package/src/objects/Points.js +1 -1
  234. package/src/objects/Sprite.js +2 -2
  235. package/src/renderers/WebGLRenderer.js +42 -51
  236. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  237. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  238. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  239. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  240. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  241. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  242. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  243. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  244. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  245. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  246. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  247. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  248. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  249. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  250. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  251. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  252. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  253. package/src/renderers/shaders/UniformsUtils.js +2 -2
  254. package/src/renderers/webgl/WebGLBackground.js +9 -17
  255. package/src/renderers/webgl/WebGLLights.js +14 -3
  256. package/src/renderers/webgl/WebGLProgram.js +36 -5
  257. package/src/renderers/webgl/WebGLPrograms.js +9 -1
  258. package/src/renderers/webgl/WebGLTextures.js +19 -8
  259. package/src/renderers/webgl/WebGLUtils.js +25 -20
  260. package/src/scenes/Fog.js +1 -0
  261. package/src/scenes/FogExp2.js +1 -0
  262. package/src/textures/Source.js +2 -2
  263. package/src/textures/Texture.js +2 -2
  264. package/src/utils.js +9 -1
  265. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  266. package/src/lights/AmbientLightProbe.js +0 -21
  267. package/src/lights/HemisphereLightProbe.js +0 -30
  268. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
@@ -1,10 +1,7 @@
1
- import { RenderTarget, NoColorSpace } from 'three';
1
+ import { NoColorSpace, FloatType } from 'three';
2
2
 
3
3
  import UniformsGroup from '../../common/UniformsGroup.js';
4
- import {
5
- FloatNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
6
- ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
7
- } from '../../common/nodes/NodeUniform.js';
4
+
8
5
  import NodeSampler from '../../common/nodes/NodeSampler.js';
9
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
10
7
 
@@ -12,10 +9,10 @@ import UniformBuffer from '../../common/UniformBuffer.js';
12
9
  import StorageBuffer from '../../common/StorageBuffer.js';
13
10
  import { getVectorLength, getStrideLength } from '../../common/BufferUtils.js';
14
11
 
15
- import CubeRenderTarget from '../../common/CubeRenderTarget.js';
16
-
17
12
  import { NodeBuilder, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
18
13
 
14
+ import { getFormat } from '../utils/WebGPUTextureUtils.js';
15
+
19
16
  import WGSLNodeParser from './WGSLNodeParser.js';
20
17
 
21
18
  const gpuShaderStageLib = {
@@ -63,7 +60,7 @@ const wgslTypeLib = {
63
60
 
64
61
  const wgslMethods = {
65
62
  dFdx: 'dpdx',
66
- dFdy: 'dpdy',
63
+ dFdy: '- dpdy',
67
64
  mod: 'threejs_mod',
68
65
  lessThanEqual: 'threejs_lessThanEqual',
69
66
  inversesqrt: 'inverseSqrt'
@@ -136,7 +133,7 @@ class WGSLNodeBuilder extends NodeBuilder {
136
133
 
137
134
  }
138
135
 
139
- getSampler( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
136
+ _getSampler( texture, textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
140
137
 
141
138
  if ( shaderStage === 'fragment' ) {
142
139
 
@@ -144,17 +141,13 @@ class WGSLNodeBuilder extends NodeBuilder {
144
141
 
145
142
  } else {
146
143
 
147
- this._include( 'repeatWrapping' );
148
-
149
- const dimension = `textureDimensions( ${textureProperty}, 0 )`;
150
-
151
- return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), 0 )`;
144
+ return this.getTextureLoad( texture, textureProperty, uvSnippet );
152
145
 
153
146
  }
154
147
 
155
148
  }
156
149
 
157
- getVideoSampler( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
150
+ _getVideoSampler( textureProperty, uvSnippet, shaderStage = this.shaderStage ) {
158
151
 
159
152
  if ( shaderStage === 'fragment' ) {
160
153
 
@@ -168,21 +161,33 @@ class WGSLNodeBuilder extends NodeBuilder {
168
161
 
169
162
  }
170
163
 
171
- getSamplerLevel( textureProperty, uvSnippet, biasSnippet, shaderStage = this.shaderStage ) {
164
+ _getSamplerLevel( texture, textureProperty, uvSnippet, biasSnippet, shaderStage = this.shaderStage ) {
172
165
 
173
- if ( shaderStage === 'fragment' ) {
166
+ if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) {
174
167
 
175
168
  return `textureSampleLevel( ${textureProperty}, ${textureProperty}_sampler, ${uvSnippet}, ${biasSnippet} )`;
176
169
 
177
170
  } else {
178
171
 
179
- this._include( 'repeatWrapping' );
172
+ return this.getTextureLoad( texture, textureProperty, uvSnippet, biasSnippet );
173
+
174
+ }
175
+
176
+ }
177
+
178
+ getTextureLoad( texture, textureProperty, uvSnippet, biasSnippet = '0' ) {
180
179
 
181
- const dimension = `textureDimensions( ${textureProperty}, 0 )`;
180
+ this._include( 'repeatWrapping' );
182
181
 
183
- return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), i32( ${biasSnippet} ) )`;
182
+ const dimension = `textureDimensions( ${textureProperty}, 0 )`;
184
183
 
185
- }
184
+ return `textureLoad( ${textureProperty}, threejs_repeatWrapping( ${uvSnippet}, ${dimension} ), i32( ${biasSnippet} ) )`;
185
+
186
+ }
187
+
188
+ isUnfilterable( texture ) {
189
+
190
+ return texture.isDataTexture === true && texture.type === FloatType;
186
191
 
187
192
  }
188
193
 
@@ -192,11 +197,15 @@ class WGSLNodeBuilder extends NodeBuilder {
192
197
 
193
198
  if ( texture.isVideoTexture === true ) {
194
199
 
195
- snippet = this.getVideoSampler( textureProperty, uvSnippet, shaderStage );
200
+ snippet = this._getVideoSampler( textureProperty, uvSnippet, shaderStage );
201
+
202
+ } else if ( this.isUnfilterable( texture ) ) {
203
+
204
+ snippet = this.getTextureLoad( texture, textureProperty, uvSnippet );
196
205
 
197
206
  } else {
198
207
 
199
- snippet = this.getSampler( textureProperty, uvSnippet, shaderStage );
208
+ snippet = this._getSampler( texture, textureProperty, uvSnippet, shaderStage );
200
209
 
201
210
  }
202
211
 
@@ -224,11 +233,11 @@ class WGSLNodeBuilder extends NodeBuilder {
224
233
 
225
234
  if ( texture.isVideoTexture === true ) {
226
235
 
227
- snippet = this.getVideoSampler( textureProperty, uvSnippet, shaderStage );
236
+ snippet = this._getVideoSampler( textureProperty, uvSnippet, shaderStage );
228
237
 
229
238
  } else {
230
239
 
231
- snippet = this.getSamplerLevel( textureProperty, uvSnippet, biasSnippet, shaderStage );
240
+ snippet = this._getSamplerLevel( texture, textureProperty, uvSnippet, biasSnippet, shaderStage );
232
241
 
233
242
  }
234
243
 
@@ -296,13 +305,14 @@ class WGSLNodeBuilder extends NodeBuilder {
296
305
 
297
306
  }
298
307
 
308
+ texture.store = node.isStoreTextureNode === true;
299
309
  texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
300
310
 
301
311
  // add first textures in sequence and group for last
302
312
  const lastBinding = bindings[ bindings.length - 1 ];
303
313
  const index = lastBinding && lastBinding.isUniformsGroup ? bindings.length - 1 : bindings.length;
304
314
 
305
- if ( shaderStage === 'fragment' ) {
315
+ if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
306
316
 
307
317
  const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node );
308
318
  sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
@@ -354,7 +364,7 @@ class WGSLNodeBuilder extends NodeBuilder {
354
364
 
355
365
  for ( const uniformNode of node.nodes ) {
356
366
 
357
- const uniformNodeGPU = this._getNodeUniform( uniformNode, type );
367
+ const uniformNodeGPU = this.getNodeUniform( uniformNode, type );
358
368
 
359
369
  // fit bounds to buffer
360
370
  uniformNodeGPU.boundary = getVectorLength( uniformNodeGPU.itemSize );
@@ -368,7 +378,7 @@ class WGSLNodeBuilder extends NodeBuilder {
368
378
 
369
379
  } else {
370
380
 
371
- uniformGPU = this._getNodeUniform( uniformNode, type );
381
+ uniformGPU = this.getNodeUniform( uniformNode, type );
372
382
 
373
383
  uniformsGroup.addUniform( uniformGPU );
374
384
 
@@ -392,7 +402,7 @@ class WGSLNodeBuilder extends NodeBuilder {
392
402
 
393
403
  isReference( type ) {
394
404
 
395
- return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube';
405
+ return super.isReference( type ) || type === 'texture_2d' || type === 'texture_cube' || type === 'texture_storage_2d';
396
406
 
397
407
  }
398
408
 
@@ -492,6 +502,44 @@ class WGSLNodeBuilder extends NodeBuilder {
492
502
 
493
503
  }
494
504
 
505
+ getStructMembers( struct ) {
506
+
507
+ const snippets = [];
508
+ const members = struct.getMemberTypes();
509
+
510
+ for ( let i = 0; i < members.length; i ++ ) {
511
+
512
+ const member = members[ i ];
513
+ snippets.push( `\t@location( ${i} ) m${i} : ${ member }<f32>` );
514
+
515
+ }
516
+
517
+ return snippets.join( ',\n' );
518
+
519
+ }
520
+
521
+ getStructs( shaderStage ) {
522
+
523
+ const snippets = [];
524
+ const structs = this.structs[ shaderStage ];
525
+
526
+ for ( let index = 0, length = structs.length; index < length; index ++ ) {
527
+
528
+ const struct = structs[ index ];
529
+ const name = struct.name;
530
+
531
+ let snippet = `\struct ${ name } {\n`;
532
+ snippet += this.getStructMembers( struct );
533
+ snippet += '\n}';
534
+
535
+ snippets.push( snippet );
536
+
537
+ }
538
+
539
+ return snippets.join( '\n\n' );
540
+
541
+ }
542
+
495
543
  getVar( type, name ) {
496
544
 
497
545
  return `var ${ name } : ${ this.getType( type ) }`;
@@ -540,6 +588,7 @@ class WGSLNodeBuilder extends NodeBuilder {
540
588
 
541
589
  attributesSnippet += ' @interpolate( flat )';
542
590
 
591
+
543
592
  }
544
593
 
545
594
  snippets.push( `${ attributesSnippet } ${ varying.name } : ${ this.getType( varying.type ) }` );
@@ -580,9 +629,9 @@ class WGSLNodeBuilder extends NodeBuilder {
580
629
 
581
630
  if ( uniform.type === 'texture' || uniform.type === 'cubeTexture' ) {
582
631
 
583
- if ( shaderStage === 'fragment' ) {
632
+ const texture = uniform.node.value;
584
633
 
585
- const texture = uniform.node.value;
634
+ if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStoreTextureNode !== true ) {
586
635
 
587
636
  if ( texture.isDepthTexture === true && texture.compareFunction !== null ) {
588
637
 
@@ -596,8 +645,6 @@ class WGSLNodeBuilder extends NodeBuilder {
596
645
 
597
646
  }
598
647
 
599
- const texture = uniform.node.value;
600
-
601
648
  let textureType;
602
649
 
603
650
  if ( texture.isCubeTexture === true ) {
@@ -612,6 +659,12 @@ class WGSLNodeBuilder extends NodeBuilder {
612
659
 
613
660
  textureType = 'texture_external';
614
661
 
662
+ } else if ( uniform.node.isStoreTextureNode === true ) {
663
+
664
+ const format = getFormat( texture );
665
+
666
+ textureType = 'texture_storage_2d<' + format + ', write>';
667
+
615
668
  } else {
616
669
 
617
670
  textureType = 'texture_2d<f32>';
@@ -712,13 +765,16 @@ class WGSLNodeBuilder extends NodeBuilder {
712
765
 
713
766
  }
714
767
 
768
+ const outputNode = mainNode.outputNode;
715
769
  const stageData = shadersData[ shaderStage ];
716
770
 
717
771
  stageData.uniforms = this.getUniforms( shaderStage );
718
772
  stageData.attributes = this.getAttributes( shaderStage );
719
773
  stageData.varyings = this.getVaryings( shaderStage );
774
+ stageData.structs = this.getStructs( shaderStage );
720
775
  stageData.vars = this.getVars( shaderStage );
721
776
  stageData.codes = this.getCodes( shaderStage );
777
+ stageData.returnType = ( outputNode !== undefined && outputNode.isOutputStructNode === true ) ? outputNode.nodeType : '@location( 0 ) vec4<f32>';
722
778
  stageData.flow = flow;
723
779
 
724
780
  }
@@ -736,18 +792,6 @@ class WGSLNodeBuilder extends NodeBuilder {
736
792
 
737
793
  }
738
794
 
739
- getRenderTarget( width, height, options ) {
740
-
741
- return new RenderTarget( width, height, options );
742
-
743
- }
744
-
745
- getCubeRenderTarget( size, options ) {
746
-
747
- return new CubeRenderTarget( size, options );
748
-
749
- }
750
-
751
795
  getMethod( method ) {
752
796
 
753
797
  if ( wgslPolyfill[ method ] !== undefined ) {
@@ -778,20 +822,6 @@ class WGSLNodeBuilder extends NodeBuilder {
778
822
 
779
823
  }
780
824
 
781
- _getNodeUniform( uniformNode, type ) {
782
-
783
- if ( type === 'float' ) return new FloatNodeUniform( uniformNode );
784
- if ( type === 'vec2' ) return new Vector2NodeUniform( uniformNode );
785
- if ( type === 'vec3' ) return new Vector3NodeUniform( uniformNode );
786
- if ( type === 'vec4' ) return new Vector4NodeUniform( uniformNode );
787
- if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
788
- if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
789
- if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
790
-
791
- throw new Error( `Uniform "${type}" not declared.` );
792
-
793
- }
794
-
795
825
  _getWGSLVertexCode( shaderData ) {
796
826
 
797
827
  return `${ this.getSignature() }
@@ -831,11 +861,14 @@ fn main( ${shaderData.attributes} ) -> NodeVaryingsStruct {
831
861
  // uniforms
832
862
  ${shaderData.uniforms}
833
863
 
864
+ // structs
865
+ ${shaderData.structs}
866
+
834
867
  // codes
835
868
  ${shaderData.codes}
836
869
 
837
870
  @fragment
838
- fn main( ${shaderData.varyings} ) -> @location( 0 ) vec4<f32> {
871
+ fn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {
839
872
 
840
873
  // vars
841
874
  ${shaderData.vars}
@@ -2,7 +2,7 @@ import NodeFunction from '../../../nodes/core/NodeFunction.js';
2
2
  import NodeFunctionInput from '../../../nodes/core/NodeFunctionInput.js';
3
3
 
4
4
  const declarationRegexp = /^[fn]*\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*[\-\>]*\s*([a-z_0-9]+)?/i;
5
- const propertiesRegexp = /[a-z_0-9]+/ig;
5
+ const propertiesRegexp = /[a-z_0-9]+|<(.*?)>+/ig;
6
6
 
7
7
  const wgslTypeLib = {
8
8
  f32: 'float'
@@ -46,7 +46,7 @@ const parse = ( source ) => {
46
46
 
47
47
  // precision
48
48
 
49
- if ( i < propsMatches.length && /^[fui]\d{2}$/.test( propsMatches[ i ][ 0 ] ) === true )
49
+ if ( i < propsMatches.length && propsMatches[ i ][ 0 ].startsWith( '<' ) === true )
50
50
  i ++;
51
51
 
52
52
  // add input
@@ -1,6 +1,7 @@
1
1
  import {
2
- GPUTextureAspect, GPUTextureViewDimension, GPUBufferBindingType
2
+ GPUTextureAspect, GPUTextureViewDimension, GPUBufferBindingType, GPUTextureSampleType
3
3
  } from './WebGPUConstants.js';
4
+ import { FloatType } from 'three';
4
5
 
5
6
  class WebGPUBindingUtils {
6
7
 
@@ -58,13 +59,25 @@ class WebGPUBindingUtils {
58
59
 
59
60
  bindingGPU.externalTexture = {}; // GPUExternalTextureBindingLayout
60
61
 
62
+ } else if ( binding.isSampledTexture && binding.store ) {
63
+
64
+ const format = this.backend.get( binding.texture ).texture.format;
65
+
66
+ bindingGPU.storageTexture = { format }; // GPUStorageTextureBindingLayout
67
+
61
68
  } else if ( binding.isSampledTexture ) {
62
69
 
63
70
  const texture = {}; // GPUTextureBindingLayout
64
71
 
65
72
  if ( binding.texture.isDepthTexture ) {
66
73
 
67
- texture.sampleType = 'depth';
74
+ texture.sampleType = GPUTextureSampleType.Depth;
75
+
76
+ } else if ( binding.texture.isDataTexture && binding.texture.type === FloatType ) {
77
+
78
+ // @TODO: Add support for this soon: backend.hasFeature( 'float32-filterable' )
79
+
80
+ texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
68
81
 
69
82
  }
70
83
 
@@ -64,25 +64,49 @@ class WebGPUPipelineUtils {
64
64
 
65
65
  }
66
66
 
67
- //
67
+ const colorWriteMask = this._getColorWriteMask( material );
68
+
69
+ const targets = [];
70
+
71
+ if ( renderObject.context.textures !== null ) {
72
+
73
+ const textures = renderObject.context.textures;
74
+
75
+ for ( let i = 0; i < textures.length; i ++ ) {
76
+
77
+ const colorFormat = utils.getTextureFormatGPU( textures[ i ] );
78
+
79
+ targets.push( {
80
+ format: colorFormat,
81
+ blend: blending,
82
+ writeMask: colorWriteMask
83
+ } );
84
+
85
+ }
86
+
87
+ } else {
88
+
89
+ const colorFormat = utils.getCurrentColorFormat( renderObject.context );
90
+
91
+ targets.push( {
92
+ format: colorFormat,
93
+ blend: blending,
94
+ writeMask: colorWriteMask
95
+ } );
96
+
97
+ }
68
98
 
69
99
  const vertexModule = backend.get( vertexProgram ).module;
70
100
  const fragmentModule = backend.get( fragmentProgram ).module;
71
101
 
72
102
  const primitiveState = this._getPrimitiveState( object, geometry, material );
73
- const colorWriteMask = this._getColorWriteMask( material );
74
103
  const depthCompare = this._getDepthCompare( material );
75
- const colorFormat = utils.getCurrentColorFormat( renderObject.context );
76
104
  const depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context );
77
105
  const sampleCount = utils.getSampleCount( renderObject.context );
78
106
 
79
107
  pipelineData.pipeline = device.createRenderPipeline( {
80
108
  vertex: Object.assign( {}, vertexModule, { buffers: vertexBuffers } ),
81
- fragment: Object.assign( {}, fragmentModule, { targets: [ {
82
- format: colorFormat,
83
- blend: blending,
84
- writeMask: colorWriteMask
85
- } ] } ),
109
+ fragment: Object.assign( {}, fragmentModule, { targets } ),
86
110
  primitive: primitiveState,
87
111
  depthStencil: {
88
112
  format: depthStencilFormat,
@@ -94,7 +118,8 @@ class WebGPUPipelineUtils {
94
118
  stencilWriteMask: material.stencilWriteMask
95
119
  },
96
120
  multisample: {
97
- count: sampleCount
121
+ count: sampleCount,
122
+ alphaToCoverageEnabled: material.alphaToCoverage
98
123
  },
99
124
  layout: device.createPipelineLayout( {
100
125
  bindGroupLayouts: [ bindingsData.layout ]
@@ -441,17 +466,17 @@ class WebGPUPipelineUtils {
441
466
  switch ( material.side ) {
442
467
 
443
468
  case FrontSide:
444
- descriptor.frontFace = GPUFrontFace.CW;
445
- descriptor.cullMode = GPUCullMode.Front;
469
+ descriptor.frontFace = GPUFrontFace.CCW;
470
+ descriptor.cullMode = GPUCullMode.Back;
446
471
  break;
447
472
 
448
473
  case BackSide:
449
- descriptor.frontFace = GPUFrontFace.CW;
450
- descriptor.cullMode = GPUCullMode.Back;
474
+ descriptor.frontFace = GPUFrontFace.CCW;
475
+ descriptor.cullMode = GPUCullMode.Front;
451
476
  break;
452
477
 
453
478
  case DoubleSide:
454
- descriptor.frontFace = GPUFrontFace.CW;
479
+ descriptor.frontFace = GPUFrontFace.CCW;
455
480
  descriptor.cullMode = GPUCullMode.None;
456
481
  break;
457
482