@needle-tools/three 0.145.2 → 0.146.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 (394) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +3559 -6924
  3. package/build/three.js +3559 -6924
  4. package/build/three.min.js +1 -2
  5. package/build/three.module.js +732 -339
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +49 -66
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +70 -134
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +138 -405
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -54
  14. package/examples/js/controls/FlyControls.js +29 -55
  15. package/examples/js/controls/OrbitControls.js +85 -95
  16. package/examples/js/controls/PointerLockControls.js +5 -14
  17. package/examples/js/controls/TrackballControls.js +33 -86
  18. package/examples/js/controls/TransformControls.js +84 -169
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +4 -18
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +26 -30
  30. package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
  31. package/examples/js/effects/PeppersGhostEffect.js +12 -39
  32. package/examples/js/effects/StereoEffect.js +0 -4
  33. package/examples/js/environments/RoomEnvironment.js +12 -10
  34. package/examples/js/exporters/ColladaExporter.js +48 -65
  35. package/examples/js/exporters/DRACOExporter.js +22 -22
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +143 -261
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +42 -33
  40. package/examples/js/exporters/PLYExporter.js +38 -33
  41. package/examples/js/exporters/STLExporter.js +5 -7
  42. package/examples/js/exporters/USDZExporter.js +110 -25
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +11 -6
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +25 -12
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +22 -33
  60. package/examples/js/interactive/InteractiveGroup.js +6 -12
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +0 -8
  63. package/examples/js/lights/LightProbeGenerator.js +32 -39
  64. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  65. package/examples/js/lines/LineGeometry.js +3 -5
  66. package/examples/js/lines/LineMaterial.js +4 -11
  67. package/examples/js/lines/LineSegments2.js +38 -89
  68. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  69. package/examples/js/lines/Wireframe.js +2 -7
  70. package/examples/js/lines/WireframeGeometry2.js +3 -1
  71. package/examples/js/loaders/3DMLoader.js +58 -155
  72. package/examples/js/loaders/3MFLoader.js +72 -106
  73. package/examples/js/loaders/AMFLoader.js +0 -25
  74. package/examples/js/loaders/BVHLoader.js +44 -43
  75. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  76. package/examples/js/loaders/ColladaLoader.js +201 -359
  77. package/examples/js/loaders/DDSLoader.js +24 -25
  78. package/examples/js/loaders/DRACOLoader.js +29 -66
  79. package/examples/js/loaders/EXRLoader.js +67 -164
  80. package/examples/js/loaders/FBXLoader.js +286 -441
  81. package/examples/js/loaders/FontLoader.js +6 -15
  82. package/examples/js/loaders/GCodeLoader.js +15 -16
  83. package/examples/js/loaders/GLTFLoader.js +354 -405
  84. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
  85. package/examples/js/loaders/KMZLoader.js +3 -7
  86. package/examples/js/loaders/KTXLoader.js +12 -30
  87. package/examples/js/loaders/LDrawLoader.js +178 -289
  88. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  89. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  90. package/examples/js/loaders/LWOLoader.js +59 -124
  91. package/examples/js/loaders/LogLuvLoader.js +27 -77
  92. package/examples/js/loaders/LottieLoader.js +4 -4
  93. package/examples/js/loaders/MD2Loader.js +26 -27
  94. package/examples/js/loaders/MDDLoader.js +6 -10
  95. package/examples/js/loaders/MMDLoader.js +180 -189
  96. package/examples/js/loaders/MTLLoader.js +18 -47
  97. package/examples/js/loaders/MaterialXLoader.js +392 -0
  98. package/examples/js/loaders/NRRDLoader.js +44 -84
  99. package/examples/js/loaders/OBJLoader.js +50 -65
  100. package/examples/js/loaders/PCDLoader.js +34 -29
  101. package/examples/js/loaders/PDBLoader.js +17 -13
  102. package/examples/js/loaders/PLYLoader.js +9 -39
  103. package/examples/js/loaders/PRWMLoader.js +11 -22
  104. package/examples/js/loaders/PVRLoader.js +7 -16
  105. package/examples/js/loaders/RGBELoader.js +36 -61
  106. package/examples/js/loaders/RGBMLoader.js +26 -87
  107. package/examples/js/loaders/STLLoader.js +20 -27
  108. package/examples/js/loaders/SVGLoader.js +361 -233
  109. package/examples/js/loaders/TDSLoader.js +81 -118
  110. package/examples/js/loaders/TGALoader.js +39 -41
  111. package/examples/js/loaders/TIFFLoader.js +0 -1
  112. package/examples/js/loaders/TTFLoader.js +0 -8
  113. package/examples/js/loaders/TiltLoader.js +14 -15
  114. package/examples/js/loaders/VOXLoader.js +8 -16
  115. package/examples/js/loaders/VRMLLoader.js +243 -340
  116. package/examples/js/loaders/VTKLoader.js +101 -118
  117. package/examples/js/loaders/XYZLoader.js +2 -4
  118. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  119. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  120. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  121. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  122. package/examples/js/math/Capsule.js +0 -17
  123. package/examples/js/math/ColorConverter.js +3 -3
  124. package/examples/js/math/ConvexHull.js +183 -139
  125. package/examples/js/math/ImprovedNoise.js +1 -1
  126. package/examples/js/math/Lut.js +8 -15
  127. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  128. package/examples/js/math/OBB.js +90 -49
  129. package/examples/js/math/Octree.js +2 -57
  130. package/examples/js/math/SimplexNoise.js +74 -88
  131. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  132. package/examples/js/misc/GPUComputationRenderer.js +14 -18
  133. package/examples/js/misc/Gyroscope.js +5 -9
  134. package/examples/js/misc/MD2Character.js +14 -23
  135. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  136. package/examples/js/misc/MorphAnimMesh.js +0 -6
  137. package/examples/js/misc/MorphBlendMesh.js +3 -30
  138. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  139. package/examples/js/misc/RollerCoaster.js +17 -24
  140. package/examples/js/misc/TubePainter.js +18 -12
  141. package/examples/js/misc/Volume.js +16 -45
  142. package/examples/js/misc/VolumeSlice.js +14 -24
  143. package/examples/js/modifiers/CurveModifier.js +19 -21
  144. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  145. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  146. package/examples/js/modifiers/TessellateModifier.js +2 -9
  147. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  148. package/examples/js/objects/Lensflare.js +47 -38
  149. package/examples/js/objects/LightningStorm.js +10 -13
  150. package/examples/js/objects/MarchingCubes.js +80 -59
  151. package/examples/js/objects/Reflector.js +22 -20
  152. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  153. package/examples/js/objects/Refractor.js +52 -30
  154. package/examples/js/objects/ShadowMesh.js +1 -2
  155. package/examples/js/objects/Sky.js +2 -7
  156. package/examples/js/objects/Water.js +23 -18
  157. package/examples/js/objects/Water2.js +20 -19
  158. package/examples/js/physics/AmmoPhysics.js +23 -20
  159. package/examples/js/physics/OimoPhysics.js +19 -17
  160. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  161. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  162. package/examples/js/postprocessing/BloomPass.js +38 -17
  163. package/examples/js/postprocessing/BokehPass.js +29 -12
  164. package/examples/js/postprocessing/ClearPass.js +1 -6
  165. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  166. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  167. package/examples/js/postprocessing/EffectComposer.js +25 -32
  168. package/examples/js/postprocessing/FilmPass.js +7 -5
  169. package/examples/js/postprocessing/GlitchPass.js +10 -11
  170. package/examples/js/postprocessing/HalftonePass.js +9 -9
  171. package/examples/js/postprocessing/LUTPass.js +2 -15
  172. package/examples/js/postprocessing/MaskPass.js +20 -17
  173. package/examples/js/postprocessing/OutlinePass.js +45 -36
  174. package/examples/js/postprocessing/Pass.js +11 -14
  175. package/examples/js/postprocessing/RenderPass.js +3 -7
  176. package/examples/js/postprocessing/SAOPass.js +40 -32
  177. package/examples/js/postprocessing/SMAAPass.js +34 -17
  178. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  179. package/examples/js/postprocessing/SSAOPass.js +56 -42
  180. package/examples/js/postprocessing/SSRPass.js +78 -61
  181. package/examples/js/postprocessing/SavePass.js +14 -6
  182. package/examples/js/postprocessing/ShaderPass.js +9 -8
  183. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  184. package/examples/js/postprocessing/TexturePass.js +7 -4
  185. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  186. package/examples/js/renderers/CSS2DRenderer.js +2 -21
  187. package/examples/js/renderers/CSS3DRenderer.js +3 -24
  188. package/examples/js/renderers/Projector.js +29 -85
  189. package/examples/js/renderers/SVGRenderer.js +4 -50
  190. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  191. package/examples/js/shaders/AfterimageShader.js +3 -6
  192. package/examples/js/shaders/BasicShader.js +3 -6
  193. package/examples/js/shaders/BleachBypassShader.js +3 -6
  194. package/examples/js/shaders/BlendShader.js +3 -6
  195. package/examples/js/shaders/BokehShader.js +3 -6
  196. package/examples/js/shaders/BokehShader2.js +4 -13
  197. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  198. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  199. package/examples/js/shaders/ColorifyShader.js +2 -6
  200. package/examples/js/shaders/ConvolutionShader.js +5 -10
  201. package/examples/js/shaders/CopyShader.js +3 -6
  202. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  203. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  204. package/examples/js/shaders/DigitalGlitch.js +3 -6
  205. package/examples/js/shaders/DotScreenShader.js +2 -6
  206. package/examples/js/shaders/FXAAShader.js +1 -3
  207. package/examples/js/shaders/FilmShader.js +3 -6
  208. package/examples/js/shaders/FocusShader.js +3 -6
  209. package/examples/js/shaders/FreiChenShader.js +2 -6
  210. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  211. package/examples/js/shaders/GodRaysShader.js +11 -24
  212. package/examples/js/shaders/HalftoneShader.js +3 -6
  213. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  214. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  215. package/examples/js/shaders/HueSaturationShader.js +3 -6
  216. package/examples/js/shaders/KaleidoShader.js +3 -6
  217. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  218. package/examples/js/shaders/LuminosityShader.js +3 -6
  219. package/examples/js/shaders/MMDToonShader.js +2 -6
  220. package/examples/js/shaders/MirrorShader.js +3 -6
  221. package/examples/js/shaders/NormalMapShader.js +2 -6
  222. package/examples/js/shaders/RGBShiftShader.js +3 -6
  223. package/examples/js/shaders/SAOShader.js +2 -6
  224. package/examples/js/shaders/SMAAShader.js +6 -18
  225. package/examples/js/shaders/SSAOShader.js +2 -6
  226. package/examples/js/shaders/SSRShader.js +6 -18
  227. package/examples/js/shaders/SepiaShader.js +3 -6
  228. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  229. package/examples/js/shaders/TechnicolorShader.js +3 -6
  230. package/examples/js/shaders/ToneMapShader.js +3 -6
  231. package/examples/js/shaders/ToonShader.js +8 -24
  232. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  233. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  234. package/examples/js/shaders/VelocityShader.js +126 -0
  235. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  236. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  237. package/examples/js/shaders/VignetteShader.js +3 -6
  238. package/examples/js/shaders/VolumeShader.js +2 -6
  239. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  240. package/examples/js/textures/FlakesTexture.js +0 -1
  241. package/examples/js/utils/BufferGeometryUtils.js +234 -168
  242. package/examples/js/utils/CameraUtils.js +5 -20
  243. package/examples/js/utils/GPUStatsPanel.js +3 -12
  244. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  245. package/examples/js/utils/GeometryUtils.js +13 -18
  246. package/examples/js/utils/LDrawUtils.js +8 -11
  247. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  248. package/examples/js/utils/SceneUtils.js +117 -6
  249. package/examples/js/utils/ShadowMapViewer.js +17 -14
  250. package/examples/js/utils/SkeletonUtils.js +13 -27
  251. package/examples/js/utils/UVsDebug.js +20 -12
  252. package/examples/js/utils/WorkerPool.js +1 -11
  253. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  254. package/examples/jsm/capabilities/WebGPU.js +3 -1
  255. package/examples/jsm/controls/OrbitControls.js +44 -4
  256. package/examples/jsm/exporters/GLTFExporter.js +17 -131
  257. package/examples/jsm/exporters/USDZExporter.js +94 -28
  258. package/examples/jsm/interactive/HTMLMesh.js +2 -0
  259. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  260. package/examples/jsm/loaders/3DMLoader.js +1 -2
  261. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  262. package/examples/jsm/loaders/FBXLoader.js +16 -2
  263. package/examples/jsm/loaders/GLTFLoader.js +204 -377
  264. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  265. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  266. package/examples/jsm/loaders/LottieLoader.js +4 -2
  267. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  268. package/examples/jsm/loaders/PCDLoader.js +1 -1
  269. package/examples/jsm/loaders/PLYLoader.js +68 -16
  270. package/examples/jsm/loaders/SVGLoader.js +227 -14
  271. package/examples/jsm/loaders/USDZLoader.js +31 -16
  272. package/examples/jsm/nodes/Nodes.js +14 -2
  273. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  274. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  275. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  276. package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
  277. package/examples/jsm/nodes/core/Node.js +1 -1
  278. package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
  279. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  280. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  281. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  282. package/examples/jsm/nodes/core/constants.js +13 -13
  283. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  284. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  285. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  286. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  287. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  288. package/examples/jsm/nodes/materials/Materials.js +9 -7
  289. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  290. package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
  291. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  292. package/examples/jsm/nodes/math/MathNode.js +5 -0
  293. package/examples/jsm/nodes/math/OperatorNode.js +6 -1
  294. package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
  295. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
  296. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
  297. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  298. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  299. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  300. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  301. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  302. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  303. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  304. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  305. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  306. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  307. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  308. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  309. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  310. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  311. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  312. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  313. package/examples/jsm/postprocessing/OutlinePass.js +10 -0
  314. package/examples/jsm/postprocessing/Pass.js +2 -0
  315. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  316. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  317. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  318. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  319. package/examples/jsm/postprocessing/SavePass.js +17 -1
  320. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  321. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  322. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  323. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  324. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
  325. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  326. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  327. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  328. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  329. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
  330. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  331. package/examples/jsm/shaders/VelocityShader.js +128 -0
  332. package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
  333. package/examples/jsm/utils/SceneUtils.js +129 -4
  334. package/examples/jsm/utils/TextureUtils.js +85 -0
  335. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  336. package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
  337. package/package.json +11 -12
  338. package/src/Three.js +1 -0
  339. package/src/audio/AudioContext.js +5 -5
  340. package/src/cameras/CubeCamera.js +14 -14
  341. package/src/constants.js +1 -1
  342. package/src/core/InstancedBufferGeometry.js +1 -7
  343. package/src/extras/Earcut.js +67 -67
  344. package/src/helpers/DirectionalLightHelper.js +5 -1
  345. package/src/helpers/HemisphereLightHelper.js +4 -1
  346. package/src/helpers/PointLightHelper.js +2 -1
  347. package/src/helpers/SpotLightHelper.js +4 -2
  348. package/src/lights/PointLight.js +2 -2
  349. package/src/lights/SpotLight.js +2 -2
  350. package/src/loaders/FileLoader.js +4 -1
  351. package/src/loaders/ObjectLoader.js +5 -1
  352. package/src/materials/Material.js +1 -1
  353. package/src/math/Color.js +5 -5
  354. package/src/math/Matrix3.js +53 -18
  355. package/src/math/Ray.js +2 -5
  356. package/src/math/Sphere.js +19 -26
  357. package/src/objects/InstancedMesh.js +7 -0
  358. package/src/objects/LOD.js +25 -6
  359. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  360. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  361. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  362. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  363. package/src/renderers/WebGLRenderTarget.js +1 -1
  364. package/src/renderers/WebGLRenderer.js +36 -62
  365. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  367. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  369. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  370. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  371. package/src/renderers/shaders/ShaderChunk.js +3 -0
  372. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  373. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  374. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  375. package/src/renderers/shaders/ShaderLib.js +20 -6
  376. package/src/renderers/shaders/UniformsLib.js +1 -1
  377. package/src/renderers/shaders/UniformsUtils.js +15 -0
  378. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  379. package/src/renderers/webgl/WebGLBackground.js +15 -7
  380. package/src/renderers/webgl/WebGLCubeUVMaps.js +1 -1
  381. package/src/renderers/webgl/WebGLLights.js +0 -4
  382. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  383. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  384. package/src/renderers/webgl/WebGLState.js +31 -1
  385. package/src/renderers/webgl/WebGLTextures.js +71 -18
  386. package/src/renderers/webgl/WebGLUniforms.js +116 -20
  387. package/src/renderers/webgl/WebGLUtils.js +1 -1
  388. package/src/renderers/webxr/WebXRController.js +46 -13
  389. package/src/renderers/webxr/WebXRManager.js +85 -3
  390. package/src/scenes/Scene.js +8 -0
  391. package/src/textures/CompressedArrayTexture.js +18 -0
  392. package/examples/js/libs/lottie_canvas.js +0 -12751
  393. package/examples/js/shaders/PixelShader.js +0 -51
  394. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -14,7 +14,9 @@ class WebGPU {
14
14
 
15
15
  static getErrorMessage() {
16
16
 
17
- const message = 'Your browser does not support <a href="https://gpuweb.github.io/gpuweb/" style="color:blue">WebGPU</a>';
17
+ let message = 'Your browser does not support <a href="https://gpuweb.github.io/gpuweb/" style="color:blue">WebGPU</a>';
18
+
19
+ if ( !! window.chrome ) message += '<br>Try: <b>chrome://flags/#enable-unsafe-webgpu</b>';
18
20
 
19
21
  const element = document.createElement( 'div' );
20
22
  element.id = 'webgpumessage';
@@ -603,22 +603,62 @@ class OrbitControls extends EventDispatcher {
603
603
  switch ( event.code ) {
604
604
 
605
605
  case scope.keys.UP:
606
- pan( 0, scope.keyPanSpeed );
606
+
607
+ if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
608
+
609
+ rotateUp( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );
610
+
611
+ } else {
612
+
613
+ pan( 0, scope.keyPanSpeed );
614
+
615
+ }
616
+
607
617
  needsUpdate = true;
608
618
  break;
609
619
 
610
620
  case scope.keys.BOTTOM:
611
- pan( 0, - scope.keyPanSpeed );
621
+
622
+ if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
623
+
624
+ rotateUp( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );
625
+
626
+ } else {
627
+
628
+ pan( 0, - scope.keyPanSpeed );
629
+
630
+ }
631
+
612
632
  needsUpdate = true;
613
633
  break;
614
634
 
615
635
  case scope.keys.LEFT:
616
- pan( scope.keyPanSpeed, 0 );
636
+
637
+ if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
638
+
639
+ rotateLeft( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );
640
+
641
+ } else {
642
+
643
+ pan( scope.keyPanSpeed, 0 );
644
+
645
+ }
646
+
617
647
  needsUpdate = true;
618
648
  break;
619
649
 
620
650
  case scope.keys.RIGHT:
621
- pan( - scope.keyPanSpeed, 0 );
651
+
652
+ if ( event.ctrlKey || event.metaKey || event.shiftKey ) {
653
+
654
+ rotateLeft( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );
655
+
656
+ } else {
657
+
658
+ pan( - scope.keyPanSpeed, 0 );
659
+
660
+ }
661
+
622
662
  needsUpdate = true;
623
663
  break;
624
664
 
@@ -20,16 +20,10 @@ import {
20
20
  Scene,
21
21
  Source,
22
22
  sRGBEncoding,
23
- Texture,
24
23
  CompressedTexture,
25
- PlaneGeometry,
26
- ShaderMaterial,
27
- Mesh,
28
- PerspectiveCamera,
29
- WebGLRenderer,
30
- Uniform,
31
24
  Vector3
32
25
  } from 'three';
26
+ import { decompress } from './../utils/TextureUtils.js';
33
27
 
34
28
  class GLTFExporter {
35
29
 
@@ -49,12 +43,6 @@ class GLTFExporter {
49
43
 
50
44
  } );
51
45
 
52
- this.register( function ( writer ) {
53
-
54
- return new GLTFMaterialsPBRSpecularGlossiness( writer );
55
-
56
- } );
57
-
58
46
  this.register( function ( writer ) {
59
47
 
60
48
  return new GLTFMaterialsTransmissionExtension( writer );
@@ -551,13 +539,6 @@ class GLTFWriter {
551
539
 
552
540
  }
553
541
 
554
- // Clean up in case we had to create a temporary renderer for blitting compressed textures.
555
- if (this.temporaryRenderer) {
556
-
557
- this.temporaryRenderer.dispose();
558
-
559
- }
560
-
561
542
  }
562
543
 
563
544
  /**
@@ -736,49 +717,6 @@ class GLTFWriter {
736
717
 
737
718
  }
738
719
 
739
- buildReadableTexture( map, maxTextureSize ) {
740
-
741
- const fullscreenQuadGeometry = new PlaneGeometry( 2, 2, 1, 1 );
742
- const fullscreenQuadMaterial = new ShaderMaterial( {
743
- uniforms: { blitTexture: new Uniform( map ) },
744
- vertexShader: `
745
- varying vec2 vUv;
746
- void main(){
747
- vUv = uv;
748
- gl_Position = vec4(position.xy * 1.0,0.,.999999);
749
- }`,
750
- fragmentShader: `
751
- uniform sampler2D blitTexture;
752
- varying vec2 vUv;
753
- void main(){
754
- gl_FragColor = vec4(vUv.xy, 0, 1);
755
- gl_FragColor = texture2D( blitTexture, vUv);
756
- }`
757
- } );
758
-
759
- const fullscreenQuad = new Mesh( fullscreenQuadGeometry, fullscreenQuadMaterial );
760
- fullscreenQuad.frustrumCulled = false;
761
-
762
- const temporaryCam = new PerspectiveCamera();
763
- const temporaryScene = new Scene();
764
- temporaryScene.add( fullscreenQuad );
765
-
766
- if (!this.temporaryRenderer) {
767
-
768
- this.temporaryRenderer = new WebGLRenderer( { antialias: false } );
769
-
770
- }
771
-
772
- this.temporaryRenderer.setSize( Math.min(map.image.width, maxTextureSize), Math.min(map.image.height, maxTextureSize) );
773
- this.temporaryRenderer.clear();
774
- this.temporaryRenderer.render( temporaryScene, temporaryCam );
775
-
776
- const readableTexture = new Texture( this.temporaryRenderer.domElement );
777
- readableTexture.userData.mimeType = 'image/png';
778
- return readableTexture;
779
-
780
- }
781
-
782
720
  buildMetalRoughTexture( metalnessMap, roughnessMap ) {
783
721
 
784
722
  if ( metalnessMap === roughnessMap ) return metalnessMap;
@@ -807,17 +745,17 @@ class GLTFWriter {
807
745
 
808
746
  console.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );
809
747
 
810
- if ( typeof CompressedTexture !== 'undefined') {
748
+ if ( typeof CompressedTexture !== 'undefined' ) {
811
749
 
812
750
  if ( metalnessMap instanceof CompressedTexture ) {
813
751
 
814
- metalnessMap = this.buildReadableTexture( metalnessMap );
752
+ metalnessMap = decompress( metalnessMap );
815
753
 
816
754
  }
817
755
 
818
756
  if ( roughnessMap instanceof CompressedTexture ) {
819
757
 
820
- roughnessMap = this.buildReadableTexture( roughnessMap );
758
+ roughnessMap = decompress( roughnessMap );
821
759
 
822
760
  }
823
761
 
@@ -1215,6 +1153,7 @@ class GLTFWriter {
1215
1153
  console.error( 'GLTFExporter: Only RGBAFormat is supported.', image );
1216
1154
 
1217
1155
  }
1156
+
1218
1157
  if ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {
1219
1158
 
1220
1159
  console.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );
@@ -1341,13 +1280,14 @@ class GLTFWriter {
1341
1280
  let modifiedMap = map;
1342
1281
 
1343
1282
  // make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture
1344
- // TODO: how to detect that a texture isn't readable?
1345
1283
  if ( typeof CompressedTexture !== 'undefined' && map instanceof CompressedTexture ) {
1346
1284
 
1347
- modifiedMap = this.buildReadableTexture( map, options.maxTextureSize );
1285
+ modifiedMap = decompress( map, options.maxTextureSize );
1286
+ // remove from cache, as the underlaying canvas is always the same between decompressed textures
1287
+ cache.images.delete( modifiedMap.image );
1348
1288
 
1349
1289
  }
1350
-
1290
+
1351
1291
  let mimeType = modifiedMap.userData.mimeType;
1352
1292
 
1353
1293
  if ( mimeType === 'image/webp' ) mimeType = 'image/png';
@@ -1423,9 +1363,11 @@ class GLTFWriter {
1423
1363
  }
1424
1364
 
1425
1365
  // pbrMetallicRoughness.metallicRoughnessTexture
1426
- if ( material.metalnessMap || material.roughnessMap ) {
1366
+ const metalnessMap = material.metalnessMap?.image ? material.metalnessMap : undefined;
1367
+ const roughnessMap = material.roughnessMap?.image ? material.roughnessMap : undefined;
1368
+ if ( metalnessMap || roughnessMap ) {
1427
1369
 
1428
- const metalRoughTexture = this.buildMetalRoughTexture( material.metalnessMap, material.roughnessMap );
1370
+ const metalRoughTexture = this.buildMetalRoughTexture( metalnessMap, roughnessMap );
1429
1371
 
1430
1372
  const metalRoughMapDef = { index: this.processTexture( metalRoughTexture ) };
1431
1373
  this.applyTextureTransform( metalRoughMapDef, metalRoughTexture );
@@ -1434,7 +1376,7 @@ class GLTFWriter {
1434
1376
  }
1435
1377
 
1436
1378
  // pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture
1437
- if ( material.map ) {
1379
+ if ( material.map?.image ) {
1438
1380
 
1439
1381
  const baseColorMapDef = { index: this.processTexture( material.map ) };
1440
1382
  this.applyTextureTransform( baseColorMapDef, material.map );
@@ -1463,7 +1405,7 @@ class GLTFWriter {
1463
1405
  }
1464
1406
 
1465
1407
  // emissiveTexture
1466
- if ( material.emissiveMap ) {
1408
+ if ( material.emissiveMap?.image ) {
1467
1409
 
1468
1410
  const emissiveMapDef = { index: this.processTexture( material.emissiveMap ) };
1469
1411
  this.applyTextureTransform( emissiveMapDef, material.emissiveMap );
@@ -1474,7 +1416,7 @@ class GLTFWriter {
1474
1416
  }
1475
1417
 
1476
1418
  // normalTexture
1477
- if ( material.normalMap ) {
1419
+ if ( material.normalMap?.image ) {
1478
1420
 
1479
1421
  const normalMapDef = { index: this.processTexture( material.normalMap ) };
1480
1422
 
@@ -1492,7 +1434,7 @@ class GLTFWriter {
1492
1434
  }
1493
1435
 
1494
1436
  // occlusionTexture
1495
- if ( material.aoMap ) {
1437
+ if ( material.aoMap?.image ) {
1496
1438
 
1497
1439
  const occlusionMapDef = {
1498
1440
  index: this.processTexture( material.aoMap ),
@@ -2413,62 +2355,6 @@ class GLTFMaterialsUnlitExtension {
2413
2355
 
2414
2356
  }
2415
2357
 
2416
- /**
2417
- * Specular-Glossiness Extension
2418
- *
2419
- * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness
2420
- */
2421
- class GLTFMaterialsPBRSpecularGlossiness {
2422
-
2423
- constructor( writer ) {
2424
-
2425
- this.writer = writer;
2426
- this.name = 'KHR_materials_pbrSpecularGlossiness';
2427
-
2428
- }
2429
-
2430
- writeMaterial( material, materialDef ) {
2431
-
2432
- if ( ! material.isGLTFSpecularGlossinessMaterial ) return;
2433
-
2434
- const writer = this.writer;
2435
- const extensionsUsed = writer.extensionsUsed;
2436
-
2437
- const extensionDef = {};
2438
-
2439
- if ( materialDef.pbrMetallicRoughness.baseColorFactor ) {
2440
-
2441
- extensionDef.diffuseFactor = materialDef.pbrMetallicRoughness.baseColorFactor;
2442
-
2443
- }
2444
-
2445
- const specularFactor = [ 1, 1, 1 ];
2446
- material.specular.toArray( specularFactor, 0 );
2447
- extensionDef.specularFactor = specularFactor;
2448
- extensionDef.glossinessFactor = material.glossiness;
2449
-
2450
- if ( materialDef.pbrMetallicRoughness.baseColorTexture ) {
2451
-
2452
- extensionDef.diffuseTexture = materialDef.pbrMetallicRoughness.baseColorTexture;
2453
-
2454
- }
2455
-
2456
- if ( material.specularMap ) {
2457
-
2458
- const specularMapDef = { index: writer.processTexture( material.specularMap ) };
2459
- writer.applyTextureTransform( specularMapDef, material.specularMap );
2460
- extensionDef.specularGlossinessTexture = specularMapDef;
2461
-
2462
- }
2463
-
2464
- materialDef.extensions = materialDef.extensions || {};
2465
- materialDef.extensions[ this.name ] = extensionDef;
2466
- extensionsUsed[ this.name ] = true;
2467
-
2468
- }
2469
-
2470
- }
2471
-
2472
2358
  /**
2473
2359
  * Clearcoat Materials Extension
2474
2360
  *
@@ -7,14 +7,13 @@ import {
7
7
  Mesh,
8
8
  ShaderMaterial,
9
9
  WebGLRenderer,
10
+ MathUtils,
10
11
  Matrix4,
11
12
  RepeatWrapping,
12
13
  MirroredRepeatWrapping,
13
14
  DoubleSide
14
15
  } from 'three';
15
- import * as fflate from 'three/examples/jsm/libs/fflate.module.js';
16
- import { generateUUID } from 'three/src/math/mathutils.js';
17
-
16
+ import * as fflate from '../libs/fflate.module.js';
18
17
 
19
18
  class USDZDocument {
20
19
 
@@ -131,7 +130,7 @@ export class USDZObject {
131
130
 
132
131
  static createEmptyParent( object ) {
133
132
 
134
- const emptyParent = new USDZObject( generateUUID(), object.name + '_empty_' + ( this._id ++ ), object.matrix );
133
+ const emptyParent = new USDZObject( MathUtils.generateUUID(), object.name + '_empty_' + ( this._id ++ ), object.matrix );
135
134
  const parent = object.parent;
136
135
  parent.add( emptyParent );
137
136
  emptyParent.add( object );
@@ -141,13 +140,14 @@ export class USDZObject {
141
140
 
142
141
  }
143
142
 
144
- constructor( id, name, matrix, mesh, material ) {
143
+ constructor( id, name, matrix, mesh, material, camera ) {
145
144
 
146
145
  this.uuid = id;
147
146
  this.name = name;
148
147
  this.matrix = matrix;
149
148
  this.geometry = mesh;
150
149
  this.material = material;
150
+ this.camera = camera;
151
151
  this.parent = null;
152
152
  this.children = [];
153
153
  this._eventListeners = {};
@@ -170,7 +170,7 @@ export class USDZObject {
170
170
 
171
171
  clone() {
172
172
 
173
- const clone = new USDZObject( generateUUID(), this.name, this.matrix, this.mesh, this.material );
173
+ const clone = new USDZObject( MathUtils.generateUUID(), this.name, this.matrix, this.mesh, this.material );
174
174
  clone.isDynamic = this.isDynamic;
175
175
  return clone;
176
176
 
@@ -340,8 +340,9 @@ class USDZExporterContext {
340
340
 
341
341
  class USDZExporter {
342
342
 
343
- async parse( scene, extensions ) {
343
+ async parse( scene, extensions, sceneAnchoringOptions = { ar: { anchoring: { type: 'plane' }, planeAnchoring: { alignment: 'horizontal' } } } ) {
344
344
 
345
+ this.sceneAnchoringOptions = sceneAnchoringOptions;
345
346
  const context = new USDZExporterContext( scene, this, extensions );
346
347
  extensions = context.extensions;
347
348
 
@@ -368,7 +369,6 @@ class USDZExporter {
368
369
 
369
370
  invokeAll( context, 'onAfterHierarchy' );
370
371
 
371
-
372
372
  const header = context.document.buildHeader();
373
373
  const final = header + '\n' + context.output;
374
374
 
@@ -445,6 +445,11 @@ function traverseVisible( object, parentModel, context ) {
445
445
  const name = getObjectId( object );
446
446
  model = new USDZObject( object.uuid, name, object.matrix, geometry, material );
447
447
 
448
+ } else if ( object.isCamera ) {
449
+
450
+ const name = getObjectId( object );
451
+ model = new USDZObject( object.uuid, name, object.matrix, undefined, undefined, object );
452
+
448
453
  } else {
449
454
 
450
455
  const name = getObjectId( object );
@@ -505,6 +510,22 @@ function parseDocument( context ) {
505
510
  const writer = new CodeWriter();
506
511
 
507
512
  writer.beginBlock( `def Xform "${context.document.name}"` );
513
+
514
+ writer.beginBlock( `def Scope "Scenes" (
515
+ kind = "sceneLibrary"
516
+ )`);
517
+
518
+ writer.beginBlock(`def Xform "Scene" (
519
+ customData = {
520
+ bool preliminary_collidesWithEnvironment = 0
521
+ string sceneName = "Scene"
522
+ }
523
+ sceneName = "Scene"
524
+ )`);
525
+
526
+ writer.appendLine(`token preliminary:anchoring:type = "${context.exporter.sceneAnchoringOptions.ar.anchoring.type}"`);
527
+ writer.appendLine(`token preliminary:planeAnchoring:alignment = "${context.exporter.sceneAnchoringOptions.ar.planeAnchoring.alignment}"`);
528
+ writer.appendLine();
508
529
 
509
530
  for ( const child of context.document.children ) {
510
531
 
@@ -512,6 +533,8 @@ function parseDocument( context ) {
512
533
 
513
534
  }
514
535
 
536
+ writer.closeBlock();
537
+ writer.closeBlock();
515
538
  writer.closeBlock();
516
539
 
517
540
  context.output += writer.toString();
@@ -699,11 +722,10 @@ export function buildXform( model, writer, context ) {
699
722
  const matrix = model.matrix;
700
723
  const geometry = model.geometry;
701
724
  const material = model.material;
725
+ const camera = model.camera;
702
726
  const name = model.name;
703
727
  const transform = buildMatrix( matrix );
704
728
 
705
- // console.log(model.name, model.getPath());
706
-
707
729
  if ( matrix.determinant() < 0 ) {
708
730
 
709
731
  console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', path );
@@ -712,6 +734,8 @@ export function buildXform( model, writer, context ) {
712
734
 
713
735
  if ( geometry )
714
736
  writer.beginBlock( `def Xform "${name}" (prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>)` );
737
+ else if ( camera )
738
+ writer.beginBlock( `def Camera "${name}"` );
715
739
  else
716
740
  writer.beginBlock( `def Xform "${name}"` );
717
741
 
@@ -719,6 +743,29 @@ export function buildXform( model, writer, context ) {
719
743
  writer.appendLine( `rel material:binding = </Materials/Material_${material.id}>` );
720
744
  writer.appendLine( `matrix4d xformOp:transform = ${transform}` );
721
745
  writer.appendLine( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
746
+
747
+ if ( camera ) {
748
+
749
+ if ( camera.isOrthographicCamera ) {
750
+
751
+ writer.appendLine(`float2 clippingRange = (${camera.near}, ${camera.far})`);
752
+ writer.appendLine(`float horizontalAperture = ${(( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10).toPrecision( PRECISION )}`);
753
+ writer.appendLine(`float verticalAperture = ${(( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10).toPrecision( PRECISION )}`);
754
+ writer.appendLine(`token projection = "orthographic"`);
755
+
756
+ } else {
757
+
758
+ writer.appendLine(`float2 clippingRange = (${camera.near.toPrecision( PRECISION )}, ${camera.far.toPrecision( PRECISION )})`);
759
+ writer.appendLine(`float focalLength = ${camera.getFocalLength().toPrecision( PRECISION )}`);
760
+ writer.appendLine(`float focusDistance = ${camera.focus.toPrecision( PRECISION )}`);
761
+ writer.appendLine(`float horizontalAperture = ${camera.getFilmWidth().toPrecision( PRECISION )}`);
762
+ writer.appendLine(`token projection = "perspective"`);
763
+ writer.appendLine(`float verticalAperture = ${camera.getFilmHeight().toPrecision( PRECISION )}`);
764
+
765
+ }
766
+
767
+ }
768
+
722
769
  if ( model.onSerialize ) {
723
770
 
724
771
  model.onSerialize( writer, context );
@@ -783,9 +830,14 @@ function buildMesh( geometry ) {
783
830
  interpolation = "vertex"
784
831
  )
785
832
  point3f[] points = [${buildVector3Array( attributes.position, count )}]
786
- float2[] primvars:st = [${buildVector2Array( attributes.uv, count )}] (
833
+ ${attributes.uv ?
834
+ `float2[] primvars:st = [${buildVector2Array( attributes.uv, count )}] (
787
835
  interpolation = "vertex"
788
- )
836
+ )` : '' }
837
+ ${attributes.uv2 ?
838
+ `float2[] primvars:st2 = [${buildVector2Array( attributes.uv2, count )}] (
839
+ interpolation = "vertex"
840
+ )` : '' }
789
841
  uniform token subdivisionScheme = "none"
790
842
  }
791
843
  `;
@@ -934,26 +986,31 @@ function buildMaterial( material, textures ) {
934
986
  }
935
987
 
936
988
  textures[ id ] = texture;
989
+ const uvReader = mapType == 'occlusion' ? 'uvReader_st2' : 'uvReader_st';
990
+
991
+ const needsTextureTransform = ( repeat.x != 1 || repeat.y != 1 || offset.x != 0 || offset.y != 0 );
992
+ const textureTransformInput = `</Materials/Material_${material.id}/${uvReader}.outputs:result>`;
993
+ const textureTransformOutput = `</Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>`;
937
994
 
938
995
  return `
939
- def Shader "Transform2d_${mapType}" (
996
+ ${needsTextureTransform ? `def Shader "Transform2d_${mapType}" (
940
997
  sdrMetadata = {
941
998
  string role = "math"
942
999
  }
943
1000
  )
944
1001
  {
945
1002
  uniform token info:id = "UsdTransform2d"
946
- float2 inputs:in.connect = </Materials/Material_${material.id}/uvReader_st.outputs:result>
1003
+ float2 inputs:in.connect = ${textureTransformInput}
947
1004
  float2 inputs:scale = ${buildVector2( repeat )}
948
1005
  float2 inputs:translation = ${buildVector2( offset )}
949
1006
  float2 outputs:result
950
1007
  }
951
-
952
- def Shader "Texture_${texture.id}_${mapType}"
1008
+ ` : '' }
1009
+ def Shader "Texture_${texture.id}_${mapType}"
953
1010
  {
954
1011
  uniform token info:id = "UsdUVTexture"
955
1012
  asset inputs:file = @textures/Texture_${id}.${isRGBA ? 'png' : 'jpg'}@
956
- float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>
1013
+ float2 inputs:st.connect = ${needsTextureTransform ? textureTransformOutput : textureTransformInput}
957
1014
  float4 inputs:scale = (${color ? color.r + ', ' + color.g + ', ' + color.b : '1, 1, 1'}, ${opacity ? opacity : '1'})
958
1015
  token inputs:wrapS = "${wrapS}"
959
1016
  token inputs:wrapT = "${wrapT}"
@@ -966,13 +1023,15 @@ function buildMaterial( material, textures ) {
966
1023
 
967
1024
  }
968
1025
 
1026
+ const effectiveOpacity = (material.transparent || material.alphaTest) ? material.opacity : 1;
1027
+
969
1028
  if ( material.side === DoubleSide ) {
970
1029
 
971
1030
  console.warn( 'THREE.USDZExporter: USDZ does not support double sided materials', material );
972
1031
 
973
1032
  }
974
1033
 
975
- if ( material.map !== null ) {
1034
+ if ( material.map?.image ) {
976
1035
 
977
1036
  inputs.push( `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>` );
978
1037
 
@@ -987,7 +1046,7 @@ function buildMaterial( material, textures ) {
987
1046
 
988
1047
  }
989
1048
 
990
- samplers.push( buildTexture( material.map, 'diffuse', material.color, material.opacity ) );
1049
+ samplers.push( buildTexture( material.map, 'diffuse', material.color, effectiveOpacity ) );
991
1050
 
992
1051
  } else {
993
1052
 
@@ -995,7 +1054,7 @@ function buildMaterial( material, textures ) {
995
1054
 
996
1055
  }
997
1056
 
998
- if ( material.emissiveMap !== null ) {
1057
+ if ( material.emissiveMap?.image ) {
999
1058
 
1000
1059
  inputs.push( `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>` );
1001
1060
 
@@ -1007,7 +1066,7 @@ function buildMaterial( material, textures ) {
1007
1066
 
1008
1067
  }
1009
1068
 
1010
- if ( material.normalMap !== null ) {
1069
+ if ( material.normalMap?.image ) {
1011
1070
 
1012
1071
  inputs.push( `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>` );
1013
1072
 
@@ -1015,7 +1074,7 @@ function buildMaterial( material, textures ) {
1015
1074
 
1016
1075
  }
1017
1076
 
1018
- if ( material.aoMap !== null ) {
1077
+ if ( material.aoMap?.image ) {
1019
1078
 
1020
1079
  inputs.push( `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>` );
1021
1080
 
@@ -1023,7 +1082,7 @@ function buildMaterial( material, textures ) {
1023
1082
 
1024
1083
  }
1025
1084
 
1026
- if ( material.roughnessMap !== null && material.roughness === 1 ) {
1085
+ if ( material.roughnessMap?.image && material.roughness === 1 ) {
1027
1086
 
1028
1087
  inputs.push( `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>` );
1029
1088
 
@@ -1035,7 +1094,7 @@ function buildMaterial( material, textures ) {
1035
1094
 
1036
1095
  }
1037
1096
 
1038
- if ( material.metalnessMap !== null && material.metalness === 1 ) {
1097
+ if ( material.metalnessMap?.image && material.metalness === 1 ) {
1039
1098
 
1040
1099
  inputs.push( `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>` );
1041
1100
 
@@ -1047,7 +1106,7 @@ function buildMaterial( material, textures ) {
1047
1106
 
1048
1107
  }
1049
1108
 
1050
- if ( material.alphaMap !== null ) {
1109
+ if ( material.alphaMap?.image ) {
1051
1110
 
1052
1111
  inputs.push( `${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>` );
1053
1112
  inputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );
@@ -1056,7 +1115,7 @@ function buildMaterial( material, textures ) {
1056
1115
 
1057
1116
  } else {
1058
1117
 
1059
- inputs.push( `${pad}float inputs:opacity = ${material.opacity}` );
1118
+ inputs.push( `${pad}float inputs:opacity = ${effectiveOpacity}` );
1060
1119
 
1061
1120
  }
1062
1121
 
@@ -1080,12 +1139,19 @@ ${inputs.join( '\n' )}
1080
1139
  }
1081
1140
 
1082
1141
  token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>
1083
- token inputs:frame:stPrimvarName = "st"
1084
1142
 
1085
1143
  def Shader "uvReader_st"
1086
1144
  {
1087
1145
  uniform token info:id = "UsdPrimvarReader_float2"
1088
- token inputs:varname.connect = </Materials/Material_${material.id}.inputs:frame:stPrimvarName>
1146
+ token inputs:varname = "st"
1147
+ float2 inputs:fallback = (0.0, 0.0)
1148
+ float2 outputs:result
1149
+ }
1150
+
1151
+ def Shader "uvReader_st2"
1152
+ {
1153
+ uniform token info:id = "UsdPrimvarReader_float2"
1154
+ token inputs:varname = "st2"
1089
1155
  float2 inputs:fallback = (0.0, 0.0)
1090
1156
  float2 outputs:result
1091
1157
  }
@@ -36,6 +36,8 @@ class HTMLMesh extends Mesh {
36
36
  material.dispose();
37
37
 
38
38
  material.map.dispose();
39
+
40
+ canvases.delete( dom );
39
41
 
40
42
  this.removeEventListener( 'mousedown', onEvent );
41
43
  this.removeEventListener( 'mousemove', onEvent );