@plastic-software/three 0.182.0 → 0.183.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 (299) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +11521 -10878
  3. package/build/three.core.js +11732 -11340
  4. package/build/three.core.min.js +2 -2
  5. package/build/three.module.js +510 -263
  6. package/build/three.module.min.js +2 -2
  7. package/build/three.tsl.js +7 -11
  8. package/build/three.tsl.min.js +2 -2
  9. package/build/three.webgpu.js +3072 -2607
  10. package/build/three.webgpu.min.js +2 -2
  11. package/build/three.webgpu.nodes.js +3071 -2607
  12. package/build/three.webgpu.nodes.min.js +2 -2
  13. package/examples/jsm/Addons.js +0 -3
  14. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  15. package/examples/jsm/controls/ArcballControls.js +3 -3
  16. package/examples/jsm/controls/OrbitControls.js +103 -0
  17. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  18. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  19. package/examples/jsm/environments/RoomEnvironment.js +1 -0
  20. package/examples/jsm/exporters/EXRExporter.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  22. package/examples/jsm/exporters/USDZExporter.js +22 -3
  23. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  24. package/examples/jsm/helpers/ViewHelper.js +67 -8
  25. package/examples/jsm/inspector/Inspector.js +21 -5
  26. package/examples/jsm/inspector/tabs/Console.js +39 -5
  27. package/examples/jsm/inspector/tabs/Parameters.js +16 -0
  28. package/examples/jsm/inspector/ui/Style.js +25 -1
  29. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  30. package/examples/jsm/lines/LineMaterial.js +6 -0
  31. package/examples/jsm/loaders/3MFLoader.js +2 -2
  32. package/examples/jsm/loaders/AMFLoader.js +2 -2
  33. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  34. package/examples/jsm/loaders/EXRLoader.js +5 -5
  35. package/examples/jsm/loaders/FBXLoader.js +2 -2
  36. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  37. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  38. package/examples/jsm/loaders/KMZLoader.js +5 -5
  39. package/examples/jsm/loaders/KTX2Loader.js +5 -5
  40. package/examples/jsm/loaders/LWOLoader.js +7 -39
  41. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  42. package/examples/jsm/loaders/PCDLoader.js +3 -2
  43. package/examples/jsm/loaders/USDLoader.js +100 -40
  44. package/examples/jsm/loaders/UltraHDRLoader.js +182 -30
  45. package/examples/jsm/loaders/VRMLLoader.js +77 -0
  46. package/examples/jsm/loaders/VTKLoader.js +37 -24
  47. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  48. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  49. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  50. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  51. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  52. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  53. package/examples/jsm/objects/LensflareMesh.js +1 -1
  54. package/examples/jsm/objects/Sky.js +76 -4
  55. package/examples/jsm/objects/SkyMesh.js +114 -7
  56. package/examples/jsm/objects/Water.js +4 -3
  57. package/examples/jsm/objects/Water2.js +5 -3
  58. package/examples/jsm/objects/WaterMesh.js +5 -7
  59. package/examples/jsm/physics/JoltPhysics.js +7 -5
  60. package/examples/jsm/physics/RapierPhysics.js +6 -4
  61. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  62. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  63. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  64. package/examples/jsm/renderers/SVGRenderer.js +2 -2
  65. package/examples/jsm/shaders/GTAOShader.js +19 -6
  66. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  67. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  68. package/examples/jsm/shaders/SAOShader.js +17 -4
  69. package/examples/jsm/shaders/SSAOShader.js +11 -1
  70. package/examples/jsm/shaders/SSRShader.js +6 -5
  71. package/examples/jsm/shaders/VignetteShader.js +1 -1
  72. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  73. package/examples/jsm/tsl/display/AnaglyphPassNode.js +456 -16
  74. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  75. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  76. package/examples/jsm/tsl/display/BloomNode.js +5 -5
  77. package/examples/jsm/tsl/display/CRT.js +150 -0
  78. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  79. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  80. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  81. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  82. package/examples/jsm/tsl/display/GTAONode.js +2 -2
  83. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  84. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  85. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  86. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  87. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  88. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  89. package/examples/jsm/tsl/display/PixelationPassNode.js +5 -5
  90. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  91. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  92. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  93. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  94. package/examples/jsm/tsl/display/SSGINode.js +2 -2
  95. package/examples/jsm/tsl/display/SSRNode.js +7 -7
  96. package/examples/jsm/tsl/display/SSSNode.js +2 -2
  97. package/examples/jsm/tsl/display/Shape.js +29 -0
  98. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  99. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  100. package/examples/jsm/tsl/display/TRAANode.js +9 -12
  101. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  102. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  103. package/examples/jsm/tsl/math/Bayer.js +40 -1
  104. package/examples/jsm/utils/LDrawUtils.js +1 -1
  105. package/package.json +11 -19
  106. package/src/Three.Core.js +1 -1
  107. package/src/Three.TSL.js +5 -9
  108. package/src/Three.WebGPU.Nodes.js +2 -0
  109. package/src/Three.WebGPU.js +3 -0
  110. package/src/Three.js +1 -0
  111. package/src/animation/AnimationAction.js +1 -1
  112. package/src/animation/AnimationClip.js +1 -1
  113. package/src/animation/AnimationMixer.js +6 -0
  114. package/src/animation/KeyframeTrack.js +46 -7
  115. package/src/animation/PropertyMixer.js +4 -4
  116. package/src/audio/Audio.js +1 -1
  117. package/src/audio/AudioListener.js +5 -3
  118. package/src/cameras/Camera.js +32 -2
  119. package/src/cameras/CubeCamera.js +20 -0
  120. package/src/constants.js +30 -1
  121. package/src/core/Clock.js +7 -0
  122. package/src/core/Object3D.js +56 -4
  123. package/src/core/RenderTarget.js +3 -4
  124. package/src/extras/PMREMGenerator.js +4 -8
  125. package/src/geometries/TorusGeometry.js +8 -3
  126. package/src/helpers/CameraHelper.js +3 -0
  127. package/src/helpers/DirectionalLightHelper.js +4 -1
  128. package/src/helpers/HemisphereLightHelper.js +3 -0
  129. package/src/helpers/PointLightHelper.js +0 -24
  130. package/src/helpers/SpotLightHelper.js +3 -0
  131. package/src/lights/LightShadow.js +15 -3
  132. package/src/lights/webgpu/IESSpotLight.js +2 -1
  133. package/src/loaders/Cache.js +28 -0
  134. package/src/loaders/FileLoader.js +1 -1
  135. package/src/loaders/ImageBitmapLoader.js +8 -3
  136. package/src/loaders/Loader.js +6 -0
  137. package/src/loaders/ObjectLoader.js +18 -1
  138. package/src/materials/MeshLambertMaterial.js +9 -0
  139. package/src/materials/MeshPhongMaterial.js +9 -0
  140. package/src/materials/nodes/Line2NodeMaterial.js +5 -5
  141. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -0
  142. package/src/materials/nodes/NodeMaterial.js +15 -24
  143. package/src/materials/nodes/manager/NodeMaterialObserver.js +9 -3
  144. package/src/math/Line3.js +3 -5
  145. package/src/math/MathUtils.js +10 -10
  146. package/src/math/Matrix4.js +35 -26
  147. package/src/math/Quaternion.js +3 -29
  148. package/src/math/Vector3.js +3 -3
  149. package/src/math/interpolants/BezierInterpolant.js +108 -0
  150. package/src/nodes/Nodes.js +87 -68
  151. package/src/nodes/TSL.js +2 -5
  152. package/src/nodes/accessors/Arrays.js +1 -1
  153. package/src/nodes/accessors/Bitangent.js +5 -5
  154. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  155. package/src/nodes/accessors/Camera.js +149 -28
  156. package/src/nodes/accessors/InstanceNode.js +105 -40
  157. package/src/nodes/accessors/Normal.js +9 -9
  158. package/src/nodes/accessors/Position.js +34 -2
  159. package/src/nodes/accessors/SceneProperties.js +53 -0
  160. package/src/nodes/accessors/SkinningNode.js +12 -24
  161. package/src/nodes/accessors/StorageBufferNode.js +0 -19
  162. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  163. package/src/nodes/accessors/Tangent.js +3 -3
  164. package/src/nodes/accessors/Texture3DNode.js +6 -34
  165. package/src/nodes/accessors/TextureNode.js +58 -22
  166. package/src/nodes/accessors/UniformArrayNode.js +2 -0
  167. package/src/nodes/core/MRTNode.js +48 -2
  168. package/src/nodes/core/Node.js +29 -3
  169. package/src/nodes/core/NodeBuilder.js +115 -40
  170. package/src/nodes/core/NodeError.js +28 -0
  171. package/src/nodes/core/NodeUtils.js +5 -3
  172. package/src/nodes/core/OutputStructNode.js +12 -10
  173. package/src/nodes/core/ParameterNode.js +2 -1
  174. package/src/nodes/core/StackNode.js +9 -8
  175. package/src/nodes/core/StackTrace.js +139 -0
  176. package/src/nodes/core/StructNode.js +15 -0
  177. package/src/nodes/core/SubBuildNode.js +1 -1
  178. package/src/nodes/core/UniformNode.js +2 -1
  179. package/src/nodes/core/VarNode.js +1 -1
  180. package/src/nodes/core/VaryingNode.js +1 -18
  181. package/src/nodes/display/BlendModes.js +0 -64
  182. package/src/nodes/display/ColorAdjustment.js +17 -0
  183. package/src/nodes/display/ColorSpaceNode.js +3 -3
  184. package/src/nodes/display/NormalMapNode.js +2 -2
  185. package/src/nodes/display/PassNode.js +21 -2
  186. package/src/nodes/display/RenderOutputNode.js +3 -3
  187. package/src/nodes/display/ScreenNode.js +2 -1
  188. package/src/nodes/display/ToneMappingNode.js +1 -1
  189. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  190. package/src/nodes/display/ViewportDepthNode.js +52 -4
  191. package/src/nodes/display/ViewportTextureNode.js +21 -4
  192. package/src/nodes/fog/Fog.js +18 -35
  193. package/src/nodes/functions/PhysicalLightingModel.js +25 -3
  194. package/src/nodes/geometry/RangeNode.js +4 -2
  195. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  196. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  197. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  198. package/src/nodes/lighting/PointShadowNode.js +24 -12
  199. package/src/nodes/lighting/ShadowFilterNode.js +15 -43
  200. package/src/nodes/lighting/ShadowNode.js +54 -32
  201. package/src/nodes/math/ConditionalNode.js +2 -2
  202. package/src/nodes/math/MathNode.js +3 -40
  203. package/src/nodes/math/OperatorNode.js +2 -1
  204. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  205. package/src/nodes/tsl/TSLCore.js +13 -10
  206. package/src/nodes/utils/DebugNode.js +11 -11
  207. package/src/nodes/utils/JoinNode.js +2 -2
  208. package/src/nodes/utils/LoopNode.js +1 -1
  209. package/src/nodes/utils/MemberNode.js +1 -1
  210. package/src/nodes/utils/RTTNode.js +1 -1
  211. package/src/nodes/utils/ReflectorNode.js +2 -3
  212. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  213. package/src/nodes/utils/UVUtils.js +4 -2
  214. package/src/objects/BatchedMesh.js +22 -12
  215. package/src/objects/InstancedMesh.js +11 -0
  216. package/src/renderers/WebGLRenderer.js +34 -60
  217. package/src/renderers/common/Backend.js +21 -0
  218. package/src/renderers/common/Background.js +7 -4
  219. package/src/renderers/common/BindGroup.js +1 -9
  220. package/src/renderers/common/Bindings.js +20 -5
  221. package/src/renderers/common/BlendMode.js +143 -0
  222. package/src/renderers/common/BundleGroup.js +1 -1
  223. package/src/renderers/common/CubeRenderTarget.js +50 -6
  224. package/src/renderers/common/Geometries.js +17 -3
  225. package/src/renderers/common/Lighting.js +5 -21
  226. package/src/renderers/common/Pipelines.js +4 -4
  227. package/src/renderers/common/PostProcessing.js +8 -206
  228. package/src/renderers/common/RenderBundles.js +2 -1
  229. package/src/renderers/common/RenderContext.js +16 -0
  230. package/src/renderers/common/RenderContexts.js +33 -56
  231. package/src/renderers/common/RenderLists.js +2 -1
  232. package/src/renderers/common/RenderObject.js +2 -3
  233. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  234. package/src/renderers/common/RenderObjects.js +18 -2
  235. package/src/renderers/common/RenderPipeline.js +203 -17
  236. package/src/renderers/common/Renderer.js +207 -40
  237. package/src/renderers/common/Sampler.js +4 -4
  238. package/src/renderers/common/StorageBuffer.js +13 -1
  239. package/src/renderers/common/Textures.js +16 -0
  240. package/src/renderers/common/TimestampQueryPool.js +5 -3
  241. package/src/renderers/common/Uniform.js +8 -0
  242. package/src/renderers/common/UniformsGroup.js +60 -0
  243. package/src/renderers/common/XRManager.js +2 -2
  244. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  245. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  246. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  247. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  248. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  249. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  250. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  251. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  252. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +4 -4
  253. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  254. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  255. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  256. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +23 -1
  257. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  258. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +55 -24
  259. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  260. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  261. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  262. package/src/renderers/shaders/ShaderLib.js +4 -2
  263. package/src/renderers/shaders/UniformsLib.js +0 -3
  264. package/src/renderers/webgl/WebGLBackground.js +2 -2
  265. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  266. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  267. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  268. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  269. package/src/renderers/webgl/WebGLObjects.js +3 -1
  270. package/src/renderers/webgl/WebGLProgram.js +2 -2
  271. package/src/renderers/webgl/WebGLPrograms.js +10 -4
  272. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  273. package/src/renderers/webgl/WebGLShadowMap.js +5 -4
  274. package/src/renderers/webgl/WebGLState.js +12 -17
  275. package/src/renderers/webgl-fallback/WebGLBackend.js +71 -7
  276. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +98 -29
  277. package/src/renderers/webgl-fallback/utils/WebGLState.js +168 -7
  278. package/src/renderers/webgpu/WebGPUBackend.js +58 -9
  279. package/src/renderers/webgpu/WebGPURenderer.js +1 -0
  280. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +257 -45
  281. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +8 -19
  282. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  283. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -31
  284. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  285. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +25 -25
  286. package/src/renderers/webgpu/utils/WebGPUUtils.js +10 -6
  287. package/src/renderers/webxr/WebXRManager.js +2 -2
  288. package/src/textures/Texture.js +2 -2
  289. package/src/utils.js +246 -3
  290. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -433
  291. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  292. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  293. package/src/nodes/accessors/SceneNode.js +0 -145
  294. package/src/nodes/code/ScriptableNode.js +0 -726
  295. package/src/nodes/code/ScriptableValueNode.js +0 -253
  296. package/src/nodes/display/PosterizeNode.js +0 -65
  297. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  298. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  299. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,5 +1,5 @@
