@needle-tools/three 0.145.4 → 0.146.2

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 +75 -19
  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,17 @@ 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';
16
+ import * as fflate from '../libs/fflate.module.js';
17
17
 
18
+ function makeNameSafe(str){
19
+ return str.replace(/[^a-zA-Z0-9_]/g, '');
20
+ }
18
21
 
19
22
  class USDZDocument {
20
23
 
@@ -111,7 +114,7 @@ class USDZDocument {
111
114
  customLayerData = {
112
115
  string creator = "Three.js USDZExporter"
113
116
  }
114
- defaultPrim = "${this.name}"
117
+ defaultPrim = "${makeNameSafe(this.name)}"
115
118
  metersPerUnit = 1
116
119
  upAxis = "Y"
117
120
  startTimeCode = 0
@@ -131,7 +134,7 @@ export class USDZObject {
131
134
 
132
135
  static createEmptyParent( object ) {
133
136
 
134
- const emptyParent = new USDZObject( generateUUID(), object.name + '_empty_' + ( this._id ++ ), object.matrix );
137
+ const emptyParent = new USDZObject( MathUtils.generateUUID(), object.name + '_empty_' + ( this._id ++ ), object.matrix );
135
138
  const parent = object.parent;
136
139
  parent.add( emptyParent );
137
140
  emptyParent.add( object );
@@ -141,13 +144,14 @@ export class USDZObject {
141
144
 
142
145
  }
143
146
 
144
- constructor( id, name, matrix, mesh, material ) {
147
+ constructor( id, name, matrix, mesh, material, camera ) {
145
148
 
146
149
  this.uuid = id;
147
- this.name = name;
150
+ this.name = makeNameSafe(name);
148
151
  this.matrix = matrix;
149
152
  this.geometry = mesh;
150
153
  this.material = material;
154
+ this.camera = camera;
151
155
  this.parent = null;
152
156
  this.children = [];
153
157
  this._eventListeners = {};
@@ -170,7 +174,7 @@ export class USDZObject {
170
174
 
171
175
  clone() {
172
176
 
173
- const clone = new USDZObject( generateUUID(), this.name, this.matrix, this.mesh, this.material );
177
+ const clone = new USDZObject( MathUtils.generateUUID(), this.name, this.matrix, this.mesh, this.material );
174
178
  clone.isDynamic = this.isDynamic;
175
179
  return clone;
176
180
 
@@ -340,8 +344,13 @@ class USDZExporterContext {
340
344
 
341
345
  class USDZExporter {
342
346
 
343
- async parse( scene, extensions ) {
347
+ constructor(){
348
+ this.debug = false;
349
+ }
350
+
351
+ async parse( scene, extensions, sceneAnchoringOptions = { ar: { anchoring: { type: 'plane' }, planeAnchoring: { alignment: 'horizontal' } } } ) {
344
352
 
353
+ this.sceneAnchoringOptions = sceneAnchoringOptions;
345
354
  const context = new USDZExporterContext( scene, this, extensions );
346
355
  extensions = context.extensions;
347
356
 
@@ -368,7 +377,6 @@ class USDZExporter {
368
377
 
369
378
  invokeAll( context, 'onAfterHierarchy' );
370
379
 
371
-
372
380
  const header = context.document.buildHeader();
373
381
  const final = header + '\n' + context.output;
374
382
 
@@ -376,7 +384,8 @@ class USDZExporter {
376
384
  this.lastUsda = final;
377
385
 
378
386
  // full output file
379
- console.log( final );
387
+ if(this.debug)
388
+ console.log( final );
380
389
 
381
390
  files[ modelFileName ] = fflate.strToU8( final );
382
391
  context.output = null;
@@ -445,6 +454,11 @@ function traverseVisible( object, parentModel, context ) {
445
454
  const name = getObjectId( object );
446
455
  model = new USDZObject( object.uuid, name, object.matrix, geometry, material );
447
456
 
457
+ } else if ( object.isCamera ) {
458
+
459
+ const name = getObjectId( object );
460
+ model = new USDZObject( object.uuid, name, object.matrix, undefined, undefined, object );
461
+
448
462
  } else {
449
463
 
450
464
  const name = getObjectId( object );
@@ -505,6 +519,22 @@ function parseDocument( context ) {
505
519
  const writer = new CodeWriter();
506
520
 
507
521
  writer.beginBlock( `def Xform "${context.document.name}"` );
522
+
523
+ writer.beginBlock( `def Scope "Scenes" (
524
+ kind = "sceneLibrary"
525
+ )`);
526
+
527
+ writer.beginBlock(`def Xform "Scene" (
528
+ customData = {
529
+ bool preliminary_collidesWithEnvironment = 0
530
+ string sceneName = "Scene"
531
+ }
532
+ sceneName = "Scene"
533
+ )`);
534
+
535
+ writer.appendLine(`token preliminary:anchoring:type = "${context.exporter.sceneAnchoringOptions.ar.anchoring.type}"`);
536
+ writer.appendLine(`token preliminary:planeAnchoring:alignment = "${context.exporter.sceneAnchoringOptions.ar.planeAnchoring.alignment}"`);
537
+ writer.appendLine();
508
538
 
509
539
  for ( const child of context.document.children ) {
510
540
 
@@ -512,6 +542,8 @@ function parseDocument( context ) {
512
542
 
513
543
  }
514
544
 
545
+ writer.closeBlock();
546
+ writer.closeBlock();
515
547
  writer.closeBlock();
516
548
 
517
549
  context.output += writer.toString();
@@ -699,11 +731,10 @@ export function buildXform( model, writer, context ) {
699
731
  const matrix = model.matrix;
700
732
  const geometry = model.geometry;
701
733
  const material = model.material;
734
+ const camera = model.camera;
702
735
  const name = model.name;
703
736
  const transform = buildMatrix( matrix );
704
737
 
705
- // console.log(model.name, model.getPath());
706
-
707
738
  if ( matrix.determinant() < 0 ) {
708
739
 
709
740
  console.warn( 'THREE.USDZExporter: USDZ does not support negative scales', path );
@@ -712,6 +743,8 @@ export function buildXform( model, writer, context ) {
712
743
 
713
744
  if ( geometry )
714
745
  writer.beginBlock( `def Xform "${name}" (prepend references = @./geometries/Geometry_${geometry.id}.usd@</Geometry>)` );
746
+ else if ( camera )
747
+ writer.beginBlock( `def Camera "${name}"` );
715
748
  else
716
749
  writer.beginBlock( `def Xform "${name}"` );
717
750
 
@@ -719,6 +752,29 @@ export function buildXform( model, writer, context ) {
719
752
  writer.appendLine( `rel material:binding = </Materials/Material_${material.id}>` );
720
753
  writer.appendLine( `matrix4d xformOp:transform = ${transform}` );
721
754
  writer.appendLine( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
755
+
756
+ if ( camera ) {
757
+
758
+ if ( camera.isOrthographicCamera ) {
759
+
760
+ writer.appendLine(`float2 clippingRange = (${camera.near}, ${camera.far})`);
761
+ writer.appendLine(`float horizontalAperture = ${(( Math.abs( camera.left ) + Math.abs( camera.right ) ) * 10).toPrecision( PRECISION )}`);
762
+ writer.appendLine(`float verticalAperture = ${(( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) * 10).toPrecision( PRECISION )}`);
763
+ writer.appendLine(`token projection = "orthographic"`);
764
+
765
+ } else {
766
+
767
+ writer.appendLine(`float2 clippingRange = (${camera.near.toPrecision( PRECISION )}, ${camera.far.toPrecision( PRECISION )})`);
768
+ writer.appendLine(`float focalLength = ${camera.getFocalLength().toPrecision( PRECISION )}`);
769
+ writer.appendLine(`float focusDistance = ${camera.focus.toPrecision( PRECISION )}`);
770
+ writer.appendLine(`float horizontalAperture = ${camera.getFilmWidth().toPrecision( PRECISION )}`);
771
+ writer.appendLine(`token projection = "perspective"`);
772
+ writer.appendLine(`float verticalAperture = ${camera.getFilmHeight().toPrecision( PRECISION )}`);
773
+
774
+ }
775
+
776
+ }
777
+
722
778
  if ( model.onSerialize ) {
723
779
 
724
780
  model.onSerialize( writer, context );
@@ -984,7 +1040,7 @@ function buildMaterial( material, textures ) {
984
1040
 
985
1041
  }
986
1042
 
987
- if ( material.map !== null ) {
1043
+ if ( material.map?.image ) {
988
1044
 
989
1045
  inputs.push( `${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>` );
990
1046
 
@@ -1007,7 +1063,7 @@ function buildMaterial( material, textures ) {
1007
1063
 
1008
1064
  }
1009
1065
 
1010
- if ( material.emissiveMap !== null ) {
1066
+ if ( material.emissiveMap?.image ) {
1011
1067
 
1012
1068
  inputs.push( `${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>` );
1013
1069
 
@@ -1019,7 +1075,7 @@ function buildMaterial( material, textures ) {
1019
1075
 
1020
1076
  }
1021
1077
 
1022
- if ( material.normalMap !== null ) {
1078
+ if ( material.normalMap?.image ) {
1023
1079
 
1024
1080
  inputs.push( `${pad}normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>` );
1025
1081
 
@@ -1027,7 +1083,7 @@ function buildMaterial( material, textures ) {
1027
1083
 
1028
1084
  }
1029
1085
 
1030
- if ( material.aoMap !== null ) {
1086
+ if ( material.aoMap?.image ) {
1031
1087
 
1032
1088
  inputs.push( `${pad}float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>` );
1033
1089
 
@@ -1035,7 +1091,7 @@ function buildMaterial( material, textures ) {
1035
1091
 
1036
1092
  }
1037
1093
 
1038
- if ( material.roughnessMap !== null && material.roughness === 1 ) {
1094
+ if ( material.roughnessMap?.image && material.roughness === 1 ) {
1039
1095
 
1040
1096
  inputs.push( `${pad}float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>` );
1041
1097
 
@@ -1047,7 +1103,7 @@ function buildMaterial( material, textures ) {
1047
1103
 
1048
1104
  }
1049
1105
 
1050
- if ( material.metalnessMap !== null && material.metalness === 1 ) {
1106
+ if ( material.metalnessMap?.image && material.metalness === 1 ) {
1051
1107
 
1052
1108
  inputs.push( `${pad}float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>` );
1053
1109
 
@@ -1059,7 +1115,7 @@ function buildMaterial( material, textures ) {
1059
1115
 
1060
1116
  }
1061
1117
 
1062
- if ( material.alphaMap !== null ) {
1118
+ if ( material.alphaMap?.image ) {
1063
1119
 
1064
1120
  inputs.push( `${pad}float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>` );
1065
1121
  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 );