super-three 0.152.0 → 0.154.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 (339) hide show
  1. package/build/three.cjs +779 -557
  2. package/build/three.js +779 -557
  3. package/build/three.min.js +2 -1
  4. package/build/three.module.js +770 -539
  5. package/build/three.module.min.js +2 -1
  6. package/examples/jsm/cameras/CinematicCamera.js +1 -2
  7. package/examples/jsm/capabilities/WebGPU.js +15 -1
  8. package/examples/jsm/controls/ArcballControls.js +2 -1
  9. package/examples/jsm/controls/FlyControls.js +25 -9
  10. package/examples/jsm/controls/OrbitControls.js +5 -1
  11. package/examples/jsm/csm/CSM.js +1 -3
  12. package/examples/jsm/effects/AnaglyphEffect.js +6 -20
  13. package/examples/jsm/effects/OutlineEffect.js +1 -1
  14. package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
  15. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  16. package/examples/jsm/exporters/GLTFExporter.js +74 -2
  17. package/examples/jsm/exporters/USDZExporter.js +170 -129
  18. package/examples/jsm/helpers/ViewHelper.js +1 -1
  19. package/examples/jsm/lines/LineMaterial.js +1 -1
  20. package/examples/jsm/loaders/3DMLoader.js +1 -1
  21. package/examples/jsm/loaders/3MFLoader.js +5 -1
  22. package/examples/jsm/loaders/AMFLoader.js +5 -1
  23. package/examples/jsm/loaders/ColladaLoader.js +4 -1
  24. package/examples/jsm/loaders/DRACOLoader.js +2 -0
  25. package/examples/jsm/loaders/FBXLoader.js +9 -2
  26. package/examples/jsm/loaders/GLTFLoader.js +230 -94
  27. package/examples/jsm/loaders/KTX2Loader.js +106 -47
  28. package/examples/jsm/loaders/LDrawLoader.js +4 -7
  29. package/examples/jsm/loaders/MMDLoader.js +40 -13
  30. package/examples/jsm/loaders/PCDLoader.js +25 -10
  31. package/examples/jsm/loaders/PDBLoader.js +7 -2
  32. package/examples/jsm/loaders/PLYLoader.js +30 -8
  33. package/examples/jsm/loaders/STLLoader.js +8 -3
  34. package/examples/jsm/loaders/VRMLLoader.js +55 -7
  35. package/examples/jsm/loaders/VTKLoader.js +12 -4
  36. package/examples/jsm/loaders/XYZLoader.js +9 -3
  37. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -2
  38. package/examples/jsm/math/Lut.js +5 -4
  39. package/examples/jsm/math/MeshSurfaceSampler.js +82 -37
  40. package/examples/jsm/misc/GPUComputationRenderer.js +1 -0
  41. package/examples/jsm/misc/VolumeSlice.js +3 -1
  42. package/examples/jsm/nodes/Nodes.js +22 -16
  43. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
  44. package/examples/jsm/nodes/accessors/BufferNode.js +2 -2
  45. package/examples/jsm/nodes/accessors/CameraNode.js +25 -4
  46. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +7 -1
  47. package/examples/jsm/nodes/accessors/InstanceNode.js +29 -12
  48. package/examples/jsm/nodes/accessors/MaterialNode.js +55 -47
  49. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -2
  50. package/examples/jsm/nodes/accessors/ModelNode.js +3 -1
  51. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +4 -9
  52. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  53. package/examples/jsm/nodes/accessors/NormalNode.js +3 -2
  54. package/examples/jsm/nodes/accessors/Object3DNode.js +10 -2
  55. package/examples/jsm/nodes/accessors/ReferenceNode.js +2 -2
  56. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  57. package/examples/jsm/nodes/accessors/SkinningNode.js +43 -62
  58. package/examples/jsm/nodes/accessors/StorageBufferNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TangentNode.js +2 -2
  60. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  61. package/examples/jsm/nodes/accessors/TextureNode.js +68 -6
  62. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  63. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  64. package/examples/jsm/nodes/code/CodeNode.js +3 -0
  65. package/examples/jsm/nodes/code/FunctionNode.js +25 -4
  66. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  67. package/examples/jsm/nodes/core/BypassNode.js +2 -2
  68. package/examples/jsm/nodes/core/ContextNode.js +2 -0
  69. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  70. package/examples/jsm/nodes/core/LightingModel.js +2 -1
  71. package/examples/jsm/nodes/core/Node.js +13 -16
  72. package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
  73. package/examples/jsm/nodes/core/NodeBuilder.js +86 -8
  74. package/examples/jsm/nodes/core/NodeUtils.js +10 -0
  75. package/examples/jsm/nodes/core/PropertyNode.js +6 -2
  76. package/examples/jsm/nodes/core/StackNode.js +8 -1
  77. package/examples/jsm/nodes/core/UniformNode.js +1 -1
  78. package/examples/jsm/nodes/core/VarNode.js +1 -3
  79. package/examples/jsm/nodes/display/BlendModeNode.js +9 -9
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +7 -7
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +50 -49
  82. package/examples/jsm/nodes/display/NormalMapNode.js +3 -3
  83. package/examples/jsm/nodes/display/ToneMappingNode.js +24 -15
  84. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  85. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  86. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +7 -6
  87. package/examples/jsm/nodes/display/ViewportTextureNode.js +33 -19
  88. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +5 -5
  89. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -8
  90. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  91. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  92. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +4 -4
  93. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +2 -2
  94. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  95. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +2 -4
  96. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  97. package/examples/jsm/nodes/functions/PhongLightingModel.js +7 -7
  98. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +132 -19
  99. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +2 -2
  100. package/examples/jsm/nodes/functions/material/getRoughness.js +3 -3
  101. package/examples/jsm/nodes/geometry/RangeNode.js +33 -51
  102. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +6 -3
  103. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/EnvironmentNode.js +107 -62
  105. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +2 -2
  106. package/examples/jsm/nodes/lighting/LightUtils.js +2 -2
  107. package/examples/jsm/nodes/lighting/LightingContextNode.js +17 -15
  108. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/SpotLightNode.js +3 -3
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +0 -15
  111. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -15
  112. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +0 -10
  113. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +0 -9
  114. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +41 -0
  115. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +1 -14
  116. package/examples/jsm/nodes/materials/NodeMaterial.js +119 -29
  117. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -9
  118. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  119. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  120. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -14
  121. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -4
  122. package/examples/jsm/nodes/math/MathNode.js +6 -0
  123. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  124. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  125. package/examples/jsm/nodes/shadernode/ShaderNode.js +60 -33
  126. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -3
  127. package/examples/jsm/nodes/utils/LoopNode.js +186 -0
  128. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +1 -1
  129. package/examples/jsm/objects/GroundProjectedSkybox.js +1 -1
  130. package/examples/jsm/objects/Lensflare.js +3 -4
  131. package/examples/jsm/objects/MarchingCubes.js +5 -1
  132. package/examples/jsm/objects/Reflector.js +4 -1
  133. package/examples/jsm/objects/Refractor.js +1 -1
  134. package/examples/jsm/objects/Sky.js +1 -1
  135. package/examples/jsm/objects/Water.js +2 -1
  136. package/examples/jsm/objects/Water2.js +1 -1
  137. package/examples/jsm/offscreen/scene.js +1 -0
  138. package/examples/jsm/physics/RapierPhysics.js +93 -133
  139. package/examples/jsm/postprocessing/AfterimagePass.js +3 -0
  140. package/examples/jsm/postprocessing/BloomPass.js +7 -2
  141. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  142. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  143. package/examples/jsm/postprocessing/EffectComposer.js +4 -1
  144. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  145. package/examples/jsm/postprocessing/OutlinePass.js +8 -9
  146. package/examples/jsm/postprocessing/OutputPass.js +72 -0
  147. package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
  148. package/examples/jsm/postprocessing/SAOPass.js +4 -2
  149. package/examples/jsm/postprocessing/SMAAPass.js +5 -2
  150. package/examples/jsm/postprocessing/SSAARenderPass.js +5 -13
  151. package/examples/jsm/postprocessing/SSAOPass.js +4 -2
  152. package/examples/jsm/postprocessing/SSRPass.js +3 -1
  153. package/examples/jsm/postprocessing/SavePass.js +5 -2
  154. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  155. package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
  156. package/examples/jsm/postprocessing/TexturePass.js +2 -1
  157. package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -13
  158. package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +2 -2
  159. package/examples/jsm/renderers/common/Attributes.js +75 -0
  160. package/examples/jsm/renderers/common/Backend.js +162 -0
  161. package/examples/jsm/renderers/common/Background.js +134 -0
  162. package/examples/jsm/renderers/common/Binding.js +11 -0
  163. package/examples/jsm/renderers/common/Bindings.js +169 -0
  164. package/examples/jsm/renderers/common/Buffer.js +38 -0
  165. package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
  166. package/examples/jsm/renderers/{webgpu/WebGPUWeakMap.js → common/ChainMap.js} +11 -5
  167. package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
  168. package/examples/jsm/renderers/common/Constants.js +14 -0
  169. package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
  170. package/examples/jsm/renderers/common/DataMap.js +54 -0
  171. package/examples/jsm/renderers/{webgpu/WebGPUGeometries.js → common/Geometries.js} +38 -37
  172. package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
  173. package/examples/jsm/renderers/common/Pipeline.js +13 -0
  174. package/examples/jsm/renderers/common/Pipelines.js +321 -0
  175. package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
  176. package/examples/jsm/renderers/common/RenderContext.js +37 -0
  177. package/examples/jsm/renderers/common/RenderContexts.js +38 -0
  178. package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +2 -39
  179. package/examples/jsm/renderers/common/RenderLists.js +38 -0
  180. package/examples/jsm/renderers/common/RenderObject.js +113 -0
  181. package/examples/jsm/renderers/common/RenderObjects.js +92 -0
  182. package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
  183. package/examples/jsm/renderers/{webgpu/WebGPURenderTarget.js → common/RenderTarget.js} +2 -2
  184. package/examples/jsm/renderers/common/Renderer.js +864 -0
  185. package/examples/jsm/renderers/common/SampledTexture.js +80 -0
  186. package/examples/jsm/renderers/common/Sampler.js +18 -0
  187. package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
  188. package/examples/jsm/renderers/common/Textures.js +206 -0
  189. package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
  190. package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
  191. package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
  192. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodes.js → common/nodes/NodeRender.js} +3 -3
  193. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
  194. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
  195. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
  196. package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
  197. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  198. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +23 -19
  199. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
  200. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -1131
  201. package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +75 -45
  202. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
  203. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
  204. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
  205. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
  206. package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +6 -7
  207. package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +154 -247
  208. package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +3 -25
  209. package/examples/jsm/renderers/webgpu/{WebGPUTextures.js → utils/WebGPUTextureUtils.js} +392 -505
  210. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
  211. package/examples/jsm/shaders/BleachBypassShader.js +2 -0
  212. package/examples/jsm/shaders/BlendShader.js +1 -2
  213. package/examples/jsm/shaders/BokehShader2.js +3 -0
  214. package/examples/jsm/shaders/ColorifyShader.js +2 -0
  215. package/examples/jsm/shaders/ConvolutionShader.js +2 -0
  216. package/examples/jsm/shaders/CopyShader.js +4 -2
  217. package/examples/jsm/shaders/DotScreenShader.js +2 -0
  218. package/examples/jsm/shaders/ExposureShader.js +44 -0
  219. package/examples/jsm/shaders/FilmShader.js +2 -0
  220. package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
  221. package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
  222. package/examples/jsm/shaders/OutputShader.js +61 -0
  223. package/examples/jsm/shaders/RGBShiftShader.js +2 -0
  224. package/examples/jsm/shaders/SepiaShader.js +2 -0
  225. package/examples/jsm/shaders/ToonShader.js +13 -5
  226. package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
  227. package/examples/jsm/shaders/VignetteShader.js +2 -0
  228. package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
  229. package/examples/jsm/utils/BufferGeometryUtils.js +17 -1
  230. package/examples/jsm/utils/TextureUtils.js +86 -0
  231. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  232. package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
  233. package/examples/jsm/webxr/XRPlanes.js +100 -0
  234. package/package.json +3 -1
  235. package/src/Three.Legacy.js +0 -228
  236. package/src/audio/PositionalAudio.js +8 -0
  237. package/src/cameras/Camera.js +5 -0
  238. package/src/cameras/CubeCamera.js +76 -13
  239. package/src/cameras/OrthographicCamera.js +1 -1
  240. package/src/cameras/PerspectiveCamera.js +1 -1
  241. package/src/constants.js +13 -1
  242. package/src/core/BufferAttribute.js +3 -25
  243. package/src/core/BufferGeometry.js +1 -8
  244. package/src/core/Object3D.js +1 -1
  245. package/src/extras/core/Curve.js +1 -1
  246. package/src/loaders/CubeTextureLoader.js +2 -0
  247. package/src/loaders/Loader.js +2 -0
  248. package/src/loaders/MaterialLoader.js +5 -0
  249. package/src/loaders/ObjectLoader.js +1 -0
  250. package/src/materials/Material.js +13 -1
  251. package/src/materials/MeshPhysicalMaterial.js +32 -6
  252. package/src/math/Color.js +16 -11
  253. package/src/math/Frustum.js +16 -2
  254. package/src/math/MathUtils.js +16 -0
  255. package/src/math/Matrix3.js +26 -6
  256. package/src/math/Matrix4.js +74 -19
  257. package/src/objects/InstancedMesh.js +3 -0
  258. package/src/objects/Mesh.js +14 -10
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +36 -8
  261. package/src/renderers/WebGLRenderer.js +126 -21
  262. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  263. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  264. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  265. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -0
  266. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
  267. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +9 -1
  268. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +26 -0
  269. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -2
  270. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +10 -2
  271. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +1 -1
  272. package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
  273. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  274. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +3 -3
  275. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +10 -5
  276. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +6 -1
  277. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +7 -1
  278. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +6 -1
  279. package/src/renderers/shaders/ShaderChunk.js +10 -6
  280. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  281. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  282. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  283. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  286. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -2
  287. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +4 -2
  288. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -2
  289. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  290. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -2
  291. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +12 -2
  292. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -2
  293. package/src/renderers/shaders/ShaderLib/points.glsl.js +4 -2
  294. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  295. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  296. package/src/renderers/shaders/ShaderLib.js +4 -1
  297. package/src/renderers/shaders/UniformsLib.js +2 -0
  298. package/src/renderers/webgl/WebGLBindingStates.js +13 -5
  299. package/src/renderers/webgl/WebGLGeometries.js +12 -0
  300. package/src/renderers/webgl/WebGLInfo.js +0 -1
  301. package/src/renderers/webgl/WebGLMaterials.js +18 -0
  302. package/src/renderers/webgl/WebGLObjects.js +23 -3
  303. package/src/renderers/webgl/WebGLProgram.js +43 -5
  304. package/src/renderers/webgl/WebGLPrograms.js +19 -7
  305. package/src/renderers/webgl/WebGLTextures.js +19 -1
  306. package/src/renderers/webvr/WebVRManager.js +12 -0
  307. package/src/renderers/webxr/WebXRManager.js +39 -99
  308. package/src/scenes/Scene.js +0 -14
  309. package/src/textures/DepthTexture.js +22 -0
  310. package/src/textures/FramebufferTexture.js +1 -3
  311. package/src/textures/Source.js +4 -0
  312. package/src/textures/Texture.js +1 -1
  313. package/examples/jsm/exporters/ColladaExporter.js +0 -725
  314. package/examples/jsm/geometries/LightningStrike.js +0 -1017
  315. package/examples/jsm/loaders/PRWMLoader.js +0 -299
  316. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -26
  317. package/examples/jsm/objects/LightningStorm.js +0 -245
  318. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -361
  319. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -197
  320. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -190
  321. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
  322. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -270
  323. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
  324. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
  325. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
  326. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -44
  327. package/examples/jsm/renderers/webgpu/WebGPURenderObject.js +0 -40
  328. package/examples/jsm/renderers/webgpu/WebGPURenderObjects.js +0 -50
  329. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -274
  330. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -54
  331. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -75
  332. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
  333. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
  334. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -38
  335. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
  336. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -88
  337. package/examples/jsm/shaders/ToneMapShader.js +0 -73
  338. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  339. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