1
1
  import DataMap from '../../common/DataMap.js';
2
- import { GPUTextureViewDimension, GPUIndexFormat, GPUFilterMode, GPUPrimitiveTopology, GPULoadOp, GPUStoreOp } from './WebGPUConstants.js';
2
+ import { GPUFilterMode, GPULoadOp, GPUStoreOp } from './WebGPUConstants.js';
3
3
 
4
4
  /**
5
5
  * A WebGPU backend utility module used by {@link WebGPUTextureUtils}.
@@ -24,65 +24,78 @@ class WebGPUTexturePassUtils extends DataMap {
24
24
  */
25
25
  this.device = device;
26
26
 
27
- const mipmapVertexSource = `
27
+ const mipmapSource = `
28
28
  struct VarysStruct {
29
- @builtin( position ) Position: vec4<f32>,
30
- @location( 0 ) vTex : vec2<f32>
29
+ @builtin( position ) Position: vec4f,
30
+ @location( 0 ) vTex : vec2f,
31
+ @location( 1 ) @interpolate(flat, either) vBaseArrayLayer: u32,
31
32
  };
32
33
 
34
+ @group( 0 ) @binding ( 2 )
35
+ var<uniform> flipY: u32;
36
+
33
37
  @vertex
34
- fn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {
38
+ fn mainVS(
39
+ @builtin( vertex_index ) vertexIndex : u32,
40
+ @builtin( instance_index ) instanceIndex : u32 ) -> VarysStruct {
35
41
 
36
42
  var Varys : VarysStruct;
37
43
 
38
- var pos = array< vec2<f32>, 4 >(
39
- vec2<f32>( -1.0, 1.0 ),
40
- vec2<f32>( 1.0, 1.0 ),
41
- vec2<f32>( -1.0, -1.0 ),
42
- vec2<f32>( 1.0, -1.0 )
43
- );
44
-
45
- var tex = array< vec2<f32>, 4 >(
46
- vec2<f32>( 0.0, 0.0 ),
47
- vec2<f32>( 1.0, 0.0 ),
48
- vec2<f32>( 0.0, 1.0 ),
49
- vec2<f32>( 1.0, 1.0 )
44
+ var pos = array(
45
+ vec2f( -1, -1 ),
46
+ vec2f( -1, 3 ),
47
+ vec2f( 3, -1 ),
50
48
  );
51
49
 
52
- Varys.vTex = tex[ vertexIndex ];
53
- Varys.Position = vec4<f32>( pos[ vertexIndex ], 0.0, 1.0 );
50
+ let p = pos[ vertexIndex ];
51
+ let mult = select( vec2f( 0.5, -0.5 ), vec2f( 0.5, 0.5 ), flipY != 0 );
52
+ Varys.vTex = p * mult + vec2f( 0.5 );
53
+ Varys.Position = vec4f( p, 0, 1 );
54
+ Varys.vBaseArrayLayer = instanceIndex;
54
55
 
55
56
  return Varys;
56
57
 
57
58
  }
58
- `;
59
59
 
60
- const mipmapFragmentSource = `
61
60
  @group( 0 ) @binding( 0 )
62
61
  var imgSampler : sampler;
63
62
 
64
63
  @group( 0 ) @binding( 1 )
65
- var img : texture_2d<f32>;
64
+ var img2d : texture_2d<f32>;
66
65
 
67
66
  @fragment
68
- fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
67
+ fn main_2d( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
69
68
 
70
- return textureSample( img, imgSampler, vTex );
69
+ return textureSample( img2d, imgSampler, Varys.vTex );
71
70
 
72
71
  }
73
- `;
74
72
 
75
- const flipYFragmentSource = `
76
- @group( 0 ) @binding( 0 )
77
- var imgSampler : sampler;
73
+ @group( 0 ) @binding( 1 )
74
+ var img2dArray : texture_2d_array<f32>;
75
+
76
+ @fragment
77
+ fn main_2d_array( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
78
+
79
+ return textureSample( img2dArray, imgSampler, Varys.vTex, Varys.vBaseArrayLayer );
80
+
81
+ }
82
+
83
+ const faceMat = array(
84
+ mat3x3f( 0, 0, -2, 0, -2, 0, 1, 1, 1 ), // pos-x
85
+ mat3x3f( 0, 0, 2, 0, -2, 0, -1, 1, -1 ), // neg-x
86
+ mat3x3f( 2, 0, 0, 0, 0, 2, -1, 1, -1 ), // pos-y
87
+ mat3x3f( 2, 0, 0, 0, 0, -2, -1, -1, 1 ), // neg-y
88
+ mat3x3f( 2, 0, 0, 0, -2, 0, -1, 1, 1 ), // pos-z
89
+ mat3x3f( -2, 0, 0, 0, -2, 0, 1, 1, -1 ), // neg-z
90
+ );
78
91
 
79
92
  @group( 0 ) @binding( 1 )
80
- var img : texture_2d<f32>;
93
+ var imgCube : texture_cube<f32>;
81
94
 
82
95
  @fragment
83
- fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
96
+ fn main_cube( Varys: VarysStruct ) -> @location( 0 ) vec4<f32> {
84
97
 
85
- return textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );
98
+ return textureSample( imgCube, imgSampler, faceMat[ Varys.vBaseArrayLayer ] * vec3f( fract( Varys.vTex ), 1 ) );
86
99
 
87
100
  }
88
101
  `;
@@ -102,49 +115,40 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
102
115
  this.flipYSampler = device.createSampler( { minFilter: GPUFilterMode.Nearest } ); //@TODO?: Consider using textureLoad()
103
116
 
104
117
  /**
105
- * A cache for GPU render pipelines used for copy/transfer passes.
106
- * Every texture format requires a unique pipeline.
107
- *
108
- * @type {Object<string,GPURenderPipeline>}
118
+ * flip uniform buffer
119
+ * @type {GPUBuffer}
109
120
  */
110
- this.transferPipelines = {};
121
+ this.flipUniformBuffer = device.createBuffer( {
122
+ size: 4,
123
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
124
+ } );
125
+ device.queue.writeBuffer( this.flipUniformBuffer, 0, new Uint32Array( [ 1 ] ) );
111
126
 
112
127
  /**
113
- * A cache for GPU render pipelines used for flipY passes.
114
- * Every texture format requires a unique pipeline.
115
- *
116
- * @type {Object<string,GPURenderPipeline>}
128
+ * no flip uniform buffer
129
+ * @type {GPUBuffer}
117
130
  */
118
- this.flipYPipelines = {};
119
-
120
- /**
121
- * The mipmap vertex shader module.
122
- *
123
- * @type {GPUShaderModule}
124
- */
125
- this.mipmapVertexShaderModule = device.createShaderModule( {
126
- label: 'mipmapVertex',
127
- code: mipmapVertexSource
131
+ this.noFlipUniformBuffer = device.createBuffer( {
132
+ size: 4,
133
+ usage: GPUBufferUsage.UNIFORM
128
134
  } );
129
135
 
130
136
  /**
131
- * The mipmap fragment shader module.
137
+ * A cache for GPU render pipelines used for copy/transfer passes.
138
+ * Every texture format and textureBindingViewDimension combo requires a unique pipeline.
132
139
  *
133
- * @type {GPUShaderModule}
140
+ * @type {Object<string,GPURenderPipeline>}
134
141
  */
135
- this.mipmapFragmentShaderModule = device.createShaderModule( {
136
- label: 'mipmapFragment',
137
- code: mipmapFragmentSource
138
- } );
142
+ this.transferPipelines = {};
139
143
 
140
144
  /**
141
- * The flipY fragment shader module.
145
+ * The mipmap shader module.
142
146
  *
143
147
  * @type {GPUShaderModule}
144
148
  */
145
- this.flipYFragmentShaderModule = device.createShaderModule( {
146
- label: 'flipYFragment',
147
- code: flipYFragmentSource
149
+ this.mipmapShaderModule = device.createShaderModule( {
150
+ label: 'mipmap',
151
+ code: mipmapSource
148
152
  } );
149
153
 
150
154
  }
@@ -154,72 +158,31 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
154
158
  * requires a unique render pipeline for each texture format.
155
159
  *
156
160
  * @param {string} format - The GPU texture format
161
+ * @param {string?} textureBindingViewDimension - The GPU texture binding view dimension
157
162
  * @return {GPURenderPipeline} The GPU render pipeline.
158
163
  */
159
- getTransferPipeline( format ) {
164
+ getTransferPipeline( format, textureBindingViewDimension ) {
160
165
 
161
- let pipeline = this.transferPipelines[ format ];
166
+ textureBindingViewDimension = textureBindingViewDimension || '2d-array';
167
+ const key = `${ format }-${ textureBindingViewDimension }`;
168
+ let pipeline = this.transferPipelines[ key ];
162
169
 
163
170
  if ( pipeline === undefined ) {
164
171
 
165
172
  pipeline = this.device.createRenderPipeline( {
166
- label: `mipmap-${ format }`,
173
+ label: `mipmap-${ format }-${ textureBindingViewDimension }`,
167
174
  vertex: {
168
- module: this.mipmapVertexShaderModule,
169
- entryPoint: 'main'
175
+ module: this.mipmapShaderModule,
170
176
  },
171
177
  fragment: {
172
- module: this.mipmapFragmentShaderModule,
173
- entryPoint: 'main',
178
+ module: this.mipmapShaderModule,
179
+ entryPoint: `main_${ textureBindingViewDimension.replace( '-', '_' ) }`,
174
180
  targets: [ { format } ]
175
181
  },
176
- primitive: {
177
- topology: GPUPrimitiveTopology.TriangleStrip,
178
- stripIndexFormat: GPUIndexFormat.Uint32
179
- },
180
182
  layout: 'auto'
181
183
  } );
182
184
 
183
- this.transferPipelines[ format ] = pipeline;
184
-
185
- }
186
-
187
- return pipeline;
188
-
189
- }
190
-
191
- /**
192
- * Returns a render pipeline for the flipY render pass. The pass
193
- * requires a unique render pipeline for each texture format.
194
- *
195
- * @param {string} format - The GPU texture format
196
- * @return {GPURenderPipeline} The GPU render pipeline.
197
- */
198
- getFlipYPipeline( format ) {
199
-
200
- let pipeline = this.flipYPipelines[ format ];
201
-
202
- if ( pipeline === undefined ) {
203
-
204
- pipeline = this.device.createRenderPipeline( {
205
- label: `flipY-${ format }`,
206
- vertex: {
207
- module: this.mipmapVertexShaderModule,
208
- entryPoint: 'main'
209
- },
210
- fragment: {
211
- module: this.flipYFragmentShaderModule,
212
- entryPoint: 'main',
213
- targets: [ { format } ]
214
- },
215
- primitive: {
216
- topology: GPUPrimitiveTopology.TriangleStrip,
217
- stripIndexFormat: GPUIndexFormat.Uint32
218
- },
219
- layout: 'auto'
220
- } );
221
-
222
- this.flipYPipelines[ format ] = pipeline;
185
+ this.transferPipelines[ key ] = pipeline;
223
186
 
224
187
  }
225
188
 
@@ -239,32 +202,18 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
239
202
  const format = textureGPUDescriptor.format;
240
203
  const { width, height } = textureGPUDescriptor.size;
241
204
 
242
- const transferPipeline = this.getTransferPipeline( format );
243
- const flipYPipeline = this.getFlipYPipeline( format );
244
-
245
205
  const tempTexture = this.device.createTexture( {
246
- size: { width, height, depthOrArrayLayers: 1 },
206
+ size: { width, height },
247
207
  format,
248
208
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
249
209
  } );
250
210
 
251
- const srcView = textureGPU.createView( {
252
- baseMipLevel: 0,
253
- mipLevelCount: 1,
254
- dimension: GPUTextureViewDimension.TwoD,
255
- baseArrayLayer
256
- } );
257
-
258
- const dstView = tempTexture.createView( {
259
- baseMipLevel: 0,
260
- mipLevelCount: 1,
261
- dimension: GPUTextureViewDimension.TwoD,
262
- baseArrayLayer: 0
263
- } );
211
+ const copyTransferPipeline = this.getTransferPipeline( format, textureGPU.textureBindingViewDimension );
212
+ const flipTransferPipeline = this.getTransferPipeline( format, tempTexture.textureBindingViewDimension );
264
213
 
265
214
  const commandEncoder = this.device.createCommandEncoder( {} );
266
215
 
267
- const pass = ( pipeline, sourceView, destinationView ) => {
216
+ const pass = ( pipeline, sourceTexture, sourceArrayLayer, destinationTexture, destinationArrayLayer, flipY ) => {
268
217
 
269
218
  const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
270
219
 
@@ -275,28 +224,40 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
275
224
  resource: this.flipYSampler
276
225
  }, {
277
226
  binding: 1,
278
- resource: sourceView
227
+ resource: sourceTexture.createView( {
228
+ dimension: sourceTexture.textureBindingViewDimension || '2d-array',
229
+ baseMipLevel: 0,
230
+ mipLevelCount: 1,
231
+ } ),
232
+ }, {
233
+ binding: 2,
234
+ resource: { buffer: flipY ? this.flipUniformBuffer : this.noFlipUniformBuffer }
279
235
  } ]
280
236
  } );
281
237
 
282
238
  const passEncoder = commandEncoder.beginRenderPass( {
283
239
  colorAttachments: [ {
284
- view: destinationView,
240
+ view: destinationTexture.createView( {
241
+ dimension: '2d',
242
+ baseMipLevel: 0,
243
+ mipLevelCount: 1,
244
+ baseArrayLayer: destinationArrayLayer,
245
+ arrayLayerCount: 1,
246
+ } ),
285
247
  loadOp: GPULoadOp.Clear,
286
248
  storeOp: GPUStoreOp.Store,
287
- clearValue: [ 0, 0, 0, 0 ]
288
249
  } ]
289
250
  } );
290
251
 
291
252
  passEncoder.setPipeline( pipeline );
292
253
  passEncoder.setBindGroup( 0, bindGroup );
293
- passEncoder.draw( 4, 1, 0, 0 );
254
+ passEncoder.draw( 3, 1, 0, sourceArrayLayer );
294
255
  passEncoder.end();
295
256
 
296
257
  };
297
258
 
298
- pass( transferPipeline, srcView, dstView );
299
- pass( flipYPipeline, dstView, srcView );
259
+ pass( copyTransferPipeline, textureGPU, baseArrayLayer, tempTexture, 0, false );
260
+ pass( flipTransferPipeline, tempTexture, 0, textureGPU, baseArrayLayer, true );
300
261
 
301
262
  this.device.queue.submit( [ commandEncoder.finish() ] );
302
263
 
@@ -308,21 +269,13 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
308
269
  * Generates mipmaps for the given GPU texture.
309
270
  *
310
271
  * @param {GPUTexture} textureGPU - The GPU texture object.
311
- * @param {Object} textureGPUDescriptor - The texture descriptor.
312
- * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.
313
272
  * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
314
273
  */
315
- generateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer = 0, encoder = null ) {
274
+ generateMipmaps( textureGPU, encoder = null ) {
316
275
 
317
276
  const textureData = this.get( textureGPU );
318
277
 
319
- if ( textureData.layers === undefined ) {
320
-
321
- textureData.layers = [];
322
-
323
- }
324
-
325
- const passes = textureData.layers[ baseArrayLayer ] || this._mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer );
278
+ const passes = textureData.layers || this._mipmapCreateBundles( textureGPU );
326
279
 
327
280
  const commandEncoder = encoder || this.device.createCommandEncoder( { label: 'mipmapEncoder' } );
328
281
 
@@ -330,7 +283,7 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
330
283
 
331
284
  if ( encoder === null ) this.device.queue.submit( [ commandEncoder.finish() ] );
332
285
 
333
- textureData.layers[ baseArrayLayer ] = passes;
286
+ textureData.layers = passes;
334
287
 
335
288
  }
336
289
 
@@ -339,68 +292,67 @@ fn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {
339
292
  * are managed as render bundles to improve performance.
340
293
  *
341
294
  * @param {GPUTexture} textureGPU - The GPU texture object.
342
- * @param {Object} textureGPUDescriptor - The texture descriptor.
343
- * @param {number} baseArrayLayer - The index of the first array layer accessible to the texture view.
344
295
  * @return {Array<Object>} An array of render bundles.
345
296
  */
346
- _mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer ) {
297
+ _mipmapCreateBundles( textureGPU ) {
347
298
 
348
- const pipeline = this.getTransferPipeline( textureGPUDescriptor.format );
299
+ const textureBindingViewDimension = textureGPU.textureBindingViewDimension || '2d-array';
300
+ const pipeline = this.getTransferPipeline( textureGPU.format, textureBindingViewDimension );
349
301
 
350
302
  const bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.
351
303
 
352
- let srcView = textureGPU.createView( {
353
- baseMipLevel: 0,
354
- mipLevelCount: 1,
355
- dimension: GPUTextureViewDimension.TwoD,
356
- baseArrayLayer
357
- } );
358
-
359
304
  const passes = [];
360
305
 
361
- for ( let i = 1; i < textureGPUDescriptor.mipLevelCount; i ++ ) {
362
-
363
- const bindGroup = this.device.createBindGroup( {
364
- layout: bindGroupLayout,
365
- entries: [ {
366
- binding: 0,
367
- resource: this.mipmapSampler
368
- }, {
369
- binding: 1,
370
- resource: srcView
371
- } ]
372
- } );
373
-
374
- const dstView = textureGPU.createView( {
375
- baseMipLevel: i,
376
- mipLevelCount: 1,
377
- dimension: GPUTextureViewDimension.TwoD,
378
- baseArrayLayer
379
- } );
380
-
381
- const passDescriptor = {
382
- colorAttachments: [ {
383
- view: dstView,
384
- loadOp: GPULoadOp.Clear,
385
- storeOp: GPUStoreOp.Store,
386
- clearValue: [ 0, 0, 0, 0 ]
387
- } ]
388
- };
389
-
390
- const passEncoder = this.device.createRenderBundleEncoder( {
391
- colorFormats: [ textureGPUDescriptor.format ]
392
- } );
393
-
394
- passEncoder.setPipeline( pipeline );
395
- passEncoder.setBindGroup( 0, bindGroup );
396
- passEncoder.draw( 4, 1, 0, 0 );
397
-
398
- passes.push( {
399
- renderBundles: [ passEncoder.finish() ],
400
- passDescriptor
401
- } );
402
-
403
- srcView = dstView;
306
+ for ( let baseMipLevel = 1; baseMipLevel < textureGPU.mipLevelCount; baseMipLevel ++ ) {
307
+
308
+ for ( let baseArrayLayer = 0; baseArrayLayer < textureGPU.depthOrArrayLayers; baseArrayLayer ++ ) {
309
+
310
+ const bindGroup = this.device.createBindGroup( {
311
+ layout: bindGroupLayout,
312
+ entries: [ {
313
+ binding: 0,
314
+ resource: this.mipmapSampler
315
+ }, {
316
+ binding: 1,
317
+ resource: textureGPU.createView( {
318
+ dimension: textureBindingViewDimension,
319
+ baseMipLevel: baseMipLevel - 1,
320
+ mipLevelCount: 1,
321
+ } ),
322
+ }, {
323
+ binding: 2,
324
+ resource: { buffer: this.noFlipUniformBuffer }
325
+ } ]
326
+ } );
327
+
328
+ const passDescriptor = {
329
+ colorAttachments: [ {
330
+ view: textureGPU.createView( {
331
+ dimension: '2d',
332
+ baseMipLevel,
333
+ mipLevelCount: 1,
334
+ baseArrayLayer,
335
+ arrayLayerCount: 1,
336
+ } ),
337
+ loadOp: GPULoadOp.Clear,
338
+ storeOp: GPUStoreOp.Store,
339
+ } ]
340
+ };
341
+
342
+ const passEncoder = this.device.createRenderBundleEncoder( {
343
+ colorFormats: [ textureGPU.format ]
344
+ } );
345
+
346
+ passEncoder.setPipeline( pipeline );
347
+ passEncoder.setBindGroup( 0, bindGroup );
348
+ passEncoder.draw( 3, 1, 0, baseArrayLayer );
349
+
350
+ passes.push( {
351
+ renderBundles: [ passEncoder.finish() ],
352
+ passDescriptor
353
+ } );
354
+
355
+ }
404
356
 
405
357
  }
406
358
 
@@ -16,6 +16,7 @@ import {
16
16
  NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, IntType, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat,
17
17
  UnsignedInt101111Type, RGBA_BPTC_Format, RGB_ETC1_Format, RGB_S3TC_DXT1_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format,
18
18
  R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format,
19
+ Compatibility
19
20
  } from '../../../constants.js';
20
21
  import { CubeTexture } from '../../../textures/CubeTexture.js';
21
22
  import { Texture } from '../../../textures/Texture.js';
@@ -124,6 +125,15 @@ class WebGPUTextureUtils {
124
125
  maxAnisotropy: 1
125
126
  };
126
127
 
128
+ // Depth textures without compare function must use non-filtering (nearest) sampling
129
+ if ( texture.isDepthTexture && texture.compareFunction === null ) {
130
+
131
+ samplerDescriptorGPU.magFilter = GPUFilterMode.Nearest;
132
+ samplerDescriptorGPU.minFilter = GPUFilterMode.Nearest;
133
+ samplerDescriptorGPU.mipmapFilter = GPUFilterMode.Nearest;
134
+
135
+ }
136
+
127
137
  // anisotropy can only be used when all filter modes are set to linear.
128
138
 
129
139
  if ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {
@@ -132,7 +142,7 @@ class WebGPUTextureUtils {
132
142
 
133
143
  }
134
144
 
135
- if ( texture.isDepthTexture && texture.compareFunction !== null ) {
145
+ if ( texture.isDepthTexture && texture.compareFunction !== null && backend.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ) {
136
146
 
137
147
  samplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];
138
148
 
@@ -302,7 +312,17 @@ class WebGPUTextureUtils {
302
312
 
303
313
  }
304
314
 
305
- textureData.texture = backend.device.createTexture( textureDescriptorGPU );
315
+ try {
316
+
317
+ textureData.texture = backend.device.createTexture( textureDescriptorGPU );
318
+
319
+ } catch ( e ) {
320
+
321
+ warn( 'WebGPURenderer: Failed to create texture with descriptor:', textureDescriptorGPU );
322
+ this.createDefaultTexture( texture );
323
+ return;
324
+
325
+ }
306
326
 
307
327
  if ( isMSAA ) {
308
328
 
@@ -351,25 +371,7 @@ class WebGPUTextureUtils {
351
371
 
352
372
  const textureData = this.backend.get( texture );
353
373
 
354
- if ( texture.isCubeTexture ) {
355
-
356
- for ( let i = 0; i < 6; i ++ ) {
357
-
358
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
359
-
360
- }
361
-
362
- } else {
363
-
364
- const depth = texture.image.depth || 1;
365
-
366
- for ( let i = 0; i < depth; i ++ ) {
367
-
368
- this._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );
369
-
370
- }
371
-
372
- }
374
+ this._generateMipmaps( textureData.texture, encoder );
373
375
 
374
376
  }
375
377
 
@@ -820,13 +822,11 @@ class WebGPUTextureUtils {
820
822
  *
821
823
  * @private
822
824
  * @param {GPUTexture} textureGPU - The GPU texture object.
823
- * @param {Object} textureDescriptorGPU - The texture descriptor.
824
- * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.
825
825
  * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.
826
826
  */
827
- _generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0, encoder = null ) {
827
+ _generateMipmaps( textureGPU, encoder = null ) {
828
828
 
829
- this._getPassUtils().generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer, encoder );
829
+ this._getPassUtils().generateMipmaps( textureGPU, encoder );
830
830
 
831
831
  }
832
832
 
@@ -34,17 +34,21 @@ class WebGPUUtils {
34
34
 
35
35
  let format;
36
36
 
37
- if ( renderContext.depthTexture !== null ) {
37
+ if ( renderContext.depth ) {
38
38
 
39
- format = this.getTextureFormatGPU( renderContext.depthTexture );
39
+ if ( renderContext.depthTexture !== null ) {
40
40
 
41
- } else if ( renderContext.depth && renderContext.stencil ) {
41
+ format = this.getTextureFormatGPU( renderContext.depthTexture );
42
42
 
43
- format = GPUTextureFormat.Depth24PlusStencil8;
43
+ } else if ( renderContext.stencil ) {
44
44
 
45
- } else if ( renderContext.depth ) {
45
+ format = GPUTextureFormat.Depth24PlusStencil8;
46
46
 
47
- format = GPUTextureFormat.Depth24Plus;
47
+ } else {
48
+
49
+ format = GPUTextureFormat.Depth24Plus;
50
+
51
+ }
48
52
 
49
53
  }
50
54
 
@@ -749,8 +749,8 @@ class WebXRManager extends EventDispatcher {
749
749
 
750
750
  // inherit camera layers and enable eye layers (1 = left, 2 = right)
751
751
  cameraXR.layers.mask = camera.layers.mask | 0b110;
752
- cameraL.layers.mask = cameraXR.layers.mask & 0b011;
753
- cameraR.layers.mask = cameraXR.layers.mask & 0b101;
752
+ cameraL.layers.mask = cameraXR.layers.mask & ~ 0b100;
753
+ cameraR.layers.mask = cameraXR.layers.mask & ~ 0b010;
754
754
 
755
755
  const parent = camera.parent;
756
756
  const cameras = cameraXR.cameras;
@@ -68,7 +68,7 @@ class Texture extends EventDispatcher {
68
68
  Object.defineProperty( this, 'id', { value: _textureId ++ } );
69
69
 
70
70
  /**
71
- * The UUID of the material.
71
+ * The UUID of the texture.
72
72
  *
73
73
  * @type {string}
74
74
  * @readonly
@@ -76,7 +76,7 @@ class Texture extends EventDispatcher {
76
76
  this.uuid = generateUUID();
77
77
 
78
78
  /**
79
- * The name of the material.
79
+ * The name of the texture.
80
80
  *
81
81
  * @type {string}
82
82
  */