super-three 0.181.0 → 0.185.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -2,6 +2,7 @@ import {
2
2
  NoColorSpace,
3
3
  DoubleSide,
4
4
  Color,
5
+ PropertyBinding,
5
6
  } from 'three';
6
7
 
7
8
  import {
@@ -76,7 +77,7 @@ class USDNode {
76
77
 
77
78
  const properties = this.properties.map( ( l ) => {
78
79
 
79
- const property = l.property;
80
+ const property = l.property.replace( /\n/g, '\n' + pad + '\t' );
80
81
  const metadata = l.metadata.length
81
82
  ? ` (\n${l.metadata.map( ( m ) => `${pad}\t\t${m}` ).join( '\n' )}\n${pad}\t)`
82
83
  : '';
@@ -199,6 +200,8 @@ class USDZExporter {
199
200
  onlyVisible: true,
200
201
  quickLookCompatible: false,
201
202
  maxTextureSize: 1024,
203
+ animations: [],
204
+ animationFrameRate: 60,
202
205
  },
203
206
  options
204
207
  );
@@ -211,6 +214,9 @@ class USDZExporter {
211
214
  // model file should be first in USDZ archive so we init it here
212
215
  files[ modelFileName ] = null;
213
216
 
217
+ const animationTracks = buildAnimationTracks( scene, options.animations );
218
+ options.animationTracks = animationTracks;
219
+
214
220
  const root = new USDNode( 'Root', 'Xform' );
215
221
  const scenesNode = new USDNode( 'Scenes', 'Scope' );
216
222
  scenesNode.addMetadata( 'kind', '"sceneLibrary"' );
@@ -241,7 +247,15 @@ class USDZExporter {
241
247
  const materials = {};
242
248
  const textures = {};
243
249
 
244
- buildHierarchy( scene, sceneNode, materials, usedNames, files, options );
250
+ if ( scene.isScene ) {
251
+
252
+ buildHierarchy( scene, sceneNode, materials, usedNames, files, options );
253
+
254
+ } else {
255
+
256
+ buildNode( scene, sceneNode, materials, usedNames, files, options );
257
+
258
+ }
245
259
 
246
260
  const materialsNode = buildMaterials(
247
261
  materials,
@@ -249,8 +263,12 @@ class USDZExporter {
249
263
  options.quickLookCompatible
250
264
  );
251
265
 
266
+ const timeRange = animationTracks.size > 0
267
+ ? { fps: options.animationFrameRate, endTimeCode: getMaxClipDuration( options.animations ) * options.animationFrameRate }
268
+ : null;
269
+
252
270
  output =
253
- buildHeader() +
271
+ buildHeader( timeRange ) +
254
272
  '\n' +
255
273
  root.toString() +
256
274
  '\n\n' +
@@ -284,11 +302,14 @@ class USDZExporter {
284
302
  texture.flipY,
285
303
  options.maxTextureSize
286
304
  );
305
+
306
+ const mimeType = ( texture.userData.mimeType === 'image/jpeg' ) ? 'image/jpeg' : 'image/png';
307
+
287
308
  const blob = await new Promise( ( resolve ) =>
288
- canvas.toBlob( resolve, 'image/png', 1 )
309
+ canvas.toBlob( resolve, mimeType )
289
310
  );
290
311
 
291
- files[ `textures/Texture_${id}.png` ] = new Uint8Array(
312
+ files[ `textures/Texture_${id}.${getTextureExtension( texture )}` ] = new Uint8Array(
292
313
  await blob.arrayBuffer()
293
314
  );
294
315
 
@@ -363,6 +384,12 @@ function getName( object, namesSet ) {
363
384
 
364
385
  }
365
386
 
387
+ function getTextureExtension( texture ) {
388
+
389
+ return texture.userData.mimeType === 'image/jpeg' ? 'jpg' : 'png';
390
+
391
+ }
392
+
366
393
  function imageToCanvas( image, flipY, maxTextureSize ) {
367
394
 
368
395
  if (
@@ -410,7 +437,15 @@ function imageToCanvas( image, flipY, maxTextureSize ) {
410
437
 
411
438
  const PRECISION = 7;
412
439
 
413
- function buildHeader() {
440
+ function buildHeader( timeRange = null ) {
441
+
442
+ const timeMetadata = timeRange
443
+ ? `
444
+ startTimeCode = 0
445
+ endTimeCode = ${timeRange.endTimeCode}
446
+ timeCodesPerSecond = ${timeRange.fps}
447
+ framesPerSecond = ${timeRange.fps}`
448
+ : '';
414
449
 
415
450
  return `#usda 1.0
416
451
  (
@@ -419,89 +454,255 @@ function buildHeader() {
419
454
  }
420
455
  defaultPrim = "Root"
421
456
  metersPerUnit = 1
422
- upAxis = "Y"
457
+ upAxis = "Y"${timeMetadata}
423
458
  )
424
459
  `;
425
460
 
426
461
  }
427
462
 
463
+ function buildAnimationTracks( scene, clips ) {
464
+
465
+ // Map<Object3D, { position?: KeyframeTrack, quaternion?: KeyframeTrack, scale?: KeyframeTrack }>
466
+ const tracksByObject = new Map();
467
+
468
+ for ( let c = 0; c < clips.length; c ++ ) {
469
+
470
+ const clip = clips[ c ];
471
+
472
+ for ( let t = 0; t < clip.tracks.length; t ++ ) {
473
+
474
+ const track = clip.tracks[ t ];
475
+ const binding = PropertyBinding.parseTrackName( track.name );
476
+ const target = PropertyBinding.findNode( scene, binding.nodeName );
477
+
478
+ if ( target === null || target === undefined ) continue;
479
+
480
+ const property = binding.propertyName;
481
+ if ( property !== 'position' && property !== 'quaternion' && property !== 'scale' ) continue;
482
+
483
+ let entry = tracksByObject.get( target );
484
+ if ( entry === undefined ) {
485
+
486
+ entry = {};
487
+ tracksByObject.set( target, entry );
488
+
489
+ }
490
+
491
+ entry[ property ] = track;
492
+
493
+ }
494
+
495
+ }
496
+
497
+ return tracksByObject;
498
+
499
+ }
500
+
501
+ function getMaxClipDuration( clips ) {
502
+
503
+ let max = 0;
504
+ for ( let i = 0; i < clips.length; i ++ ) {
505
+
506
+ if ( clips[ i ].duration > max ) max = clips[ i ].duration;
507
+
508
+ }
509
+
510
+ return max;
511
+
512
+ }
513
+
514
+ function buildVector3TimeSamples( opName, opType, track, fps ) {
515
+
516
+ const times = track.times;
517
+ const values = track.values;
518
+ const samples = [];
519
+
520
+ for ( let i = 0; i < times.length; i ++ ) {
521
+
522
+ const o = i * 3;
523
+ samples.push( `${( times[ i ] * fps ).toPrecision( PRECISION )}: (${values[ o ].toPrecision( PRECISION )}, ${values[ o + 1 ].toPrecision( PRECISION )}, ${values[ o + 2 ].toPrecision( PRECISION )})` );
524
+
525
+ }
526
+
527
+ return `${opType} ${opName}.timeSamples = {\n\t${samples.join( ',\n\t' )},\n}`;
528
+
529
+ }
530
+
531
+ function buildQuaternionTimeSamples( track, fps ) {
532
+
533
+ const times = track.times;
534
+ const values = track.values;
535
+ const samples = [];
536
+
537
+ // three.js quaternion order: (x, y, z, w); USD quatf order: (w, x, y, z)
538
+ for ( let i = 0; i < times.length; i ++ ) {
539
+
540
+ const o = i * 4;
541
+ samples.push( `${( times[ i ] * fps ).toPrecision( PRECISION )}: (${values[ o + 3 ].toPrecision( PRECISION )}, ${values[ o ].toPrecision( PRECISION )}, ${values[ o + 1 ].toPrecision( PRECISION )}, ${values[ o + 2 ].toPrecision( PRECISION )})` );
542
+
543
+ }
544
+
545
+ return `quatf xformOp:orient.timeSamples = {\n\t${samples.join( ',\n\t' )},\n}`;
546
+
547
+ }
548
+
428
549
  // Xform
429
550
 
430
551
  function buildHierarchy( object, parentNode, materials, usedNames, files, options ) {
431
552
 
432
553
  for ( let i = 0, l = object.children.length; i < l; i ++ ) {
433
554
 
434
- const child = object.children[ i ];
555
+ buildNode( object.children[ i ], parentNode, materials, usedNames, files, options );
435
556
 
436
- if ( child.visible === false && options.onlyVisible === true ) continue;
557
+ }
437
558
 
438
- let childNode;
559
+ }
439
560
 
440
- if ( child.isMesh ) {
561
+ function buildNode( object, parentNode, materials, usedNames, files, options ) {
441
562
 
442
- const geometry = child.geometry;
443
- const material = child.material;
563
+ if ( object.visible === false && options.onlyVisible === true ) return;
444
564
 
445
- if ( material.isMeshStandardMaterial ) {
565
+ let childNode;
446
566
 
447
- const geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';
567
+ if ( object.isMesh ) {
448
568
 
449
- if ( ! ( geometryFileName in files ) ) {
569
+ const geometry = object.geometry;
570
+ const isMultiMaterial = Array.isArray( object.material );
450
571
 
451
- const meshObject = buildMeshObject( geometry );
452
- files[ geometryFileName ] = strToU8(
453
- buildHeader() + '\n' + meshObject.toString()
454
- );
572
+ const meshMaterials = isMultiMaterial ? object.material : [ object.material ];
455
573
 
456
- }
574
+ for ( let i = 0; i < meshMaterials.length; i ++ ) {
457
575
 
458
- if ( ! ( material.uuid in materials ) ) {
576
+ const material = meshMaterials[ i ];
459
577
 
460
- materials[ material.uuid ] = material;
578
+ if ( ! material.isMeshStandardMaterial ) {
461
579
 
462
- }
580
+ console.warn( 'THREE.USDZExporter: Use MeshStandardMaterial for best results.' );
463
581
 
464
- childNode = buildMesh(
465
- child,
466
- geometry,
467
- materials[ material.uuid ],
468
- usedNames
469
- );
582
+ }
470
583
 
471
- } else {
584
+ if ( ! ( material.uuid in materials ) ) {
472
585
 
473
- console.warn(
474
- 'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)',
475
- child
476
- );
586
+ materials[ material.uuid ] = material;
477
587
 
478
588
  }
479
589
 
480
- } else if ( child.isCamera ) {
590
+ }
481
591
 
482
- childNode = buildCamera( child, usedNames );
592
+ const resolvedMaterials = meshMaterials.map( ( m ) => materials[ m.uuid ] );
483
593
 
484
- } else {
594
+ if ( isMultiMaterial === false ) {
485
595
 
486
- childNode = buildXform( child, usedNames );
596
+ const geometryFileName = `geometries/Geometry_${geometry.id}.usda`;
487
597
 
488
- }
598
+ if ( ! ( geometryFileName in files ) ) {
489
599
 
490
- if ( childNode ) {
600
+ const meshObject = buildMeshObject( geometry );
601
+ files[ geometryFileName ] = strToU8(
602
+ buildHeader() + '\n' + meshObject.toString()
603
+ );
491
604
 
492
- parentNode.addChild( childNode );
493
- buildHierarchy( child, childNode, materials, usedNames, files, options );
605
+ }
494
606
 
495
607
  }
496
608
 
609
+ childNode = buildMesh(
610
+ object,
611
+ geometry,
612
+ resolvedMaterials,
613
+ usedNames,
614
+ options
615
+ );
616
+
617
+ } else if ( object.isCamera ) {
618
+
619
+ childNode = buildCamera( object, usedNames, options );
620
+
621
+ } else {
622
+
623
+ childNode = buildXform( object, usedNames, options );
624
+
625
+ }
626
+
627
+ parentNode.addChild( childNode );
628
+ buildHierarchy( object, childNode, materials, usedNames, files, options );
629
+
630
+ }
631
+
632
+ function addTransformProperties( node, object, options ) {
633
+
634
+ const animTracks = options.animationTracks.get( object );
635
+ const hasPivot = object.pivot !== null;
636
+
637
+ if ( ! hasPivot && animTracks === undefined ) {
638
+
639
+ const transform = buildMatrix( object.matrix );
640
+ node.addProperty( `matrix4d xformOp:transform = ${transform}` );
641
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
642
+ return;
643
+
644
+ }
645
+
646
+ // Per-op layout: animated channels use timeSamples, others stay static.
647
+ // Pivot ops (when present) are always static.
648
+
649
+ const fps = options.animationFrameRate;
650
+ const p = object.position;
651
+ const q = object.quaternion;
652
+ const s = object.scale;
653
+
654
+ if ( animTracks !== undefined && animTracks.position !== undefined ) {
655
+
656
+ node.addProperty( buildVector3TimeSamples( 'xformOp:translate', 'float3', animTracks.position, fps ) );
657
+
658
+ } else {
659
+
660
+ node.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );
661
+
662
+ }
663
+
664
+ if ( hasPivot ) {
665
+
666
+ const piv = object.pivot;
667
+ node.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );
668
+
669
+ }
670
+
671
+ if ( animTracks !== undefined && animTracks.quaternion !== undefined ) {
672
+
673
+ node.addProperty( buildQuaternionTimeSamples( animTracks.quaternion, fps ) );
674
+
675
+ } else {
676
+
677
+ node.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );
678
+
679
+ }
680
+
681
+ if ( animTracks !== undefined && animTracks.scale !== undefined ) {
682
+
683
+ node.addProperty( buildVector3TimeSamples( 'xformOp:scale', 'float3', animTracks.scale, fps ) );
684
+
685
+ } else {
686
+
687
+ node.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );
688
+
689
+ }
690
+
691
+ if ( hasPivot ) {
692
+
693
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:translate:pivot", "xformOp:orient", "xformOp:scale", "!invert!xformOp:translate:pivot"]' );
694
+
695
+ } else {
696
+
697
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:orient", "xformOp:scale"]' );
698
+
497
699
  }
498
700
 
499
701
  }
500
702
 
501
- function buildXform( object, usedNames ) {
703
+ function buildXform( object, usedNames, options ) {
502
704
 
503
705
  const name = getName( object, usedNames );
504
- const transform = buildMatrix( object.matrix );
505
706
 
506
707
  if ( object.matrix.determinant() < 0 ) {
507
708
 
@@ -513,27 +714,32 @@ function buildXform( object, usedNames ) {
513
714
  }
514
715
 
515
716
  const node = new USDNode( name, 'Xform' );
516
-
517
- node.addProperty( `matrix4d xformOp:transform = ${transform}` );
518
- node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
717
+ addTransformProperties( node, object, options );
519
718
 
520
719
  return node;
521
720
 
522
721
  }
523
722
 
524
- function buildMesh( object, geometry, material, usedNames ) {
723
+ function buildMesh( object, geometry, materials, usedNames, options ) {
525
724
 
526
- const node = buildXform( object, usedNames );
725
+ const node = buildXform( object, usedNames, options );
527
726
 
528
- node.addMetadata(
529
- 'prepend references',
530
- `@./geometries/Geometry_${geometry.id}.usda@</Geometry>`
531
- );
532
- node.addMetadata( 'prepend apiSchemas', '["MaterialBindingAPI"]' );
727
+ if ( materials.length === 1 ) {
533
728
 
534
- node.addProperty(
535
- `rel material:binding = </Materials/Material_${material.id}>`
536
- );
729
+ node.addMetadata(
730
+ 'prepend references',
731
+ `@./geometries/Geometry_${geometry.id}.usda@</Geometry>`
732
+ );
733
+ node.addMetadata( 'prepend apiSchemas', '["MaterialBindingAPI"]' );
734
+ node.addProperty(
735
+ `rel material:binding = </Materials/Material_${materials[ 0 ].id}>`
736
+ );
737
+
738
+ } else {
739
+
740
+ node.addChild( buildMeshNode( geometry, materials ) );
741
+
742
+ }
537
743
 
538
744
  return node;
539
745
 
@@ -571,7 +777,7 @@ function buildMeshObject( geometry ) {
571
777
 
572
778
  }
573
779
 
574
- function buildMeshNode( geometry ) {
780
+ function buildMeshNode( geometry, materials = null ) {
575
781
 
576
782
  const name = 'Geometry';
577
783
  const attributes = geometry.attributes;
@@ -623,6 +829,41 @@ function buildMeshNode( geometry ) {
623
829
 
624
830
  node.addProperty( 'uniform token subdivisionScheme = "none"' );
625
831
 
832
+ if ( materials !== null ) {
833
+
834
+ const groups = geometry.groups;
835
+
836
+ const totalFaces = ( geometry.index !== null
837
+ ? geometry.index.count
838
+ : attributes.position.count ) / 3;
839
+
840
+ for ( let i = 0; i < groups.length; i ++ ) {
841
+
842
+ const group = groups[ i ];
843
+ const material = materials[ group.materialIndex ];
844
+
845
+ if ( material === undefined ) continue;
846
+
847
+ const startFace = Math.floor( group.start / 3 );
848
+ const endFace = Math.min( startFace + Math.floor( group.count / 3 ), totalFaces );
849
+
850
+ const indices = [];
851
+ for ( let j = startFace; j < endFace; j ++ ) indices.push( j );
852
+
853
+ const subsetNode = new USDNode( `subset_${i}`, 'GeomSubset' );
854
+ subsetNode.addMetadata( 'prepend apiSchemas', '["MaterialBindingAPI"]' );
855
+ subsetNode.addProperty( 'uniform token elementType = "face"' );
856
+ subsetNode.addProperty( 'uniform token familyName = "materialBind"' );
857
+ subsetNode.addProperty( `int[] indices = [${indices.join( ', ' )}]` );
858
+ subsetNode.addProperty(
859
+ `rel material:binding = </Materials/Material_${material.id}>`
860
+ );
861
+ node.addChild( subsetNode );
862
+
863
+ }
864
+
865
+ }
866
+
626
867
  return node;
627
868
 
628
869
  }
@@ -820,21 +1061,27 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
820
1061
  'Shader'
821
1062
  );
822
1063
  textureNode.addProperty( 'uniform token info:id = "UsdUVTexture"' );
823
- textureNode.addProperty( `asset inputs:file = @textures/Texture_${id}.png@` );
1064
+ textureNode.addProperty( `asset inputs:file = @textures/Texture_${id}.${getTextureExtension( texture )}@` );
824
1065
  textureNode.addProperty(
825
1066
  `float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>`
826
1067
  );
827
1068
 
828
1069
  if ( color !== undefined ) {
829
1070
 
830
- textureNode.addProperty( `float4 inputs:scale = ${buildColor4( color )}` );
1071
+ const alpha = ( mapType === 'diffuse' ) ? material.opacity : 1;
1072
+ textureNode.addProperty( `float4 inputs:scale = ${buildColor4( color, alpha )}` );
831
1073
 
832
1074
  }
833
1075
 
834
1076
  if ( mapType === 'normal' ) {
835
1077
 
836
- textureNode.addProperty( 'float4 inputs:scale = (2, 2, 2, 1)' );
837
- textureNode.addProperty( 'float4 inputs:bias = (-1, -1, -1, 0)' );
1078
+ // Similar to GLTFExporter, only the x component is used so the y-negation that
1079
+ // GLTFLoader applies to tangent-less glTF assets is not baked into the export.
1080
+
1081
+ const scale = material.normalScale.x;
1082
+
1083
+ textureNode.addProperty( `float4 inputs:scale = (${ 2 * scale }, ${ 2 * scale }, 2, 1)` );
1084
+ textureNode.addProperty( `float4 inputs:bias = (${ - scale }, ${ - scale }, -1, 0)` );
838
1085
 
839
1086
  }
840
1087
 
@@ -914,33 +1161,39 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
914
1161
 
915
1162
  }
916
1163
 
917
- if ( material.emissiveMap !== null ) {
1164
+ if ( material.emissive ) {
918
1165
 
919
- previewSurfaceNode.addProperty(
920
- `color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`
921
- );
1166
+ const emissiveIntensity = material.emissiveIntensity ?? 1;
922
1167
 
923
- const emissiveColor = new Color(
924
- material.emissive.r * material.emissiveIntensity,
925
- material.emissive.g * material.emissiveIntensity,
926
- material.emissive.b * material.emissiveIntensity
927
- );
928
- const textureNodes = buildTextureNodes(
929
- material.emissiveMap,
930
- 'emissive',
931
- emissiveColor
932
- );
933
- textureNodes.forEach( ( node ) => materialNode.addChild( node ) );
1168
+ if ( material.emissiveMap ) {
934
1169
 
935
- } else if ( material.emissive.getHex() > 0 ) {
1170
+ previewSurfaceNode.addProperty(
1171
+ `color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`
1172
+ );
936
1173
 
937
- previewSurfaceNode.addProperty(
938
- `color3f inputs:emissiveColor = ${buildColor( material.emissive )}`
939
- );
1174
+ const emissiveColor = new Color(
1175
+ material.emissive.r * emissiveIntensity,
1176
+ material.emissive.g * emissiveIntensity,
1177
+ material.emissive.b * emissiveIntensity
1178
+ );
1179
+ const textureNodes = buildTextureNodes(
1180
+ material.emissiveMap,
1181
+ 'emissive',
1182
+ emissiveColor
1183
+ );
1184
+ textureNodes.forEach( ( node ) => materialNode.addChild( node ) );
1185
+
1186
+ } else if ( material.emissive.getHex() > 0 ) {
1187
+
1188
+ previewSurfaceNode.addProperty(
1189
+ `color3f inputs:emissiveColor = ${buildColor( material.emissive )}`
1190
+ );
1191
+
1192
+ }
940
1193
 
941
1194
  }
942
1195
 
943
- if ( material.normalMap !== null ) {
1196
+ if ( material.normalMap ) {
944
1197
 
945
1198
  previewSurfaceNode.addProperty(
946
1199
  `normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`
@@ -951,16 +1204,17 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
951
1204
 
952
1205
  }
953
1206
 
954
- if ( material.aoMap !== null ) {
1207
+ if ( material.aoMap ) {
955
1208
 
956
1209
  previewSurfaceNode.addProperty(
957
1210
  `float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`
958
1211
  );
959
1212
 
1213
+ const aoMapIntensity = material.aoMapIntensity ?? 1;
960
1214
  const aoColor = new Color(
961
- material.aoMapIntensity,
962
- material.aoMapIntensity,
963
- material.aoMapIntensity
1215
+ aoMapIntensity,
1216
+ aoMapIntensity,
1217
+ aoMapIntensity
964
1218
  );
965
1219
  const textureNodes = buildTextureNodes(
966
1220
  material.aoMap,
@@ -971,7 +1225,7 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
971
1225
 
972
1226
  }
973
1227
 
974
- if ( material.roughnessMap !== null ) {
1228
+ if ( material.roughnessMap ) {
975
1229
 
976
1230
  previewSurfaceNode.addProperty(
977
1231
  `float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`
@@ -992,12 +1246,12 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
992
1246
  } else {
993
1247
 
994
1248
  previewSurfaceNode.addProperty(
995
- `float inputs:roughness = ${material.roughness}`
1249
+ `float inputs:roughness = ${material.roughness ?? 1}`
996
1250
  );
997
1251
 
998
1252
  }
999
1253
 
1000
- if ( material.metalnessMap !== null ) {
1254
+ if ( material.metalnessMap ) {
1001
1255
 
1002
1256
  previewSurfaceNode.addProperty(
1003
1257
  `float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`
@@ -1018,12 +1272,12 @@ function buildMaterial( material, textures, quickLookCompatible = false ) {
1018
1272
  } else {
1019
1273
 
1020
1274
  previewSurfaceNode.addProperty(
1021
- `float inputs:metallic = ${material.metalness}`
1275
+ `float inputs:metallic = ${material.metalness ?? 0}`
1022
1276
  );
1023
1277
 
1024
1278
  }
1025
1279
 
1026
- if ( material.alphaMap !== null ) {
1280
+ if ( material.alphaMap ) {
1027
1281
 
1028
1282
  previewSurfaceNode.addProperty(
1029
1283
  `float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>`
@@ -1118,9 +1372,9 @@ function buildColor( color ) {
1118
1372
 
1119
1373
  }
1120
1374
 
1121
- function buildColor4( color ) {
1375
+ function buildColor4( color, alpha = 1 ) {
1122
1376
 
1123
- return `(${color.r}, ${color.g}, ${color.b}, 1.0)`;
1377
+ return `(${color.r}, ${color.g}, ${color.b}, ${alpha})`;
1124
1378
 
1125
1379
  }
1126
1380
 
@@ -1130,12 +1384,10 @@ function buildVector2( vector ) {
1130
1384
 
1131
1385
  }
1132
1386
 
1133
- function buildCamera( camera, usedNames ) {
1387
+ function buildCamera( camera, usedNames, options ) {
1134
1388
 
1135
1389
  const name = getName( camera, usedNames );
1136
1390
 
1137
- const transform = buildMatrix( camera.matrix );
1138
-
1139
1391
  if ( camera.matrix.determinant() < 0 ) {
1140
1392
 
1141
1393
  console.warn(
@@ -1146,8 +1398,7 @@ function buildCamera( camera, usedNames ) {
1146
1398
  }
1147
1399
 
1148
1400
  const node = new USDNode( name, 'Camera' );
1149
- node.addProperty( `matrix4d xformOp:transform = ${transform}` );
1150
- node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
1401
+ addTransformProperties( node, camera, options );
1151
1402
 
1152
1403
  const projection = camera.isOrthographicCamera
1153
1404
  ? 'orthographic'
@@ -1216,6 +1467,9 @@ function buildCamera( camera, usedNames ) {
1216
1467
  * can be configured via `ar.anchoring.type` and `ar.planeAnchoring.alignment`.
1217
1468
  * @property {boolean} [quickLookCompatible=false] - Whether to make the exported USDZ compatible to QuickLook
1218
1469
  * which means the asset is modified to accommodate the bugs FB10036297 and FB11442287 (Apple Feedback).
1470
+ * @property {Array<AnimationClip>} [animations=[]] - Animation clips to bake into `xformOp` time samples on the
1471
+ * targeted objects. Only `position`, `quaternion`, and `scale` tracks are exported.
1472
+ * @property {number} [animationFrameRate=60] - Time codes per second used when writing animation samples.
1219
1473
  **/
1220
1474
 
1221
1475
  /**