@@ -142,6 +142,12 @@ class GLTFLoader extends Loader {
142
142
 
143
143
  } );
144
144
 
145
+ this.register( function ( parser ) {
146
+
147
+ return new GLTFMaterialsAnisotropyExtension( parser );
148
+
149
+ } );
150
+
145
151
  this.register( function ( parser ) {
146
152
 
147
153
  return new GLTFLightsExtension( parser );
@@ -472,6 +478,7 @@ const EXTENSIONS = {
472
478
  KHR_MATERIALS_SPECULAR: 'KHR_materials_specular',
473
479
  KHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',
474
480
  KHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',
481
+ KHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',
475
482
  KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
476
483
  KHR_MATERIALS_VOLUME: 'KHR_materials_volume',
477
484
  KHR_TEXTURE_BASISU: 'KHR_texture_basisu',
@@ -1187,6 +1194,70 @@ class GLTFMaterialsSpecularExtension {
1187
1194
 
1188
1195
  }
1189
1196
 
1197
+ /**
1198
+ * Materials anisotropy Extension
1199
+ *
1200
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy
1201
+ */
1202
+ class GLTFMaterialsAnisotropyExtension {
1203
+
1204
+ constructor( parser ) {
1205
+
1206
+ this.parser = parser;
1207
+ this.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;
1208
+
1209
+ }
1210
+
1211
+ getMaterialType( materialIndex ) {
1212
+
1213
+ const parser = this.parser;
1214
+ const materialDef = parser.json.materials[ materialIndex ];
1215
+
1216
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;
1217
+
1218
+ return MeshPhysicalMaterial;
1219
+
1220
+ }
1221
+
1222
+ extendMaterialParams( materialIndex, materialParams ) {
1223
+
1224
+ const parser = this.parser;
1225
+ const materialDef = parser.json.materials[ materialIndex ];
1226
+
1227
+ if ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {
1228
+
1229
+ return Promise.resolve();
1230
+
1231
+ }
1232
+
1233
+ const pending = [];
1234
+
1235
+ const extension = materialDef.extensions[ this.name ];
1236
+
1237
+ if ( extension.anisotropyStrength !== undefined ) {
1238
+
1239
+ materialParams.anisotropy = extension.anisotropyStrength;
1240
+
1241
+ }
1242
+
1243
+ if ( extension.anisotropyRotation !== undefined ) {
1244
+
1245
+ materialParams.anisotropyRotation = extension.anisotropyRotation;
1246
+
1247
+ }
1248
+
1249
+ if ( extension.anisotropyTexture !== undefined ) {
1250
+
1251
+ pending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );
1252
+
1253
+ }
1254
+
1255
+ return Promise.all( pending );
1256
+
1257
+ }
1258
+
1259
+ }
1260
+
1190
1261
  /**
1191
1262
  * BasisU Texture Extension
1192
1263
  *
@@ -2255,9 +2326,10 @@ function updateMorphTargets( mesh, meshDef ) {
2255
2326
 
2256
2327
  function createPrimitiveKey( primitiveDef ) {
2257
2328
 
2258
- const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];
2259
2329
  let geometryKey;
2260
2330
 
2331
+ const dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];
2332
+
2261
2333
  if ( dracoExtension ) {
2262
2334
 
2263
2335
  geometryKey = 'draco:' + dracoExtension.bufferView
@@ -2270,6 +2342,16 @@ function createPrimitiveKey( primitiveDef ) {
2270
2342
 
2271
2343
  }
2272
2344
 
2345
+ if ( primitiveDef.targets !== undefined ) {
2346
+
2347
+ for ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {
2348
+
2349
+ geometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );
2350
+
2351
+ }
2352
+
2353
+ }
2354
+
2273
2355
  return geometryKey;
2274
2356
 
2275
2357
  }
@@ -3429,17 +3511,17 @@ class GLTFParser {
3429
3511
 
3430
3512
  const sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );
3431
3513
 
3432
- let name = sanitizedName;
3514
+ if ( sanitizedName in this.nodeNamesUsed ) {
3433
3515
 
3434
- for ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {
3516
+ return sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );
3435
3517
 
3436
- name = sanitizedName + '_' + i;
3518
+ } else {
3437
3519
 
3438
- }
3520
+ this.nodeNamesUsed[ sanitizedName ] = 0;
3439
3521
 
3440
- this.nodeNamesUsed[ name ] = true;
3522
+ return sanitizedName;
3441
3523
 
3442
- return name;
3524
+ }
3443
3525
 
3444
3526
  }
3445
3527
 
@@ -3637,12 +3719,16 @@ class GLTFParser {
3637
3719
 
3638
3720
  if ( meshes.length === 1 ) {
3639
3721
 
3722
+ if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );
3723
+
3640
3724
  return meshes[ 0 ];
3641
3725
 
3642
3726
  }
3643
3727
 
3644
3728
  const group = new Group();
3645
3729
 
3730
+ if ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );
3731
+
3646
3732
  parser.associations.set( group, { meshes: meshIndex } );
3647
3733
 
3648
3734
  for ( let i = 0, il = meshes.length; i < il; i ++ ) {
@@ -3771,6 +3857,7 @@ class GLTFParser {
3771
3857
  loadAnimation( animationIndex ) {
3772
3858
 
3773
3859
  const json = this.json;
3860
+ const parser = this;
3774
3861
 
3775
3862
  const animationDef = json.animations[ animationIndex ];
3776
3863
  const animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;
@@ -3828,103 +3915,23 @@ class GLTFParser {
3828
3915
 
3829
3916
  if ( node === undefined ) continue;
3830
3917
 
3831
- node.updateMatrix();
3918
+ if ( node.updateMatrix ) {
3832
3919
 
3833
- let TypedKeyframeTrack;
3834
-
3835
- switch ( PATH_PROPERTIES[ target.path ] ) {
3836
-
3837
- case PATH_PROPERTIES.weights:
3838
-
3839
- TypedKeyframeTrack = NumberKeyframeTrack;
3840
- break;
3841
-
3842
- case PATH_PROPERTIES.rotation:
3843
-
3844
- TypedKeyframeTrack = QuaternionKeyframeTrack;
3845
- break;
3846
-
3847
- case PATH_PROPERTIES.position:
3848
- case PATH_PROPERTIES.scale:
3849
- default:
3850
-
3851
- TypedKeyframeTrack = VectorKeyframeTrack;
3852
- break;
3920
+ node.updateMatrix();
3921
+ node.matrixAutoUpdate = true;
3853
3922
 
3854
3923
  }
3855
3924
 
3856
- const targetName = node.name ? node.name : node.uuid;
3857
-
3858
- const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;
3859
-
3860
- const targetNames = [];
3861
-
3862
- if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {
3863
-
3864
- node.traverse( function ( object ) {
3865
-
3866
- if ( object.morphTargetInfluences ) {
3925
+ const createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );
3867
3926
 
3868
- targetNames.push( object.name ? object.name : object.uuid );
3927
+ if ( createdTracks ) {
3869
3928
 
3870
- }
3871
-
3872
- } );
3929
+ for ( let k = 0; k < createdTracks.length; k ++ ) {
3873
3930
 
3874
- } else {
3875
-
3876
- targetNames.push( targetName );
3877
-
3878
- }
3879
-
3880
- let outputArray = outputAccessor.array;
3881
-
3882
- if ( outputAccessor.normalized ) {
3883
-
3884
- const scale = getNormalizedComponentScale( outputArray.constructor );
3885
- const scaled = new Float32Array( outputArray.length );
3886
-
3887
- for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {
3888
-
3889
- scaled[ j ] = outputArray[ j ] * scale;
3931
+ tracks.push( createdTracks[ k ] );
3890
3932
 
3891
3933
  }
3892
3934
 
3893
- outputArray = scaled;
3894
-
3895
- }
3896
-
3897
- for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {
3898
-
3899
- const track = new TypedKeyframeTrack(
3900
- targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],
3901
- inputAccessor.array,
3902
- outputArray,
3903
- interpolation
3904
- );
3905
-
3906
- // Override interpolation with custom factory method.
3907
- if ( sampler.interpolation === 'CUBICSPLINE' ) {
3908
-
3909
- track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {
3910
-
3911
- // A CUBICSPLINE keyframe in glTF has three output values for each input value,
3912
- // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()
3913
- // must be divided by three to get the interpolant's sampleSize argument.
3914
-
3915
- const interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
3916
-
3917
- return new interpolantType( this.times, this.values, this.getValueSize() / 3, result );
3918
-
3919
- };
3920
-
3921
- // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.
3922
- track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
3923
-
3924
- }
3925
-
3926
- tracks.push( track );
3927
-
3928
3935
  }
3929
3936
 
3930
3937
  }
@@ -4255,6 +4262,135 @@ class GLTFParser {
4255
4262
 
4256
4263
  }
4257
4264
 
4265
+ _createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {
4266
+
4267
+ const tracks = [];
4268
+
4269
+ const targetName = node.name ? node.name : node.uuid;
4270
+
4271
+ const targetNames = [];
4272
+
4273
+ if ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {
4274
+
4275
+ node.traverse( function ( object ) {
4276
+
4277
+ if ( object.morphTargetInfluences ) {
4278
+
4279
+ targetNames.push( object.name ? object.name : object.uuid );
4280
+
4281
+ }
4282
+
4283
+ } );
4284
+
4285
+ } else {
4286
+
4287
+ targetNames.push( targetName );
4288
+
4289
+ }
4290
+
4291
+ let TypedKeyframeTrack;
4292
+
4293
+ switch ( PATH_PROPERTIES[ target.path ] ) {
4294
+
4295
+ case PATH_PROPERTIES.weights:
4296
+
4297
+ TypedKeyframeTrack = NumberKeyframeTrack;
4298
+ break;
4299
+
4300
+ case PATH_PROPERTIES.rotation:
4301
+
4302
+ TypedKeyframeTrack = QuaternionKeyframeTrack;
4303
+ break;
4304
+
4305
+ case PATH_PROPERTIES.position:
4306
+ case PATH_PROPERTIES.scale:
4307
+ default:
4308
+ switch ( outputAccessor.itemSize ) {
4309
+
4310
+ case 1:
4311
+ TypedKeyframeTrack = NumberKeyframeTrack;
4312
+ break;
4313
+ case 2:
4314
+ case 3:
4315
+ TypedKeyframeTrack = VectorKeyframeTrack;
4316
+ break;
4317
+
4318
+ }
4319
+
4320
+ break;
4321
+
4322
+ }
4323
+
4324
+ const interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;
4325
+
4326
+ const outputArray = this._getArrayFromAccessor( outputAccessor );
4327
+
4328
+ for ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {
4329
+
4330
+ const track = new TypedKeyframeTrack(
4331
+ targetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],
4332
+ inputAccessor.array,
4333
+ outputArray,
4334
+ interpolation
4335
+ );
4336
+
4337
+ // Override interpolation with custom factory method.
4338
+ if ( interpolation === 'CUBICSPLINE' ) {
4339
+
4340
+ this._createCubicSplineTrackInterpolant( track );
4341
+
4342
+ }
4343
+
4344
+ tracks.push( track );
4345
+
4346
+ }
4347
+
4348
+ return tracks;
4349
+
4350
+ }
4351
+
4352
+ _getArrayFromAccessor( accessor ) {
4353
+
4354
+ let outputArray = accessor.array;
4355
+
4356
+ if ( accessor.normalized ) {
4357
+
4358
+ const scale = getNormalizedComponentScale( outputArray.constructor );
4359
+ const scaled = new Float32Array( outputArray.length );
4360
+
4361
+ for ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {
4362
+
4363
+ scaled[ j ] = outputArray[ j ] * scale;
4364
+
4365
+ }
4366
+
4367
+ outputArray = scaled;
4368
+
4369
+ }
4370
+
4371
+ return outputArray;
4372
+
4373
+ }
4374
+
4375
+ _createCubicSplineTrackInterpolant( track ) {
4376
+
4377
+ track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {
4378
+
4379
+ // A CUBICSPLINE keyframe in glTF has three output values for each input value,
4380
+ // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()
4381
+ // must be divided by three to get the interpolant's sampleSize argument.
4382
+
4383
+ const interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;
4384
+
4385
+ return new interpolantType( this.times, this.values, this.getValueSize() / 3, result );
4386
+
4387
+ };
4388
+
4389
+ // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.
4390
+ track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;
4391
+
4392
+ }
4393
+
4258
4394
  }
4259
4395
 
4260
4396
  /**
@@ -253,16 +253,30 @@ class KTX2Loader extends Loader {
253
253
 
254
254
  _createTextureFrom( transcodeResult, container ) {
255
255
 
256
- const { mipmaps, width, height, format, type, error, dfdTransferFn, dfdFlags } = transcodeResult;
256
+ const { faces, width, height, format, type, error, dfdTransferFn, dfdFlags } = transcodeResult;
257
257
 
258
258
  if ( type === 'error' ) return Promise.reject( error );
259
259
 
260
- const texture = container.layerCount > 1
261
- ? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, UnsignedByteType )
262
- : new CompressedTexture( mipmaps, width, height, format, UnsignedByteType );
260
+ let texture;
263
261
 
262
+ if ( container.faceCount === 6 ) {
264
263
 
265
- texture.minFilter = mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;
264
+ texture = new CompressedTexture();
265
+ texture.image = faces;
266
+ texture.format = format;
267
+ texture.type = UnsignedByteType;
268
+
269
+ } else {
270
+
271
+ const mipmaps = faces[ 0 ].mipmaps;
272
+
273
+ texture = container.layerCount > 1
274
+ ? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, UnsignedByteType )
275
+ : new CompressedTexture( mipmaps, width, height, format, UnsignedByteType );
276
+
277
+ }
278
+
279
+ texture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;
266
280
  texture.magFilter = LinearFilter;
267
281
  texture.generateMipmaps = false;
268
282
 
@@ -286,7 +300,31 @@ class KTX2Loader extends Loader {
286
300
 
287
301
  if ( container.vkFormat !== VK_FORMAT_UNDEFINED ) {
288
302
 
289
- return createDataTexture( container );
303
+ const mipmaps = [];
304
+ const pendings = [];
305
+
306
+ for ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {
307
+
308
+ pendings.push( createDataTexture( container, levelIndex ).then( function ( dataTexture ) {
309
+
310
+ mipmaps[ levelIndex ] = dataTexture;
311
+
312
+ } ) );
313
+
314
+ }
315
+
316
+ await Promise.all( pendings );
317
+
318
+ const texture = mipmaps[ 0 ];
319
+ texture.mipmaps = mipmaps.map( dt => {
320
+ return {
321
+ data: dt.source.data,
322
+ width: dt.source.data.width,
323
+ height: dt.source.data.height,
324
+ depth: dt.source.data.depth
325
+ };
326
+ } );
327
+ return texture;
290
328
 
291
329
  }
292
330
 
@@ -388,17 +426,9 @@ KTX2Loader.BasisWorker = function () {
388
426
 
389
427
  try {
390
428
 
391
- const { width, height, hasAlpha, mipmaps, format, dfdTransferFn, dfdFlags } = transcode( message.buffer );
392
-
393
- const buffers = [];
394
-
395
- for ( let i = 0; i < mipmaps.length; ++ i ) {
396
-
397
- buffers.push( mipmaps[ i ].data.buffer );
398
-
399
- }
429
+ const { faces, buffers, width, height, hasAlpha, format, dfdTransferFn, dfdFlags } = transcode( message.buffer );
400
430
 
401
- self.postMessage( { type: 'transcode', id: message.id, width, height, hasAlpha, mipmaps, format, dfdTransferFn, dfdFlags }, buffers );
431
+ self.postMessage( { type: 'transcode', id: message.id, faces, width, height, hasAlpha, format, dfdTransferFn, dfdFlags }, buffers );
402
432
 
403
433
  } catch ( error ) {
404
434
 
@@ -457,15 +487,16 @@ KTX2Loader.BasisWorker = function () {
457
487
  const basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;
458
488
  const width = ktx2File.getWidth();
459
489
  const height = ktx2File.getHeight();
460
- const layers = ktx2File.getLayers() || 1;
461
- const levels = ktx2File.getLevels();
490
+ const layerCount = ktx2File.getLayers() || 1;
491
+ const levelCount = ktx2File.getLevels();
492
+ const faceCount = ktx2File.getFaces();
462
493
  const hasAlpha = ktx2File.getHasAlpha();
463
494
  const dfdTransferFn = ktx2File.getDFDTransferFunc();
464
495
  const dfdFlags = ktx2File.getDFDFlags();
465
496
 
466
497
  const { transcoderFormat, engineFormat } = getTranscoderFormat( basisFormat, width, height, hasAlpha );
467
498
 
468
- if ( ! width || ! height || ! levels ) {
499
+ if ( ! width || ! height || ! levelCount ) {
469
500
 
470
501
  cleanup();
471
502
  throw new Error( 'THREE.KTX2Loader: Invalid texture' );
@@ -479,49 +510,72 @@ KTX2Loader.BasisWorker = function () {
479
510
 
480
511
  }
481
512
 
482
- const mipmaps = [];
513
+ const faces = [];
514
+ const buffers = [];
483
515
 
484
- for ( let mip = 0; mip < levels; mip ++ ) {
516
+ for ( let face = 0; face < faceCount; face ++ ) {
485
517
 
486
- const layerMips = [];
518
+ const mipmaps = [];
487
519
 
488
- let mipWidth, mipHeight;
520
+ for ( let mip = 0; mip < levelCount; mip ++ ) {
489
521
 
490
- for ( let layer = 0; layer < layers; layer ++ ) {
522
+ const layerMips = [];
491
523
 
492
- const levelInfo = ktx2File.getImageLevelInfo( mip, layer, 0 );
493
- mipWidth = levelInfo.origWidth < 4 ? levelInfo.origWidth : levelInfo.width;
494
- mipHeight = levelInfo.origHeight < 4 ? levelInfo.origHeight : levelInfo.height;
495
- const dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );
496
- const status = ktx2File.transcodeImage(
497
- dst,
498
- mip,
499
- layer,
500
- 0,
501
- transcoderFormat,
502
- 0,
503
- - 1,
504
- - 1,
505
- );
524
+ let mipWidth, mipHeight;
525
+
526
+ for ( let layer = 0; layer < layerCount; layer ++ ) {
527
+
528
+ const levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );
529
+
530
+ if ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {
531
+
532
+ console.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );
506
533
 
507
- if ( ! status ) {
534
+ }
535
+
536
+ if ( levelCount > 1 ) {
537
+
538
+ mipWidth = levelInfo.origWidth;
539
+ mipHeight = levelInfo.origHeight;
508
540
 
509
- cleanup();
510
- throw new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );
541
+ } else {
542
+
543
+ // Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with
544
+ // mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.
545
+ // See mrdoob/three.js#25908.
546
+ mipWidth = levelInfo.width;
547
+ mipHeight = levelInfo.height;
548
+
549
+ }
550
+
551
+ const dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );
552
+ const status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );
553
+
554
+ if ( ! status ) {
555
+
556
+ cleanup();
557
+ throw new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );
558
+
559
+ }
560
+
561
+ layerMips.push( dst );
511
562
 
512
563
  }
513
564
 
514
- layerMips.push( dst );
565
+ const mipData = concat( layerMips );
566
+
567
+ mipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );
568
+ buffers.push( mipData.buffer );
515
569
 
516
570
  }
517
571
 
518
- mipmaps.push( { data: concat( layerMips ), width: mipWidth, height: mipHeight } );
572
+ faces.push( { mipmaps, width, height, format: engineFormat } );
519
573
 
520
574
  }
521
575
 
522
576
  cleanup();
523
577
 
524
- return { width, height, hasAlpha, mipmaps, format: engineFormat, dfdTransferFn, dfdFlags };
578
+ return { faces, buffers, width, height, hasAlpha, format: engineFormat, dfdTransferFn, dfdFlags };
525
579
 
526
580
  }
527
581
 
@@ -645,6 +699,8 @@ KTX2Loader.BasisWorker = function () {
645
699
  /** Concatenates N byte arrays. */
646
700
  function concat( arrays ) {
647
701
 
702
+ if ( arrays.length === 1 ) return arrays[ 0 ];
703
+
648
704
  let totalByteLength = 0;
649
705
 
650
706
  for ( let i = 0; i < arrays.length; i ++ ) {
@@ -722,9 +778,12 @@ const COLOR_SPACE_MAP = {
722
778
 
723
779
  };
724
780
 
725
- async function createDataTexture( container ) {
781
+ async function createDataTexture( container, levelIndex = 0 ) {
726
782
 
727
- const { vkFormat, pixelWidth, pixelHeight, pixelDepth } = container;
783
+ const { vkFormat } = container;
784
+ const pixelWidth = Math.max( 1, container.pixelWidth >> levelIndex );
785
+ const pixelHeight = Math.max( 1, container.pixelHeight >> levelIndex );
786
+ const pixelDepth = Math.max( 1, container.pixelDepth >> levelIndex );
728
787
 
729
788
  if ( FORMAT_MAP[ vkFormat ] === undefined ) {
730
789
 
@@ -732,7 +791,7 @@ async function createDataTexture( container ) {
732
791
 
733
792
  }
734
793
 
735
- const level = container.levels[ 0 ];
794
+ const level = container.levels[ levelIndex ];
736
795
 
737
796
  let levelData;
738
797
  let view;
@@ -133,7 +133,7 @@ class LDrawConditionalLineMaterial extends ShaderMaterial {
133
133
  outgoingLight = diffuseColor.rgb; // simple shader
134
134
  gl_FragColor = vec4( outgoingLight, diffuseColor.a );
135
135
  #include <tonemapping_fragment>
136
- #include <encodings_fragment>
136
+ #include <colorspace_fragment>
137
137
  #include <fog_fragment>
138
138
  #include <premultiplied_alpha_fragment>
139
139
  }
@@ -1903,12 +1903,9 @@ class LDrawLoader extends Loader {
1903
1903
  this.partsLibraryPath = '';
1904
1904
 
1905
1905
  // Material assigned to not available colors for meshes and edges
1906
- this.missingColorMaterial = new MeshStandardMaterial( { color: 0xFF00FF, roughness: 0.3, metalness: 0 } );
1907
- this.missingColorMaterial.name = 'Missing material';
1908
- this.missingEdgeColorMaterial = new LineBasicMaterial( { color: 0xFF00FF } );
1909
- this.missingEdgeColorMaterial.name = 'Missing material - Edge';
1910
- this.missingConditionalEdgeColorMaterial = new LDrawConditionalLineMaterial( { fog: true, color: 0xFF00FF } );
1911
- this.missingConditionalEdgeColorMaterial.name = 'Missing material - Conditional Edge';
1906
+ this.missingColorMaterial = new MeshStandardMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF, roughness: 0.3, metalness: 0 } );
1907
+ this.missingEdgeColorMaterial = new LineBasicMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF } );
1908
+ this.missingConditionalEdgeColorMaterial = new LDrawConditionalLineMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, fog: true, color: 0xFF00FF } );
1912
1909
  this.missingColorMaterial.userData.edgeMaterial = this.missingEdgeColorMaterial;
1913
1910
  this.missingEdgeColorMaterial.userData.conditionalEdgeMaterial = this.missingConditionalEdgeColorMaterial;
1914
1911