super-three 0.156.0 → 0.157.1

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 (223) hide show
  1. package/build/three.cjs +753 -277
  2. package/build/three.js +753 -277
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +750 -276
  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/csm/CSMShader.js +25 -21
  9. package/examples/jsm/exporters/EXRExporter.js +102 -24
  10. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  11. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  14. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  15. package/examples/jsm/lines/LineMaterial.js +90 -156
  16. package/examples/jsm/loaders/3DMLoader.js +378 -104
  17. package/examples/jsm/loaders/GLTFLoader.js +1 -1
  18. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  19. package/examples/jsm/loaders/RGBELoader.js +1 -1
  20. package/examples/jsm/loaders/USDZLoader.js +215 -12
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  22. package/examples/jsm/nodes/Nodes.js +5 -1
  23. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  24. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +2 -2
  25. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  26. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -2
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +6 -5
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  30. package/examples/jsm/nodes/accessors/LineMaterialNode.js +7 -9
  31. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -46
  32. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +9 -9
  33. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  35. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  36. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  38. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  39. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  40. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  41. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  42. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  45. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  47. package/examples/jsm/nodes/accessors/TextureNode.js +12 -6
  48. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  49. package/examples/jsm/nodes/accessors/TextureStoreNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  52. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  53. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  54. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  55. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  56. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  57. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  58. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  59. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  60. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  61. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  62. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  63. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  64. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  65. package/examples/jsm/nodes/core/InputNode.js +1 -1
  66. package/examples/jsm/nodes/core/Node.js +28 -13
  67. package/examples/jsm/nodes/core/NodeBuilder.js +3 -17
  68. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  69. package/examples/jsm/nodes/core/OutputStructNode.js +8 -4
  70. package/examples/jsm/nodes/core/PropertyNode.js +3 -3
  71. package/examples/jsm/nodes/core/StackNode.js +1 -1
  72. package/examples/jsm/nodes/core/StructTypeNode.js +1 -1
  73. package/examples/jsm/nodes/core/TempNode.js +1 -1
  74. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  75. package/examples/jsm/nodes/core/VarNode.js +1 -1
  76. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  77. package/examples/jsm/nodes/core/constants.js +1 -1
  78. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  79. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  82. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  83. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  84. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  85. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  86. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  87. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  88. package/examples/jsm/nodes/display/ViewportNode.js +2 -2
  89. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  90. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  91. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  92. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  93. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  94. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  95. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  97. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  98. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  99. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  100. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  101. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  102. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  103. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  105. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  106. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  107. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  108. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  109. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  111. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +2 -2
  112. package/examples/jsm/nodes/materials/Materials.js +1 -0
  113. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  114. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  115. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  116. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  117. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  118. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  119. package/examples/jsm/nodes/materials/NodeMaterial.js +27 -26
  120. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  121. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  122. package/examples/jsm/nodes/math/CondNode.js +1 -1
  123. package/examples/jsm/nodes/math/HashNode.js +8 -9
  124. package/examples/jsm/nodes/math/MathNode.js +2 -2
  125. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  126. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  127. package/examples/jsm/nodes/shadernode/ShaderNode.js +81 -28
  128. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  129. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  130. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  131. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  132. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  133. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  134. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  135. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  136. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  137. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  138. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  139. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  140. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  141. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  142. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  143. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  144. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  145. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  146. package/examples/jsm/objects/Sky.js +1 -3
  147. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  148. package/examples/jsm/renderers/common/Background.js +2 -2
  149. package/examples/jsm/renderers/common/Bindings.js +3 -5
  150. package/examples/jsm/renderers/common/Pipelines.js +7 -7
  151. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  152. package/examples/jsm/renderers/common/RenderObject.js +40 -16
  153. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  154. package/examples/jsm/renderers/common/Renderer.js +40 -13
  155. package/examples/jsm/renderers/common/SampledTexture.js +4 -2
  156. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  157. package/examples/jsm/renderers/common/Textures.js +14 -9
  158. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  159. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +20 -10
  160. package/examples/jsm/renderers/common/nodes/NodeSampler.js +0 -6
  161. package/examples/jsm/renderers/common/nodes/Nodes.js +51 -24
  162. package/examples/jsm/renderers/webgl/WebGLBackend.js +100 -5
  163. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +92 -6
  164. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +13 -0
  165. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +3 -3
  166. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +14 -2
  167. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +5 -5
  168. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +6 -3
  169. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +5 -5
  170. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  171. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +197 -167
  172. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  173. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  174. package/examples/jsm/shaders/OutputShader.js +2 -2
  175. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  176. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  177. package/package.json +1 -1
  178. package/src/Three.js +0 -2
  179. package/src/animation/AnimationUtils.js +3 -20
  180. package/src/animation/KeyframeTrack.js +8 -8
  181. package/src/cameras/Camera.js +1 -5
  182. package/src/cameras/CubeCamera.js +14 -8
  183. package/src/constants.js +7 -1
  184. package/src/core/RenderTarget.js +16 -7
  185. package/src/extras/core/CurvePath.js +4 -1
  186. package/src/loaders/MaterialLoader.js +1 -1
  187. package/src/loaders/ObjectLoader.js +6 -0
  188. package/src/materials/Material.js +8 -8
  189. package/src/math/Color.js +1 -5
  190. package/src/math/ColorManagement.js +82 -60
  191. package/src/objects/Sprite.js +2 -2
  192. package/src/renderers/WebGLMultiviewRenderTarget.js +35 -0
  193. package/src/renderers/WebGLRenderer.js +78 -22
  194. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  195. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  196. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  197. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  198. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  199. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  200. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  201. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  202. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  203. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  204. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  205. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  206. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  207. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  208. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  209. package/src/renderers/shaders/UniformsUtils.js +2 -2
  210. package/src/renderers/webgl/WebGLBackground.js +5 -4
  211. package/src/renderers/webgl/WebGLLights.js +14 -3
  212. package/src/renderers/webgl/WebGLMultiview.js +100 -0
  213. package/src/renderers/webgl/WebGLProgram.js +84 -5
  214. package/src/renderers/webgl/WebGLPrograms.js +11 -2
  215. package/src/renderers/webgl/WebGLTextures.js +214 -26
  216. package/src/renderers/webgl/WebGLUtils.js +21 -23
  217. package/src/renderers/webxr/WebXRManager.js +36 -12
  218. package/src/scenes/Fog.js +1 -0
  219. package/src/scenes/FogExp2.js +1 -0
  220. package/src/textures/Source.js +2 -2
  221. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  222. package/src/lights/AmbientLightProbe.js +0 -21
  223. package/src/lights/HemisphereLightProbe.js +0 -30
