super-three 0.179.0 → 0.184.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 (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -44,7 +44,7 @@ import {
44
44
  VectorKeyframeTrack
45
45
  } from 'three';
46
46
 
47
- import * as fflate from '../libs/fflate.module.js';
47
+ import { unzlibSync } from '../libs/fflate.module.js';
48
48
  import { NURBSCurve } from '../curves/NURBSCurve.js';
49
49
 
50
50
  let fbxTree;
@@ -61,10 +61,10 @@ let sceneGraph;
61
61
  * - Morph normals / blend shape normals
62
62
  *
63
63
  * FBX format references:
64
- * - [C++ SDK reference]{@link https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html}
64
+ * - [C++ SDK reference](https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html)
65
65
  *
66
66
  * Binary format specification:
67
- * - [FBX binary file format specification]{@link https://code.blender.org/2013/08/fbx-binary-file-format-specification/}
67
+ * - [FBX binary file format specification](https://code.blender.org/2013/08/fbx-binary-file-format-specification/)
68
68
  *
69
69
  * ```js
70
70
  * const loader = new FBXLoader();
@@ -601,7 +601,8 @@ class FBXTreeParser {
601
601
 
602
602
  }
603
603
 
604
- // the transparency handling is implemented based on Blender/Unity's approach: https://github.com/sobotka/blender-addons/blob/7d80f2f97161fc8e353a657b179b9aa1f8e5280b/io_scene_fbx/import_fbx.py#L1444-L1459
604
+ // the transparency handling is implemented based on Blender's approach:
605
+ // https://github.com/blender/blender/blob/main/scripts/addons_core/io_scene_fbx/import_fbx.py
605
606
 
606
607
  parameters.opacity = 1 - ( materialNode.TransparencyFactor ? parseFloat( materialNode.TransparencyFactor.value ) : 0 );
607
608
 
@@ -611,7 +612,10 @@ class FBXTreeParser {
611
612
 
612
613
  if ( parameters.opacity === null ) {
613
614
 
614
- parameters.opacity = 1 - ( materialNode.TransparentColor ? parseFloat( materialNode.TransparentColor.value[ 0 ] ) : 0 );
615
+ // Default to opaque. Some exporters (e.g. 3ds Max) define TransparentColor
616
+ // as white (1,1,1) without intending transparency, which makes the Unity-style
617
+ // fallback of `1 - TransparentColor.r` produce incorrect zero opacity.
618
+ parameters.opacity = 1;
615
619
 
616
620
  }
617
621
 
@@ -824,8 +828,6 @@ class FBXTreeParser {
824
828
  indices: [],
825
829
  weights: [],
826
830
  transformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),
827
- // transform: new Matrix4().fromArray( boneNode.Transform.a ),
828
- // linkMode: boneNode.Mode,
829
831
 
830
832
  };
831
833
 
@@ -918,8 +920,6 @@ class FBXTreeParser {
918
920
 
919
921
  } );
920
922
 
921
- this.bindSkeleton( deformers.skeletons, geometryMap, modelMap );
922
-
923
923
  this.addGlobalSceneSettings();
924
924
 
925
925
  sceneGraph.traverse( function ( node ) {
@@ -942,6 +942,64 @@ class FBXTreeParser {
942
942
 
943
943
  } );
944
944
 
945
+ // Like Blender's FBX importer, use the BindPose section to set the
946
+ // rest pose for bones that are not part of a skin cluster. The BindPose
947
+ // provides a more authoritative rest pose than the Lcl properties which
948
+ // may represent an animation frame rather than the true rest state.
949
+ // Bones WITH clusters will get their bind pose from TransformLink
950
+ // (set via bindSkeleton below), which takes priority.
951
+ const bindPoseMatrices = this.parsePoseNodes();
952
+ const clusterBoneIDs = new Set();
953
+
954
+ for ( const ID in deformers.skeletons ) {
955
+
956
+ deformers.skeletons[ ID ].rawBones.forEach( function ( _, i ) {
957
+
958
+ const bone = deformers.skeletons[ ID ].bones[ i ];
959
+ if ( bone ) clusterBoneIDs.add( bone.ID );
960
+
961
+ } );
962
+
963
+ }
964
+
965
+ const tempMatrix = new Matrix4();
966
+
967
+ sceneGraph.traverse( function ( node ) {
968
+
969
+ if ( node.isBone && node.ID !== undefined && ! clusterBoneIDs.has( node.ID ) ) {
970
+
971
+ const bindPose = bindPoseMatrices[ node.ID ];
972
+
973
+ if ( bindPose !== undefined ) {
974
+
975
+ if ( node.parent ) {
976
+
977
+ tempMatrix.copy( node.parent.matrixWorld ).invert();
978
+ tempMatrix.multiply( bindPose );
979
+
980
+ } else {
981
+
982
+ tempMatrix.copy( bindPose );
983
+
984
+ }
985
+
986
+ tempMatrix.decompose( node.position, node.quaternion, node.scale );
987
+ node.updateMatrix();
988
+ node.matrixWorld.copy( bindPose );
989
+
990
+ }
991
+
992
+ }
993
+
994
+ } );
995
+
996
+ // Bind skeletons after transforms are applied so that bind matrices
997
+ // are computed from the final scene state. This ensures the rest pose
998
+ // is correct even when the FBX file's Cluster TransformLink matrices
999
+ // differ from the reconstructed bone transforms (common in files
1000
+ // without a BindPose section).
1001
+ this.bindSkeleton( deformers.skeletons, geometryMap, modelMap );
1002
+
945
1003
  const animations = new AnimationParser().parse();
946
1004
 
947
1005
  // if all the models where already combined in a single group, just return that
@@ -954,6 +1012,24 @@ class FBXTreeParser {
954
1012
 
955
1013
  sceneGraph.animations = animations;
956
1014
 
1015
+ // Apply coordinate system correction. FBX files can use different
1016
+ // up-axis conventions (Y-up or Z-up). Three.js uses Y-up, so rotate
1017
+ // the scene when the file uses Z-up (UpAxis === 2).
1018
+
1019
+ if ( 'GlobalSettings' in fbxTree && 'UpAxis' in fbxTree.GlobalSettings ) {
1020
+
1021
+ const upAxis = fbxTree.GlobalSettings.UpAxis.value;
1022
+
1023
+ if ( upAxis === 2 ) {
1024
+
1025
+ console.warn( 'THREE.FBXLoader: You are loading an asset with a Z-UP coordinate system. The loader just rotates the asset to transform it into Y-UP. The vertex data are not converted.' );
1026
+
1027
+ sceneGraph.rotation.set( - Math.PI / 2, 0, 0 );
1028
+
1029
+ }
1030
+
1031
+ }
1032
+
957
1033
  }
958
1034
 
959
1035
  // parse nodes in FBXTree.Objects.Model
@@ -1236,21 +1312,24 @@ class FBXTreeParser {
1236
1312
 
1237
1313
  case 2: // Spot
1238
1314
  let angle = Math.PI / 3;
1315
+ let penumbra = 0;
1239
1316
 
1240
- if ( lightAttribute.InnerAngle !== undefined ) {
1317
+ if ( lightAttribute.OuterAngle !== undefined ) {
1241
1318
 
1242
- angle = MathUtils.degToRad( lightAttribute.InnerAngle.value );
1319
+ angle = MathUtils.degToRad( lightAttribute.OuterAngle.value );
1243
1320
 
1244
- }
1321
+ if ( lightAttribute.InnerAngle !== undefined ) {
1245
1322
 
1246
- let penumbra = 0;
1247
- if ( lightAttribute.OuterAngle !== undefined ) {
1323
+ penumbra = 1 - ( lightAttribute.InnerAngle.value / lightAttribute.OuterAngle.value );
1324
+ penumbra = Math.max( 0, penumbra ); // penumbra must be in the range [0,1]
1325
+
1326
+ }
1327
+
1328
+ } else if ( lightAttribute.InnerAngle !== undefined ) {
1248
1329
 
1249
- // TODO: this is not correct - FBX calculates outer and inner angle in degrees
1250
- // with OuterAngle > InnerAngle && OuterAngle <= Math.PI
1251
- // while three.js uses a penumbra between (0, 1) to attenuate the inner angle
1252
- penumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );
1253
- penumbra = Math.max( penumbra, 1 );
1330
+ // fallback if only InnerAngle is defined
1331
+
1332
+ angle = MathUtils.degToRad( lightAttribute.InnerAngle.value );
1254
1333
 
1255
1334
  }
1256
1335
 
@@ -1460,12 +1539,30 @@ class FBXTreeParser {
1460
1539
 
1461
1540
  bindSkeleton( skeletons, geometryMap, modelMap ) {
1462
1541
 
1463
- const bindMatrices = this.parsePoseNodes();
1464
-
1465
1542
  for ( const ID in skeletons ) {
1466
1543
 
1467
1544
  const skeleton = skeletons[ ID ];
1468
1545
 
1546
+ // Compute bone inverses from TransformLink rather than from the
1547
+ // bones' current matrixWorld. The TransformLink matrices represent
1548
+ // each bone's global transform at the time the skin weights were
1549
+ // painted, which may differ from the scene-reconstructed transforms.
1550
+ const boneInverses = [];
1551
+
1552
+ for ( let i = 0, l = skeleton.bones.length; i < l; i ++ ) {
1553
+
1554
+ const inverse = new Matrix4();
1555
+
1556
+ if ( skeleton.bones[ i ] && skeleton.rawBones[ i ] ) {
1557
+
1558
+ inverse.copy( skeleton.rawBones[ i ].transformLink ).invert();
1559
+
1560
+ }
1561
+
1562
+ boneInverses.push( inverse );
1563
+
1564
+ }
1565
+
1469
1566
  const parents = connections.get( parseInt( skeleton.ID ) ).parents;
1470
1567
 
1471
1568
  parents.forEach( function ( parent ) {
@@ -1481,7 +1578,16 @@ class FBXTreeParser {
1481
1578
 
1482
1579
  const model = modelMap.get( geoConnParent.ID );
1483
1580
 
1484
- model.bind( new Skeleton( skeleton.bones ), bindMatrices[ geoConnParent.ID ] );
1581
+ // Use the mesh's current matrixWorld as bind matrix.
1582
+ // The BindPose section is intentionally not used here
1583
+ // since it may contain scale/rotation from the model
1584
+ // hierarchy that is inconsistent with the TransformLink-
1585
+ // based bone inverses. Always provide a bind matrix to
1586
+ // prevent bind() from calling calculateInverses() which
1587
+ // would overwrite the bone inverses computed above.
1588
+ model.updateMatrixWorld( true );
1589
+
1590
+ model.bind( new Skeleton( skeleton.bones, boneInverses ), model.matrixWorld );
1485
1591
 
1486
1592
  }
1487
1593
 
@@ -1495,6 +1601,7 @@ class FBXTreeParser {
1495
1601
 
1496
1602
  }
1497
1603
 
1604
+ // Parse BindPose nodes and return a map of node ID to bind matrix.
1498
1605
  parsePoseNodes() {
1499
1606
 
1500
1607
  const bindMatrices = {};
@@ -1615,11 +1722,9 @@ class GeometryParser {
1615
1722
 
1616
1723
  case 'Mesh':
1617
1724
  return this.parseMeshGeometry( relationships, geoNode, deformers );
1618
- break;
1619
1725
 
1620
1726
  case 'NurbsCurve':
1621
1727
  return this.parseNurbsGeometry( geoNode );
1622
- break;
1623
1728
 
1624
1729
  }
1625
1730
 
@@ -2259,6 +2364,13 @@ class GeometryParser {
2259
2364
  parentGeo.morphAttributes.position = [];
2260
2365
  // parentGeo.morphAttributes.normal = []; // not implemented
2261
2366
 
2367
+ // Morph attribute positions are stored as deltas (morphTargetsRelative = true), so the
2368
+ // translation component of the geometric transform must not be applied to them — only the
2369
+ // rotation/scale part. Otherwise every delta gets the geometric translation added, which
2370
+ // shifts morphed vertices away from their intended position by `weight * translation` as
2371
+ // the influence increases.
2372
+ const morphPreTransform = preTransform.clone().setPosition( 0, 0, 0 );
2373
+
2262
2374
  const scope = this;
2263
2375
  morphTargets.forEach( function ( morphTarget ) {
2264
2376
 
@@ -2268,7 +2380,7 @@ class GeometryParser {
2268
2380
 
2269
2381
  if ( morphGeoNode !== undefined ) {
2270
2382
 
2271
- scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );
2383
+ scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, morphPreTransform, rawTarget.name );
2272
2384
 
2273
2385
  }
2274
2386
 
@@ -2663,11 +2775,15 @@ class AnimationParser {
2663
2775
 
2664
2776
  if ( layerCurveNodes[ i ] === undefined ) {
2665
2777
 
2666
- const modelID = connections.get( child.ID ).parents.filter( function ( parent ) {
2778
+ const filteredParents = connections.get( child.ID ).parents.filter( function ( parent ) {
2667
2779
 
2668
2780
  return parent.relationship !== undefined;
2669
2781
 
2670
- } )[ 0 ].ID;
2782
+ } );
2783
+
2784
+ if ( filteredParents.length === 0 ) return;
2785
+
2786
+ const modelID = filteredParents[ 0 ].ID;
2671
2787
 
2672
2788
  if ( modelID !== undefined ) {
2673
2789
 
@@ -2696,7 +2812,13 @@ class AnimationParser {
2696
2812
 
2697
2813
  node.transform = child.matrix;
2698
2814
 
2699
- if ( child.userData.transformData ) node.eulerOrder = child.userData.transformData.eulerOrder;
2815
+ if ( child.userData.transformData ) {
2816
+
2817
+ node.eulerOrder = child.userData.transformData.eulerOrder;
2818
+
2819
+ if ( child.userData.transformData.rotation ) node.initialRotation = child.userData.transformData.rotation;
2820
+
2821
+ }
2700
2822
 
2701
2823
  }
2702
2824
 
@@ -2721,11 +2843,15 @@ class AnimationParser {
2721
2843
 
2722
2844
  if ( layerCurveNodes[ i ] === undefined ) {
2723
2845
 
2724
- const deformerID = connections.get( child.ID ).parents.filter( function ( parent ) {
2846
+ const filteredParents = connections.get( child.ID ).parents.filter( function ( parent ) {
2725
2847
 
2726
2848
  return parent.relationship !== undefined;
2727
2849
 
2728
- } )[ 0 ].ID;
2850
+ } );
2851
+
2852
+ if ( filteredParents.length === 0 ) return;
2853
+
2854
+ const deformerID = filteredParents[ 0 ].ID;
2729
2855
 
2730
2856
  const morpherID = connections.get( deformerID ).parents[ 0 ].ID;
2731
2857
  const geoID = connections.get( morpherID ).parents[ 0 ].ID;
@@ -2836,7 +2962,7 @@ class AnimationParser {
2836
2962
 
2837
2963
  if ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {
2838
2964
 
2839
- const rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );
2965
+ const rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder, rawTracks.initialRotation );
2840
2966
  if ( rotationTrack !== undefined ) tracks.push( rotationTrack );
2841
2967
 
2842
2968
  }
@@ -2868,17 +2994,33 @@ class AnimationParser {
2868
2994
 
2869
2995
  }
2870
2996
 
2871
- generateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder ) {
2997
+ generateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder, initialRotation ) {
2872
2998
 
2873
2999
  let times;
2874
3000
  let values;
2875
3001
 
2876
- if ( curves.x !== undefined && curves.y !== undefined && curves.z !== undefined ) {
3002
+ if ( curves.x !== undefined || curves.y !== undefined || curves.z !== undefined ) {
3003
+
3004
+ // Get merged, sorted, unique times from all available curves
3005
+ const mergedTimes = this.getTimesForAllAxes( curves );
3006
+
3007
+ if ( mergedTimes.length > 0 ) {
2877
3008
 
2878
- const result = this.interpolateRotations( curves.x, curves.y, curves.z, eulerOrder );
3009
+ const initialRot = initialRotation || [ 0, 0, 0 ];
2879
3010
 
2880
- times = result[ 0 ];
2881
- values = result[ 1 ];
3011
+ // Synchronize all curves to the merged time array.
3012
+ // Missing axes are filled with constant values from the initial rotation (Lcl Rotation).
3013
+ // Existing curves at different times are linearly interpolated.
3014
+ const syncX = this.synchronizeCurve( curves.x, mergedTimes, initialRot[ 0 ] );
3015
+ const syncY = this.synchronizeCurve( curves.y, mergedTimes, initialRot[ 1 ] );
3016
+ const syncZ = this.synchronizeCurve( curves.z, mergedTimes, initialRot[ 2 ] );
3017
+
3018
+ const result = this.interpolateRotations( syncX, syncY, syncZ, eulerOrder );
3019
+
3020
+ times = result[ 0 ];
3021
+ values = result[ 1 ];
3022
+
3023
+ }
2882
3024
 
2883
3025
  }
2884
3026
 
@@ -2910,7 +3052,7 @@ class AnimationParser {
2910
3052
 
2911
3053
  const quaternionValues = [];
2912
3054
 
2913
- if ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [ 0 ], [ 0 ] );
3055
+ if ( ! values || ! times ) return undefined;
2914
3056
 
2915
3057
  for ( let i = 0; i < values.length; i += 3 ) {
2916
3058
 
@@ -3063,6 +3205,62 @@ class AnimationParser {
3063
3205
 
3064
3206
  }
3065
3207
 
3208
+ // Synchronize a curve to a target time array using linear interpolation.
3209
+ // If the curve is undefined (axis not animated), returns constant values from initialValue.
3210
+ synchronizeCurve( curve, targetTimes, initialValue ) {
3211
+
3212
+ if ( curve === undefined ) {
3213
+
3214
+ return { times: targetTimes, values: targetTimes.map( () => initialValue ) };
3215
+
3216
+ }
3217
+
3218
+ // If the curve already has the same number of keyframes as the target, assume times match
3219
+ if ( curve.times.length === targetTimes.length ) return curve;
3220
+
3221
+ // Linearly interpolate curve values at each target time
3222
+ const values = [];
3223
+
3224
+ for ( let i = 0; i < targetTimes.length; i ++ ) {
3225
+
3226
+ values.push( this.sampleCurveValue( curve, targetTimes[ i ], initialValue ) );
3227
+
3228
+ }
3229
+
3230
+ return { times: targetTimes, values: values };
3231
+
3232
+ }
3233
+
3234
+ // Sample a single value from a curve at a given time using linear interpolation
3235
+ sampleCurveValue( curve, time, initialValue ) {
3236
+
3237
+ const times = curve.times;
3238
+ const values = curve.values;
3239
+
3240
+ // Before first keyframe
3241
+ if ( time <= times[ 0 ] ) return values[ 0 ];
3242
+
3243
+ // After last keyframe
3244
+ if ( time >= times[ times.length - 1 ] ) return values[ values.length - 1 ];
3245
+
3246
+ // Find surrounding keyframes and linearly interpolate
3247
+ for ( let i = 0; i < times.length - 1; i ++ ) {
3248
+
3249
+ if ( time >= times[ i ] && time <= times[ i + 1 ] ) {
3250
+
3251
+ if ( times[ i ] === time ) return values[ i ];
3252
+
3253
+ const alpha = ( time - times[ i ] ) / ( times[ i + 1 ] - times[ i ] );
3254
+ return values[ i ] * ( 1 - alpha ) + values[ i + 1 ] * alpha;
3255
+
3256
+ }
3257
+
3258
+ }
3259
+
3260
+ return initialValue;
3261
+
3262
+ }
3263
+
3066
3264
  // Rotations are defined as Euler angles which can have values of any size
3067
3265
  // These will be converted to quaternions which don't support values greater than
3068
3266
  // PI, so we'll interpolate large rotations
@@ -3132,7 +3330,7 @@ class AnimationParser {
3132
3330
  const Q2 = new Quaternion().setFromEuler( E2 );
3133
3331
 
3134
3332
  // Check unroll
3135
- if ( Q1.dot( Q2 ) ) {
3333
+ if ( Q1.dot( Q2 ) < 0 ) {
3136
3334
 
3137
3335
  Q2.set( - Q2.x, - Q2.y, - Q2.z, - Q2.w );
3138
3336
 
@@ -3799,7 +3997,7 @@ class BinaryParser {
3799
3997
 
3800
3998
  }
3801
3999
 
3802
- const data = fflate.unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );
4000
+ const data = unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );
3803
4001
  const reader2 = new BinaryReader( data.buffer );
3804
4002
 
3805
4003
  switch ( type ) {
@@ -7,7 +7,7 @@ import {
7
7
  /**
8
8
  * A loader for loading fonts.
9
9
  *
10
- * You can convert fonts online using [facetype.js]{@link https://gero3.github.io/facetype.js/}.
10
+ * You can convert fonts online using [facetype.js](https://gero3.github.io/facetype.js/).
11
11
  *
12
12
  * ```js
13
13
  * const loader = new FontLoader();
@@ -109,12 +109,13 @@ class Font {
109
109
  *
110
110
  * @param {string} text - The text.
111
111
  * @param {number} [size=100] - The text size.
112
+ * @param {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).
112
113
  * @return {Array<Shape>} An array of shapes representing the text.
113
114
  */
114
- generateShapes( text, size = 100 ) {
115
+ generateShapes( text, size = 100, direction = 'ltr' ) {
115
116
 
116
117
  const shapes = [];
117
- const paths = createPaths( text, size, this.data );
118
+ const paths = createPaths( text, size, this.data, direction );
118
119
 
119
120
  for ( let p = 0, pl = paths.length; p < pl; p ++ ) {
120
121
 
@@ -128,7 +129,7 @@ class Font {
128
129
 
129
130
  }
130
131
 
131
- function createPaths( text, size, data ) {
132
+ function createPaths( text, size, data, direction ) {
132
133
 
133
134
  const chars = Array.from( text );
134
135
  const scale = size / data.resolution;
@@ -138,6 +139,12 @@ function createPaths( text, size, data ) {
138
139
 
139
140
  let offsetX = 0, offsetY = 0;
140
141
 
142
+ if ( direction == 'rtl' || direction == 'tb' ) {
143
+
144
+ chars.reverse();
145
+
146
+ }
147
+
141
148
  for ( let i = 0; i < chars.length; i ++ ) {
142
149
 
143
150
  const char = chars[ i ];
@@ -150,7 +157,18 @@ function createPaths( text, size, data ) {
150
157
  } else {
151
158
 
152
159
  const ret = createPath( char, scale, offsetX, offsetY, data );
153
- offsetX += ret.offsetX;
160
+
161
+ if ( direction == 'tb' ) {
162
+
163
+ offsetX = 0;
164
+ offsetY += data.ascender * scale;
165
+
166
+ } else {
167
+
168
+ offsetX += ret.offsetX;
169
+
170
+ }
171
+
154
172
  paths.push( ret.path );
155
173
 
156
174
  }
@@ -94,7 +94,7 @@ class GCodeLoader extends Loader {
94
94
  */
95
95
  parse( data ) {
96
96
 
97
- let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false };
97
+ let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false, extrusionOverride: false, extrusionRelative: false };
98
98
  const layers = [];
99
99
 
100
100
  let currentLayer = undefined;
@@ -147,6 +147,14 @@ class GCodeLoader extends Loader {
147
147
 
148
148
  }
149
149
 
150
+ function absoluteExtrusion( v1, v2 ) {
151
+
152
+ const relative = state.extrusionOverride ? state.extrusionRelative : state.relative;
153
+
154
+ return relative ? v1 + v2 : v2;
155
+
156
+ }
157
+
150
158
  const lines = data.replace( /;.+/g, '' ).split( '\n' );
151
159
 
152
160
  for ( let i = 0; i < lines.length; i ++ ) {
@@ -172,13 +180,13 @@ class GCodeLoader extends Loader {
172
180
  //G0/G1 – Linear Movement
173
181
  if ( cmd === 'G0' || cmd === 'G1' ) {
174
182
 
175
- const line = {
176
- x: args.x !== undefined ? absolute( state.x, args.x ) : state.x,
177
- y: args.y !== undefined ? absolute( state.y, args.y ) : state.y,
178
- z: args.z !== undefined ? absolute( state.z, args.z ) : state.z,
179
- e: args.e !== undefined ? absolute( state.e, args.e ) : state.e,
180
- f: args.f !== undefined ? absolute( state.f, args.f ) : state.f,
181
- };
183
+ const line = Object.assign( {}, state ); // clone state
184
+
185
+ if ( args.x !== undefined ) line.x = absolute( state.x, args.x );
186
+ if ( args.y !== undefined ) line.y = absolute( state.y, args.y );
187
+ if ( args.z !== undefined ) line.z = absolute( state.z, args.z );
188
+ if ( args.e !== undefined ) line.e = absoluteExtrusion( state.e, args.e );
189
+ if ( args.f !== undefined ) line.f = absolute( state.f, args.f );
182
190
 
183
191
  //Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position
184
192
  if ( delta( state.e, line.e ) > 0 ) {
@@ -206,11 +214,29 @@ class GCodeLoader extends Loader {
206
214
  //G90: Set to Absolute Positioning
207
215
  state.relative = false;
208
216
 
217
+ // reset M82/M83 extrusion override
218
+ state.extrusionOverride = false;
219
+
209
220
  } else if ( cmd === 'G91' ) {
210
221
 
211
222
  //G91: Set to state.relative Positioning
212
223
  state.relative = true;
213
224
 
225
+ // reset M82/M83 extrusion override
226
+ state.extrusionOverride = false;
227
+
228
+ } else if ( cmd === 'M82' ) {
229
+
230
+ //M82: Override G91 and put the E axis into absolute mode independent of the other axes
231
+ state.extrusionOverride = true;
232
+ state.extrusionRelative = false;
233
+
234
+ } else if ( cmd === 'M83' ) {
235
+
236
+ //M83: Overrides G90 and put the E axis into relative mode independent of the other axes
237
+ state.extrusionOverride = true;
238
+ state.extrusionRelative = true;
239
+
214
240
  } else if ( cmd === 'G92' ) {
215
241
 
216
242
  //G92: Set Position