@needle-tools/three 0.145.4 → 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 (393) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +32586 -35951
  3. package/build/three.js +32600 -35965
  4. package/build/three.min.js +6 -7
  5. package/build/three.module.js +1547 -1154
  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 +64 -17
  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/WebGLLights.js +0 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  382. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  383. package/src/renderers/webgl/WebGLState.js +31 -1
  384. package/src/renderers/webgl/WebGLTextures.js +71 -18
  385. package/src/renderers/webgl/WebGLUniforms.js +116 -20
  386. package/src/renderers/webgl/WebGLUtils.js +1 -1
  387. package/src/renderers/webxr/WebXRController.js +46 -13
  388. package/src/renderers/webxr/WebXRManager.js +85 -3
  389. package/src/scenes/Scene.js +8 -0
  390. package/src/textures/CompressedArrayTexture.js +18 -0
  391. package/examples/js/libs/lottie_canvas.js +0 -12751
  392. package/examples/js/shaders/PixelShader.js +0 -51
  393. 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 );
@@ -984,7 +1031,7 @@ function buildMaterial( material, textures ) {
984
1031
 
985
1032
  }
986
1033
 
987
- if ( material.map !== null ) {
1034
+ if ( material.map?.image ) {
988
1035
 
989
1036
  inputs.push( `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>` );
990
1037
 
@@ -1007,7 +1054,7 @@ function buildMaterial( material, textures ) {
1007
1054
 
1008
1055
  }
1009
1056
 
1010
- if ( material.emissiveMap !== null ) {
1057
+ if ( material.emissiveMap?.image ) {
1011
1058
 
1012
1059
  inputs.push( `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>` );
1013
1060
 
@@ -1019,7 +1066,7 @@ function buildMaterial( material, textures ) {
1019
1066
 
1020
1067
  }
1021
1068
 
1022
- if ( material.normalMap !== null ) {
1069
+ if ( material.normalMap?.image ) {
1023
1070
 
1024
1071
  inputs.push( `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>` );
1025
1072
 
@@ -1027,7 +1074,7 @@ function buildMaterial( material, textures ) {
1027
1074
 
1028
1075
  }
1029
1076
 
1030
- if ( material.aoMap !== null ) {
1077
+ if ( material.aoMap?.image ) {
1031
1078
 
1032
1079
  inputs.push( `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>` );
1033
1080
 
@@ -1035,7 +1082,7 @@ function buildMaterial( material, textures ) {
1035
1082
 
1036
1083
  }
1037
1084
 
1038
- if ( material.roughnessMap !== null && material.roughness === 1 ) {
1085
+ if ( material.roughnessMap?.image && material.roughness === 1 ) {
1039
1086
 
1040
1087
  inputs.push( `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>` );
1041
1088
 
@@ -1047,7 +1094,7 @@ function buildMaterial( material, textures ) {
1047
1094
 
1048
1095
  }
1049
1096
 
1050
- if ( material.metalnessMap !== null && material.metalness === 1 ) {
1097
+ if ( material.metalnessMap?.image && material.metalness === 1 ) {
1051
1098
 
1052
1099
  inputs.push( `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>` );
1053
1100
 
@@ -1059,7 +1106,7 @@ function buildMaterial( material, textures ) {
1059
1106
 
1060
1107
  }
1061
1108
 
1062
- if ( material.alphaMap !== null ) {
1109
+ if ( material.alphaMap?.image ) {
1063
1110
 
1064
1111
  inputs.push( `${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>` );
1065
1112
  inputs.push( `${pad}float inputs:opacityThreshold = 0.0001` );
@@ -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 );