@@ -8,9 +8,21 @@ export const nodeFrame = new NodeFrame();
8
8
 
9
9
  Material.prototype.onBuild = function ( object, parameters, renderer ) {
10
10
 
11
- if ( object.material.isNodeMaterial === true ) {
11
+ if ( Array.isArray( object.material ) ) {
12
12
 
13
- builders.set( this, new WebGLNodeBuilder( object, renderer, parameters ).build() );
13
+ for ( const material of object.material ) {
14
+
15
+ if ( material.isNodeMaterial === true ) {
16
+
17
+ builders.set( material, new WebGLNodeBuilder( object, renderer, parameters, material ).build() );
18
+
19
+ }
20
+
21
+ }
22
+
23
+ } else if ( object.material.isNodeMaterial === true ) {
24
+
25
+ builders.set( object.material, new WebGLNodeBuilder( object, renderer, parameters ).build() );
14
26
 
15
27
  }
16
28
 
@@ -191,7 +191,7 @@ class WebGPUBackend extends Backend {
191
191
  const textureData = this.get( textures[ i ] );
192
192
 
193
193
  const textureView = textureData.texture.createView( {
194
- baseMipLevel: 0,
194
+ baseMipLevel: renderContext.activeMipmapLevel,
195
195
  mipLevelCount: 1,
196
196
  baseArrayLayer: renderContext.activeCubeFace,
197
197
  dimension: GPUTextureViewDimension.TwoD
@@ -350,7 +350,7 @@ class WebGPUBackend extends Backend {
350
350
 
351
351
  const { x, y, width, height } = renderContext.scissorValue;
352
352
 
353
- currentPass.setScissorRect( x, y, width, height );
353
+ currentPass.setScissorRect( x, renderContext.height - height - y, width, height );
354
354
 
355
355
  }
356
356
 
@@ -467,7 +467,7 @@ class WebGPUBackend extends Backend {
467
467
 
468
468
  if ( results[ i ] !== 0n ) {
469
469
 
470
- occluded.add( currentOcclusionQueryObjects[ i ], true );
470
+ occluded.add( currentOcclusionQueryObjects[ i ] );
471
471
 
472
472
  }
473
473
 
@@ -484,9 +484,9 @@ class WebGPUBackend extends Backend {
484
484
  updateViewport( renderContext ) {
485
485
 
486
486
  const { currentPass } = this.get( renderContext );
487
- const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
487
+ let { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
488
488
 
489
- currentPass.setViewport( x, y, width, height, minDepth, maxDepth );
489
+ currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
490
490
 
491
491
  }
492
492
 
@@ -11,6 +11,8 @@ import { getVectorLength, getStrideLength } from '../../common/BufferUtils.js';
11
11
 
12
12
  import { NodeBuilder, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
13
13
 
14
+ import { getFormat } from '../utils/WebGPUTextureUtils.js';
15
+
14
16
  import WGSLNodeParser from './WGSLNodeParser.js';
15
17
 
16
18
  const gpuShaderStageLib = {
@@ -58,7 +60,7 @@ const wgslTypeLib = {
58
60
 
59
61
  const wgslMethods = {
60
62
  dFdx: 'dpdx',
61
- dFdy: 'dpdy',
63
+ dFdy: '- dpdy',
62
64
  mod: 'threejs_mod',
63
65
  lessThanEqual: 'threejs_lessThanEqual',
64
66
  inversesqrt: 'inverseSqrt'
@@ -659,8 +661,9 @@ class WGSLNodeBuilder extends NodeBuilder {
659
661
 
660
662
  } else if ( uniform.node.isStoreTextureNode === true ) {
661
663
 
662
- // @TODO: Add support for other formats
663
- textureType = 'texture_storage_2d<rgba8unorm, write>';
664
+ const format = getFormat( texture );
665
+
666
+ textureType = 'texture_storage_2d<' + format + ', write>';
664
667
 
665
668
  } else {
666
669
 
@@ -466,17 +466,17 @@ class WebGPUPipelineUtils {
466
466
  switch ( material.side ) {
467
467
 
468
468
  case FrontSide:
469
- descriptor.frontFace = GPUFrontFace.CW;
470
- descriptor.cullMode = GPUCullMode.Front;
469
+ descriptor.frontFace = GPUFrontFace.CCW;
470
+ descriptor.cullMode = GPUCullMode.Back;
471
471
  break;
472
472
 
473
473
  case BackSide:
474
- descriptor.frontFace = GPUFrontFace.CW;
475
- descriptor.cullMode = GPUCullMode.Back;
474
+ descriptor.frontFace = GPUFrontFace.CCW;
475
+ descriptor.cullMode = GPUCullMode.Front;
476
476
  break;
477
477
 
478
478
  case DoubleSide:
479
- descriptor.frontFace = GPUFrontFace.CW;
479
+ descriptor.frontFace = GPUFrontFace.CCW;
480
480
  descriptor.cullMode = GPUCullMode.None;
481
481
  break;
482
482
 
@@ -0,0 +1,285 @@
1
+ import { GPUTextureViewDimension, GPUIndexFormat, GPUFilterMode, GPUPrimitiveTopology, GPULoadOp, GPUStoreOp } from './WebGPUConstants.js';
2
+
3
+ class WebGPUTexturePassUtils {
4
+
5
+ constructor( device ) {
6
+
7
+ this.device = device;
8
+
9
+ const mipmapVertexSource = `
10
+ struct VarysStruct {
11
+ @builtin( position ) Position: vec4<f32>,
12
+ @location( 0 ) vTex : vec2<f32>
13
+ };
14
+
15
+ @vertex
16
+ fn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {
17
+
18
+ var Varys : VarysStruct;
19
+
20
+ var pos = array< vec2<f32>, 4 >(
21
+ vec2<f32>( -1.0, 1.0 ),
22
+ vec2<f32>( 1.0, 1.0 ),
23
+ vec2<f32>( -1.0, -1.0 ),
24
+ vec2<f32>( 1.0, -1.0 )
25
+ );
26
+
27
+ var tex = array< vec2<f32>, 4 >(
28
+ vec2<f32>( 0.0, 0.0 ),
29
+ vec2<f32>( 1.0, 0.0 ),
30
+ vec2<f32>( 0.0, 1.0 ),
31
+ vec2<f32>( 1.0, 1.0 )
32
+ );
33
+
34
+ Varys.vTex = tex[ vertexIndex ];
35
+ Varys.Position = vec4<f32>( pos[ vertexIndex ], 0.0, 1.0 );
36
+
37
+ return Varys;
38
+
39
+ }
40
+ `;
41
+
42
+ const mipmapFragmentSource = `
43
+ @group( 0 ) @binding( 0 )
44
+ var imgSampler : sampler;
45
+
46
+ @group( 0 ) @binding( 1 )
47
+ var img : texture_2d<f32>;
48
+
49
+ @fragment
50
+ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
51
+
52
+ return textureSample( img, imgSampler, vTex );
53
+
54
+ }
55
+ `;
56
+
57
+ const flipYFragmentSource = `
58
+ @group( 0 ) @binding( 0 )
59
+ var imgSampler : sampler;
60
+
61
+ @group( 0 ) @binding( 1 )
62
+ var img : texture_2d<f32>;
63
+
64
+ @fragment
65
+ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
66
+
67
+ return textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );
68
+
69
+ }
70
+ `;
71
+ this.mipmapSampler = device.createSampler( { minFilter: GPUFilterMode.Linear } );
72
+ this.flipYSampler = device.createSampler( { minFilter: GPUFilterMode.Nearest } ); //@TODO?: Consider using textureLoad()
73
+
74
+ // We'll need a new pipeline for every texture format used.
75
+ this.transferPipelines = {};
76
+ this.flipYPipelines = {};
77
+
78
+ this.mipmapVertexShaderModule = device.createShaderModule( {
79
+ label: 'mipmapVertex',
80
+ code: mipmapVertexSource
81
+ } );
82
+
83
+ this.mipmapFragmentShaderModule = device.createShaderModule( {
84
+ label: 'mipmapFragment',
85
+ code: mipmapFragmentSource
86
+ } );
87
+
88
+ this.flipYFragmentShaderModule = device.createShaderModule( {
89
+ label: 'flipYFragment',
90
+ code: flipYFragmentSource
91
+ } );
92
+
93
+ }
94
+
95
+ getTransferPipeline( format ) {
96
+
97
+ let pipeline = this.transferPipelines[ format ];
98
+
99
+ if ( pipeline === undefined ) {
100
+
101
+ pipeline = this.device.createRenderPipeline( {
102
+ vertex: {
103
+ module: this.mipmapVertexShaderModule,
104
+ entryPoint: 'main'
105
+ },
106
+ fragment: {
107
+ module: this.mipmapFragmentShaderModule,
108
+ entryPoint: 'main',
109
+ targets: [ { format } ]
110
+ },
111
+ primitive: {
112
+ topology: GPUPrimitiveTopology.TriangleStrip,
113
+ stripIndexFormat: GPUIndexFormat.Uint32
114
+ },
115
+ layout: 'auto'
116
+ } );
117
+
118
+ this.transferPipelines[ format ] = pipeline;
119
+
120
+ }
121
+
122
+ return pipeline;
123
+
124
+ }
125
+
126
+ getFlipYPipeline( format ) {
127
+
128
+ let pipeline = this.flipYPipelines[ format ];
129
+
130
+ if ( pipeline === undefined ) {
131
+
132
+ pipeline = this.device.createRenderPipeline( {
133
+ vertex: {
134
+ module: this.mipmapVertexShaderModule,
135
+ entryPoint: 'main'
136
+ },
137
+ fragment: {
138
+ module: this.flipYFragmentShaderModule,
139
+ entryPoint: 'main',
140
+ targets: [ { format } ]
141
+ },
142
+ primitive: {
143
+ topology: GPUPrimitiveTopology.TriangleStrip,
144
+ stripIndexFormat: GPUIndexFormat.Uint32
145
+ },
146
+ layout: 'auto'
147
+ } );
148
+
149
+ this.flipYPipelines[ format ] = pipeline;
150
+
151
+ }
152
+
153
+ return pipeline;
154
+
155
+ }
156
+
157
+ flipY( textureGPU, textureGPUDescriptor, baseArrayLayer = 0 ) {
158
+
159
+ const format = textureGPUDescriptor.format;
160
+ const { width, height } = textureGPUDescriptor.size;
161
+
162
+ const transferPipeline = this.getTransferPipeline( format );
163
+ const flipYPipeline = this.getFlipYPipeline( format );
164
+
165
+ const tempTexture = this.device.createTexture( {
166
+ size: { width, height, depthOrArrayLayers: 1 },
167
+ format,
168
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
169
+ } );
170
+
171
+ const srcView = textureGPU.createView( {
172
+ baseMipLevel: 0,
173
+ mipLevelCount: 1,
174
+ dimension: GPUTextureViewDimension.TwoD,
175
+ baseArrayLayer
176
+ } );
177
+
178
+ const dstView = tempTexture.createView( {
179
+ baseMipLevel: 0,
180
+ mipLevelCount: 1,
181
+ dimension: GPUTextureViewDimension.TwoD,
182
+ baseArrayLayer: 0
183
+ } );
184
+
185
+ const commandEncoder = this.device.createCommandEncoder( {} );
186
+
187
+ const pass = ( pipeline, sourceView, destinationView ) => {
188
+
189
+ const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
190
+
191
+ const bindGroup = this.device.createBindGroup( {
192
+ layout: bindGroupLayout,
193
+ entries: [ {
194
+ binding: 0,
195
+ resource: this.flipYSampler
196
+ }, {
197
+ binding: 1,
198
+ resource: sourceView
199
+ } ]
200
+ } );
201
+
202
+ const passEncoder = commandEncoder.beginRenderPass( {
203
+ colorAttachments: [ {
204
+ view: destinationView,
205
+ loadOp: GPULoadOp.Clear,
206
+ storeOp: GPUStoreOp.Store,
207
+ clearValue: [ 0, 0, 0, 0 ]
208
+ } ]
209
+ } );
210
+
211
+ passEncoder.setPipeline( pipeline );
212
+ passEncoder.setBindGroup( 0, bindGroup );
213
+ passEncoder.draw( 4, 1, 0, 0 );
214
+ passEncoder.end();
215
+
216
+ };
217
+
218
+ pass( transferPipeline, srcView, dstView );
219
+ pass( flipYPipeline, dstView, srcView );
220
+
221
+ this.device.queue.submit( [ commandEncoder.finish() ] );
222
+
223
+ tempTexture.destroy();
224
+
225
+ }
226
+
227
+ generateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer = 0 ) {
228
+
229
+ const pipeline = this.getTransferPipeline( textureGPUDescriptor.format );
230
+
231
+ const commandEncoder = this.device.createCommandEncoder( {} );
232
+ const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
233
+
234
+ let srcView = textureGPU.createView( {
235
+ baseMipLevel: 0,
236
+ mipLevelCount: 1,
237
+ dimension: GPUTextureViewDimension.TwoD,
238
+ baseArrayLayer
239
+ } );
240
+
241
+ for ( let i = 1; i < textureGPUDescriptor.mipLevelCount; i ++ ) {
242
+
243
+ const bindGroup = this.device.createBindGroup( {
244
+ layout: bindGroupLayout,
245
+ entries: [ {
246
+ binding: 0,
247
+ resource: this.mipmapSampler
248
+ }, {
249
+ binding: 1,
250
+ resource: srcView
251
+ } ]
252
+ } );
253
+
254
+ const dstView = textureGPU.createView( {
255
+ baseMipLevel: i,
256
+ mipLevelCount: 1,
257
+ dimension: GPUTextureViewDimension.TwoD,
258
+ baseArrayLayer
259
+ } );
260
+
261
+ const passEncoder = commandEncoder.beginRenderPass( {
262
+ colorAttachments: [ {
263
+ view: dstView,
264
+ loadOp: GPULoadOp.Clear,
265
+ storeOp: GPUStoreOp.Store,
266
+ clearValue: [ 0, 0, 0, 0 ]
267
+ } ]
268
+ } );
269
+
270
+ passEncoder.setPipeline( pipeline );
271
+ passEncoder.setBindGroup( 0, bindGroup );
272
+ passEncoder.draw( 4, 1, 0, 0 );
273
+ passEncoder.end();
274
+
275
+ srcView = dstView;
276
+
277
+ }
278
+
279
+ this.device.queue.submit( [ commandEncoder.finish() ] );
280
+
281
+ }
282
+
283
+ }
284
+
285
+ export default WebGPUTexturePassUtils;