three-stdlib 2.16.0 → 2.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1219) hide show
  1. package/BufferGeometryUtils-1a7a235c.js +655 -0
  2. package/BufferGeometryUtils-971dfde3.js +1 -0
  3. package/Nodes-4f766d71.js +471 -0
  4. package/Nodes-9aa16d74.js +1 -0
  5. package/animation/AnimationClipCreator.cjs.js +1 -0
  6. package/animation/AnimationClipCreator.js +52 -32
  7. package/animation/CCDIKSolver.cjs.js +1 -0
  8. package/animation/CCDIKSolver.js +143 -64
  9. package/animation/MMDAnimationHelper.cjs.js +1 -0
  10. package/animation/MMDAnimationHelper.js +341 -150
  11. package/animation/MMDPhysics.cjs.js +1 -0
  12. package/animation/MMDPhysics.js +361 -154
  13. package/cameras/CinematicCamera.cjs.js +1 -0
  14. package/cameras/CinematicCamera.js +77 -67
  15. package/controls/ArcballControls.cjs.js +1 -0
  16. package/controls/ArcballControls.js +1449 -544
  17. package/controls/DeviceOrientationControls.cjs.js +1 -0
  18. package/controls/DeviceOrientationControls.js +97 -52
  19. package/controls/DragControls.cjs.js +1 -0
  20. package/controls/DragControls.js +187 -85
  21. package/controls/FirstPersonControls.cjs.js +1 -0
  22. package/controls/FirstPersonControls.js +193 -123
  23. package/controls/FlyControls.cjs.js +1 -0
  24. package/controls/FlyControls.d.ts +5 -4
  25. package/controls/FlyControls.js +160 -90
  26. package/controls/OrbitControls.cjs.js +1 -0
  27. package/controls/OrbitControls.js +481 -232
  28. package/controls/PointerLockControls.cjs.js +1 -0
  29. package/controls/PointerLockControls.js +99 -63
  30. package/controls/TrackballControls.cjs.js +1 -0
  31. package/controls/TrackballControls.js +383 -211
  32. package/controls/TransformControls.cjs.js +1 -0
  33. package/controls/TransformControls.js +782 -575
  34. package/controls/experimental/CameraControls.cjs.js +1 -0
  35. package/controls/experimental/CameraControls.js +609 -329
  36. package/csm/CSM.cjs.js +1 -0
  37. package/csm/CSM.js +108 -47
  38. package/csm/CSMFrustum.cjs.js +1 -0
  39. package/csm/CSMFrustum.js +29 -14
  40. package/csm/CSMHelper.cjs.js +1 -0
  41. package/csm/CSMHelper.js +34 -20
  42. package/csm/CSMShader.cjs.js +1 -0
  43. package/csm/CSMShader.js +11 -7
  44. package/curves/CurveExtras.cjs.js +1 -0
  45. package/curves/CurveExtras.js +115 -73
  46. package/curves/NURBSCurve.cjs.js +1 -0
  47. package/curves/NURBSCurve.js +43 -15
  48. package/curves/NURBSSurface.cjs.js +1 -0
  49. package/curves/NURBSSurface.js +27 -11
  50. package/curves/NURBSUtils.cjs.js +1 -0
  51. package/curves/NURBSUtils.js +203 -54
  52. package/custom.d.cjs.js +1 -0
  53. package/{shaders/types.mjs → custom.d.js} +0 -0
  54. package/deprecated/Geometry.cjs.js +1 -0
  55. package/deprecated/Geometry.js +486 -191
  56. package/effects/AnaglyphEffect.cjs.js +1 -0
  57. package/effects/AnaglyphEffect.js +60 -95
  58. package/effects/AsciiEffect.cjs.js +1 -0
  59. package/effects/AsciiEffect.js +110 -80
  60. package/effects/OutlineEffect.cjs.js +1 -0
  61. package/effects/OutlineEffect.js +204 -121
  62. package/effects/ParallaxBarrierEffect.cjs.js +1 -0
  63. package/effects/ParallaxBarrierEffect.js +38 -39
  64. package/effects/PeppersGhostEffect.cjs.js +1 -0
  65. package/effects/PeppersGhostEffect.js +68 -19
  66. package/effects/StereoEffect.cjs.js +1 -0
  67. package/effects/StereoEffect.js +16 -12
  68. package/environments/RoomEnvironment.cjs.js +1 -0
  69. package/environments/RoomEnvironment.js +47 -52
  70. package/exporters/ColladaExporter.cjs.js +1 -0
  71. package/exporters/ColladaExporter.js +241 -115
  72. package/exporters/DRACOExporter.cjs.js +1 -0
  73. package/exporters/DRACOExporter.js +121 -67
  74. package/exporters/GLTFExporter.cjs.js +1 -0
  75. package/exporters/GLTFExporter.js +1014 -463
  76. package/exporters/MMDExporter.cjs.js +1 -0
  77. package/exporters/MMDExporter.js +102 -44
  78. package/exporters/OBJExporter.cjs.js +1 -0
  79. package/exporters/OBJExporter.js +140 -78
  80. package/exporters/PLYExporter.cjs.js +1 -0
  81. package/exporters/PLYExporter.js +154 -93
  82. package/exporters/STLExporter.cjs.js +1 -0
  83. package/exporters/STLExporter.js +81 -30
  84. package/exporters/USDZExporter.cjs.js +1 -0
  85. package/exporters/USDZExporter.js +144 -84
  86. package/geometries/BoxLineGeometry.cjs.js +1 -0
  87. package/geometries/BoxLineGeometry.js +14 -7
  88. package/geometries/ConvexGeometry.cjs.js +1 -0
  89. package/geometries/ConvexGeometry.js +23 -14
  90. package/geometries/DecalGeometry.cjs.js +1 -0
  91. package/geometries/DecalGeometry.js +162 -108
  92. package/geometries/LightningStrike.cjs.js +1 -0
  93. package/geometries/LightningStrike.js +294 -101
  94. package/geometries/ParametricGeometries.cjs.js +1 -0
  95. package/geometries/ParametricGeometries.js +76 -26
  96. package/geometries/ParametricGeometry.cjs.js +1 -0
  97. package/geometries/ParametricGeometry.js +48 -24
  98. package/geometries/RoundedBoxGeometry.cjs.js +1 -0
  99. package/geometries/RoundedBoxGeometry.js +64 -33
  100. package/geometries/TeapotGeometry.cjs.js +1 -0
  101. package/geometries/TeapotGeometry.js +174 -1434
  102. package/geometries/TextGeometry.cjs.js +1 -0
  103. package/geometries/TextGeometry.js +17 -9
  104. package/helpers/LightProbeHelper.cjs.js +1 -0
  105. package/helpers/LightProbeHelper.js +21 -53
  106. package/helpers/PositionalAudioHelper.cjs.js +1 -0
  107. package/helpers/PositionalAudioHelper.js +30 -23
  108. package/helpers/RectAreaLightHelper.cjs.js +1 -0
  109. package/helpers/RectAreaLightHelper.js +33 -17
  110. package/helpers/VertexNormalsHelper.cjs.js +1 -0
  111. package/helpers/VertexNormalsHelper.js +41 -20
  112. package/helpers/VertexTangentsHelper.cjs.js +1 -0
  113. package/helpers/VertexTangentsHelper.js +36 -18
  114. package/index.cjs.js +1 -0
  115. package/index.js +333 -969
  116. package/interactive/InteractiveGroup.cjs.js +1 -0
  117. package/interactive/InteractiveGroup.d.ts +5 -0
  118. package/interactive/InteractiveGroup.js +87 -0
  119. package/interactive/SelectionBox.cjs.js +1 -0
  120. package/interactive/SelectionBox.js +46 -31
  121. package/interactive/SelectionHelper.cjs.js +1 -0
  122. package/interactive/SelectionHelper.js +21 -16
  123. package/libs/MeshoptDecoder.cjs.js +1 -0
  124. package/libs/MeshoptDecoder.js +58 -147
  125. package/libs/MotionControllers.cjs.js +1 -0
  126. package/libs/MotionControllers.js +208 -66
  127. package/lights/LightProbeGenerator.cjs.js +1 -0
  128. package/lights/LightProbeGenerator.js +96 -40
  129. package/lights/RectAreaLightUniformsLib.cjs.js +1 -0
  130. package/lights/RectAreaLightUniformsLib.js +9 -32842
  131. package/lines/Line2.cjs.js +1 -0
  132. package/lines/Line2.js +12 -9
  133. package/lines/LineGeometry.cjs.js +1 -0
  134. package/lines/LineGeometry.js +19 -7
  135. package/lines/LineMaterial.cjs.js +1 -0
  136. package/lines/LineMaterial.js +89 -51
  137. package/lines/LineSegments2.cjs.js +1 -0
  138. package/lines/LineSegments2.js +165 -56
  139. package/lines/LineSegmentsGeometry.cjs.js +1 -0
  140. package/lines/LineSegmentsGeometry.js +71 -29
  141. package/lines/Wireframe.cjs.js +1 -0
  142. package/lines/Wireframe.js +29 -15
  143. package/lines/WireframeGeometry2.cjs.js +1 -0
  144. package/lines/WireframeGeometry2.js +9 -8
  145. package/loaders/3DMLoader.cjs.js +1 -0
  146. package/loaders/3DMLoader.js +469 -234
  147. package/loaders/3MFLoader.cjs.js +1 -0
  148. package/loaders/3MFLoader.js +555 -340
  149. package/loaders/AMFLoader.cjs.js +1 -0
  150. package/loaders/AMFLoader.js +219 -114
  151. package/loaders/AssimpLoader.cjs.js +1 -0
  152. package/loaders/AssimpLoader.js +725 -328
  153. package/loaders/BVHLoader.cjs.js +1 -0
  154. package/loaders/BVHLoader.js +200 -94
  155. package/loaders/BasisTextureLoader.cjs.js +1 -0
  156. package/loaders/BasisTextureLoader.js +357 -229
  157. package/loaders/ColladaLoader.cjs.js +1 -0
  158. package/loaders/ColladaLoader.js +1522 -932
  159. package/loaders/DDSLoader.cjs.js +1 -0
  160. package/loaders/DDSLoader.js +108 -42
  161. package/loaders/DRACOLoader.cjs.js +1 -0
  162. package/loaders/DRACOLoader.js +210 -103
  163. package/loaders/EXRLoader.cjs.js +1 -0
  164. package/loaders/EXRLoader.js +809 -461
  165. package/loaders/FBXLoader.cjs.js +1 -0
  166. package/loaders/FBXLoader.js +1397 -842
  167. package/loaders/FontLoader.cjs.js +1 -0
  168. package/loaders/FontLoader.js +66 -33
  169. package/loaders/GCodeLoader.cjs.js +1 -0
  170. package/loaders/GCodeLoader.js +111 -63
  171. package/loaders/GLTFLoader.cjs.js +1 -0
  172. package/loaders/GLTFLoader.js +1484 -771
  173. package/loaders/HDRCubeTextureLoader.cjs.js +1 -0
  174. package/loaders/HDRCubeTextureLoader.js +50 -45
  175. package/loaders/KMZLoader.cjs.js +1 -0
  176. package/loaders/KMZLoader.js +55 -42
  177. package/loaders/KTX2Loader.cjs.js +1 -0
  178. package/loaders/KTX2Loader.js +362 -229
  179. package/loaders/KTXLoader.cjs.js +1 -0
  180. package/loaders/KTXLoader.js +99 -37
  181. package/loaders/LDrawLoader.cjs.js +1 -0
  182. package/loaders/LDrawLoader.js +746 -313
  183. package/loaders/LUT3dlLoader.cjs.js +1 -0
  184. package/loaders/LUT3dlLoader.js +62 -50
  185. package/loaders/LUTCubeLoader.cjs.js +1 -0
  186. package/loaders/LUTCubeLoader.js +56 -45
  187. package/loaders/LWOLoader.cjs.js +1 -0
  188. package/loaders/LWOLoader.js +339 -227
  189. package/loaders/LottieLoader.cjs.js +1 -0
  190. package/loaders/LottieLoader.js +38 -36
  191. package/loaders/MD2Loader.cjs.js +1 -0
  192. package/loaders/MD2Loader.js +91 -248
  193. package/loaders/MDDLoader.cjs.js +1 -0
  194. package/loaders/MDDLoader.js +45 -25
  195. package/loaders/MMDLoader.cjs.js +1 -0
  196. package/loaders/MMDLoader.js +795 -359
  197. package/loaders/MTLLoader.cjs.js +1 -0
  198. package/loaders/MTLLoader.js +201 -91
  199. package/loaders/NRRDLoader.cjs.js +1 -0
  200. package/loaders/NRRDLoader.js +263 -182
  201. package/loaders/NodeMaterialLoader.cjs.js +1 -0
  202. package/loaders/NodeMaterialLoader.js +14 -121
  203. package/loaders/OBJLoader.cjs.js +1 -0
  204. package/loaders/OBJLoader.js +283 -161
  205. package/loaders/PCDLoader.cjs.js +1 -0
  206. package/loaders/PCDLoader.js +164 -145
  207. package/loaders/PDBLoader.cjs.js +1 -0
  208. package/loaders/PDBLoader.js +63 -45
  209. package/loaders/PLYLoader.cjs.js +1 -0
  210. package/loaders/PLYLoader.js +203 -106
  211. package/loaders/PRWMLoader.cjs.js +1 -0
  212. package/loaders/PRWMLoader.js +110 -73
  213. package/loaders/PVRLoader.cjs.js +1 -0
  214. package/loaders/PVRLoader.js +93 -32
  215. package/loaders/RGBELoader.cjs.js +1 -0
  216. package/loaders/RGBELoader.js +233 -96
  217. package/loaders/RGBMLoader.cjs.js +1 -0
  218. package/loaders/RGBMLoader.js +514 -344
  219. package/loaders/STLLoader.cjs.js +1 -0
  220. package/loaders/STLLoader.js +165 -59
  221. package/loaders/SVGLoader.cjs.js +1 -0
  222. package/loaders/SVGLoader.js +851 -481
  223. package/loaders/TDSLoader.cjs.js +1 -0
  224. package/loaders/TDSLoader.js +527 -137
  225. package/loaders/TGALoader.cjs.js +1 -0
  226. package/loaders/TGALoader.js +205 -94
  227. package/loaders/TTFLoader.cjs.js +1 -0
  228. package/loaders/TTFLoader.js +79 -58
  229. package/loaders/TiltLoader.cjs.js +1 -0
  230. package/loaders/TiltLoader.js +167 -129
  231. package/loaders/VOXLoader.cjs.js +1 -0
  232. package/loaders/VOXLoader.js +84 -320
  233. package/loaders/VRMLLoader.cjs.js +1 -0
  234. package/loaders/VRMLLoader.js +1268 -786
  235. package/loaders/VRMLoader.cjs.js +1 -0
  236. package/loaders/VRMLoader.js +31 -23
  237. package/loaders/VTKLoader.cjs.js +1 -0
  238. package/loaders/VTKLoader.js +407 -219
  239. package/loaders/XLoader.cjs.js +1 -0
  240. package/loaders/XLoader.js +1259 -1083
  241. package/loaders/XYZLoader.cjs.js +1 -0
  242. package/loaders/XYZLoader.js +34 -28
  243. package/loaders/lwo/IFFParser.cjs.js +1 -0
  244. package/loaders/lwo/IFFParser.js +492 -238
  245. package/loaders/lwo/LWO2Parser.cjs.js +1 -0
  246. package/loaders/lwo/LWO2Parser.js +279 -176
  247. package/loaders/lwo/LWO3Parser.cjs.js +1 -0
  248. package/loaders/lwo/LWO3Parser.js +247 -160
  249. package/math/Capsule.cjs.js +1 -0
  250. package/math/Capsule.js +43 -56
  251. package/math/ColorConverter.cjs.js +1 -0
  252. package/math/ColorConverter.js +32 -18
  253. package/math/ConvexHull.cjs.js +1 -0
  254. package/math/ConvexHull.js +357 -97
  255. package/math/ImprovedNoise.cjs.js +1 -0
  256. package/math/ImprovedNoise.js +32 -282
  257. package/math/Lut.cjs.js +1 -0
  258. package/math/Lut.js +35 -51
  259. package/math/MeshSurfaceSampler.cjs.js +1 -0
  260. package/math/MeshSurfaceSampler.js +68 -25
  261. package/math/OBB.cjs.js +1 -0
  262. package/math/OBB.js +152 -91
  263. package/math/Octree.cjs.js +1 -0
  264. package/math/Octree.js +139 -76
  265. package/math/SimplexNoise.cjs.js +1 -0
  266. package/math/SimplexNoise.js +238 -217
  267. package/misc/ConvexObjectBreaker.cjs.js +1 -0
  268. package/misc/ConvexObjectBreaker.js +185 -79
  269. package/misc/GPUComputationRenderer.cjs.js +1 -0
  270. package/misc/GPUComputationRenderer.js +194 -69
  271. package/misc/Gyroscope.cjs.js +1 -0
  272. package/misc/Gyroscope.js +22 -16
  273. package/misc/MD2Character.cjs.js +1 -0
  274. package/misc/MD2Character.js +74 -52
  275. package/misc/MD2CharacterComplex.cjs.js +1 -0
  276. package/misc/MD2CharacterComplex.js +163 -112
  277. package/misc/MorphAnimMesh.cjs.js +1 -0
  278. package/misc/MorphAnimMesh.js +28 -20
  279. package/misc/MorphBlendMesh.cjs.js +1 -0
  280. package/misc/MorphBlendMesh.js +69 -45
  281. package/misc/ProgressiveLightmap.cjs.js +1 -0
  282. package/misc/ProgressiveLightmap.js +187 -70
  283. package/misc/RollerCoaster.cjs.js +1 -0
  284. package/misc/RollerCoaster.js +135 -106
  285. package/misc/TubePainter.cjs.js +1 -0
  286. package/misc/TubePainter.js +92 -74
  287. package/misc/Volume.cjs.js +1 -0
  288. package/misc/Volume.js +270 -108
  289. package/misc/VolumeSlice.cjs.js +1 -0
  290. package/misc/VolumeSlice.js +122 -34
  291. package/misc/WebGL.cjs.js +1 -0
  292. package/misc/WebGL.js +34 -37
  293. package/modifiers/CurveModifier.cjs.js +1 -0
  294. package/modifiers/CurveModifier.js +151 -46
  295. package/modifiers/EdgeSplitModifier.cjs.js +1 -0
  296. package/modifiers/EdgeSplitModifier.js +90 -46
  297. package/modifiers/SimplifyModifier.cjs.js +1 -0
  298. package/modifiers/SimplifyModifier.js +202 -77
  299. package/modifiers/TessellateModifier.cjs.js +1 -0
  300. package/modifiers/TessellateModifier.js +90 -65
  301. package/nodes/Nodes.cjs.js +1 -0
  302. package/nodes/Nodes.js +140 -274
  303. package/nodes/ShaderNode.cjs.js +1 -0
  304. package/nodes/ShaderNode.js +196 -296
  305. package/nodes/accessors/BufferNode.cjs.js +1 -0
  306. package/nodes/accessors/BufferNode.js +8 -4
  307. package/nodes/accessors/CameraNode.cjs.js +1 -0
  308. package/nodes/accessors/CameraNode.js +25 -20
  309. package/nodes/accessors/CubeTextureNode.cjs.js +1 -0
  310. package/nodes/accessors/CubeTextureNode.js +26 -14
  311. package/nodes/accessors/MaterialNode.cjs.js +1 -0
  312. package/nodes/accessors/MaterialNode.js +53 -43
  313. package/nodes/accessors/MaterialReferenceNode.cjs.js +1 -0
  314. package/nodes/accessors/MaterialReferenceNode.js +6 -3
  315. package/nodes/accessors/ModelNode.cjs.js +1 -0
  316. package/nodes/accessors/ModelNode.js +5 -3
  317. package/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  318. package/nodes/accessors/ModelViewProjectionNode.js +13 -14
  319. package/nodes/accessors/NormalNode.cjs.js +1 -0
  320. package/nodes/accessors/NormalNode.js +39 -40
  321. package/nodes/accessors/Object3DNode.cjs.js +1 -0
  322. package/nodes/accessors/Object3DNode.js +50 -40
  323. package/nodes/accessors/PointUVNode.cjs.js +1 -0
  324. package/nodes/accessors/PointUVNode.js +9 -5
  325. package/nodes/accessors/PositionNode.cjs.js +1 -0
  326. package/nodes/accessors/PositionNode.js +41 -42
  327. package/nodes/accessors/ReferenceNode.cjs.js +1 -0
  328. package/nodes/accessors/ReferenceNode.js +17 -10
  329. package/nodes/accessors/ReflectNode.cjs.js +1 -0
  330. package/nodes/accessors/ReflectNode.js +26 -23
  331. package/nodes/accessors/SkinningNode.cjs.js +1 -0
  332. package/nodes/accessors/SkinningNode.js +48 -46
  333. package/nodes/accessors/TextureNode.cjs.js +1 -0
  334. package/nodes/accessors/TextureNode.js +29 -14
  335. package/nodes/accessors/UVNode.cjs.js +1 -0
  336. package/nodes/accessors/UVNode.js +11 -5
  337. package/nodes/core/ArrayUniformNode.cjs.js +1 -0
  338. package/nodes/core/ArrayUniformNode.js +7 -3
  339. package/nodes/core/AttributeNode.cjs.js +1 -0
  340. package/nodes/core/AttributeNode.js +12 -5
  341. package/nodes/core/BypassNode.cjs.js +1 -0
  342. package/nodes/core/BypassNode.js +12 -5
  343. package/nodes/core/CodeNode.cjs.js +1 -0
  344. package/nodes/core/CodeNode.js +12 -4
  345. package/nodes/core/ConstNode.cjs.js +1 -0
  346. package/nodes/core/ConstNode.js +7 -3
  347. package/nodes/core/ContextNode.cjs.js +1 -0
  348. package/nodes/core/ContextNode.js +8 -3
  349. package/nodes/core/ExpressionNode.cjs.js +1 -0
  350. package/nodes/core/ExpressionNode.js +9 -5
  351. package/nodes/core/FunctionCallNode.cjs.js +1 -0
  352. package/nodes/core/FunctionCallNode.js +15 -6
  353. package/nodes/core/FunctionNode.cjs.js +1 -0
  354. package/nodes/core/FunctionNode.js +25 -10
  355. package/nodes/core/InputNode.cjs.js +1 -0
  356. package/nodes/core/InputNode.js +23 -12
  357. package/nodes/core/Node.cjs.js +1 -0
  358. package/nodes/core/Node.js +75 -35
  359. package/nodes/core/NodeAttribute.cjs.js +1 -0
  360. package/nodes/core/NodeAttribute.js +4 -2
  361. package/nodes/core/NodeBuilder.cjs.js +1 -0
  362. package/nodes/core/NodeBuilder.js +224 -110
  363. package/nodes/core/NodeCode.cjs.js +1 -0
  364. package/nodes/core/NodeCode.js +7 -4
  365. package/nodes/core/NodeFrame.cjs.js +1 -0
  366. package/nodes/core/NodeFrame.js +12 -9
  367. package/nodes/core/NodeFunction.cjs.js +1 -0
  368. package/nodes/core/NodeFunction.js +17 -0
  369. package/nodes/core/NodeFunctionInput.cjs.js +1 -0
  370. package/nodes/core/NodeFunctionInput.js +5 -3
  371. package/nodes/core/NodeKeywords.cjs.js +1 -0
  372. package/nodes/core/NodeKeywords.js +16 -5
  373. package/nodes/core/NodeParser.cjs.js +1 -0
  374. package/nodes/core/NodeParser.js +8 -0
  375. package/nodes/core/NodeUniform.cjs.js +1 -0
  376. package/nodes/core/NodeUniform.js +7 -3
  377. package/nodes/core/NodeUtils.cjs.js +1 -0
  378. package/nodes/core/NodeUtils.js +43 -39
  379. package/nodes/core/NodeVar.cjs.js +1 -0
  380. package/nodes/core/NodeVar.js +4 -2
  381. package/nodes/core/NodeVary.cjs.js +1 -0
  382. package/nodes/core/NodeVary.js +4 -2
  383. package/nodes/core/PropertyNode.cjs.js +1 -0
  384. package/nodes/core/PropertyNode.js +10 -4
  385. package/nodes/core/TempNode.cjs.js +1 -0
  386. package/nodes/core/TempNode.js +11 -5
  387. package/nodes/core/UniformNode.cjs.js +1 -0
  388. package/nodes/core/UniformNode.js +10 -4
  389. package/nodes/core/VarNode.cjs.js +1 -0
  390. package/nodes/core/VarNode.js +11 -3
  391. package/nodes/core/VaryNode.cjs.js +1 -0
  392. package/nodes/core/VaryNode.js +15 -6
  393. package/nodes/core/constants.cjs.js +1 -0
  394. package/nodes/core/constants.js +7 -20
  395. package/nodes/display/ColorSpaceNode.cjs.js +1 -0
  396. package/nodes/display/ColorSpaceNode.js +38 -34
  397. package/nodes/display/NormalMapNode.cjs.js +1 -0
  398. package/nodes/display/NormalMapNode.js +53 -35
  399. package/nodes/fog/FogNode.cjs.js +1 -0
  400. package/nodes/fog/FogNode.js +9 -5
  401. package/nodes/fog/FogRangeNode.cjs.js +1 -0
  402. package/nodes/fog/FogRangeNode.js +9 -5
  403. package/nodes/functions/BSDFs.cjs.js +1 -0
  404. package/nodes/functions/BSDFs.js +118 -61
  405. package/nodes/functions/PhysicalMaterialFunctions.cjs.js +1 -0
  406. package/nodes/functions/PhysicalMaterialFunctions.js +57 -0
  407. package/nodes/lights/LightContextNode.cjs.js +1 -0
  408. package/nodes/lights/LightContextNode.js +23 -14
  409. package/nodes/lights/LightNode.cjs.js +1 -0
  410. package/nodes/lights/LightNode.js +31 -27
  411. package/nodes/lights/LightsNode.cjs.js +1 -0
  412. package/nodes/lights/LightsNode.js +28 -9
  413. package/nodes/loaders/NodeLoader.cjs.js +1 -0
  414. package/nodes/loaders/NodeLoader.js +42 -27
  415. package/nodes/loaders/NodeMaterialLoader.cjs.js +1 -0
  416. package/nodes/loaders/NodeMaterialLoader.js +10 -4
  417. package/nodes/loaders/NodeObjectLoader.cjs.js +1 -0
  418. package/nodes/loaders/NodeObjectLoader.js +19 -9
  419. package/nodes/materials/LineBasicNodeMaterial.cjs.js +1 -0
  420. package/nodes/materials/LineBasicNodeMaterial.js +10 -5
  421. package/nodes/materials/Materials.cjs.js +1 -0
  422. package/nodes/materials/Materials.js +17 -14
  423. package/nodes/materials/MeshBasicNodeMaterial.cjs.js +1 -0
  424. package/nodes/materials/MeshBasicNodeMaterial.js +10 -5
  425. package/nodes/materials/MeshStandardNodeMaterial.cjs.js +1 -0
  426. package/nodes/materials/MeshStandardNodeMaterial.js +8 -5
  427. package/nodes/materials/NodeMaterial.cjs.js +1 -0
  428. package/nodes/materials/NodeMaterial.js +36 -20
  429. package/nodes/materials/PointsNodeMaterial.cjs.js +1 -0
  430. package/nodes/materials/PointsNodeMaterial.js +10 -5
  431. package/nodes/math/CondNode.cjs.js +1 -0
  432. package/nodes/math/CondNode.js +23 -11
  433. package/nodes/math/MathNode.cjs.js +1 -0
  434. package/nodes/math/MathNode.js +142 -98
  435. package/nodes/math/OperatorNode.cjs.js +1 -0
  436. package/nodes/math/OperatorNode.js +46 -24
  437. package/nodes/parsers/GLSLNodeFunction.cjs.js +1 -0
  438. package/nodes/parsers/GLSLNodeFunction.js +101 -0
  439. package/nodes/parsers/GLSLNodeParser.cjs.js +1 -0
  440. package/nodes/parsers/GLSLNodeParser.js +13 -0
  441. package/nodes/parsers/WGSLNodeFunction.cjs.js +1 -0
  442. package/nodes/parsers/WGSLNodeFunction.js +71 -0
  443. package/nodes/parsers/WGSLNodeParser.cjs.js +1 -0
  444. package/nodes/parsers/WGSLNodeParser.js +13 -0
  445. package/nodes/procedural/CheckerNode.cjs.js +1 -0
  446. package/nodes/procedural/CheckerNode.js +19 -13
  447. package/nodes/utils/ArrayElementNode.cjs.js +1 -0
  448. package/nodes/utils/ArrayElementNode.js +8 -4
  449. package/nodes/utils/ConvertNode.cjs.js +1 -0
  450. package/nodes/utils/ConvertNode.js +8 -3
  451. package/nodes/utils/JoinNode.cjs.js +1 -0
  452. package/nodes/utils/JoinNode.js +11 -7
  453. package/nodes/utils/MatcapUVNode.cjs.js +1 -0
  454. package/nodes/utils/MatcapUVNode.js +11 -8
  455. package/nodes/utils/OscNode.cjs.js +1 -0
  456. package/nodes/utils/OscNode.js +33 -27
  457. package/nodes/utils/SplitNode.cjs.js +1 -0
  458. package/nodes/utils/SplitNode.js +20 -6
  459. package/nodes/utils/SpriteSheetUVNode.cjs.js +1 -0
  460. package/nodes/utils/SpriteSheetUVNode.js +23 -23
  461. package/nodes/utils/TimerNode.cjs.js +1 -0
  462. package/nodes/utils/TimerNode.js +24 -20
  463. package/objects/GroundProjectedEnv.cjs.js +1 -0
  464. package/objects/GroundProjectedEnv.js +37 -22
  465. package/objects/Lensflare.cjs.js +1 -0
  466. package/objects/Lensflare.js +156 -86
  467. package/objects/LightningStorm.cjs.js +1 -0
  468. package/objects/LightningStorm.js +102 -38
  469. package/objects/MarchingCubes.cjs.js +1 -0
  470. package/objects/MarchingCubes.js +303 -150
  471. package/objects/Reflector.cjs.js +1 -0
  472. package/objects/Reflector.js +72 -50
  473. package/objects/ReflectorForSSRPass.cjs.js +1 -0
  474. package/objects/ReflectorForSSRPass.js +131 -80
  475. package/objects/ReflectorRTT.cjs.js +1 -0
  476. package/objects/ReflectorRTT.js +7 -6
  477. package/objects/Refractor.cjs.js +1 -0
  478. package/objects/Refractor.js +106 -64
  479. package/objects/ShadowMesh.cjs.js +1 -0
  480. package/objects/ShadowMesh.js +17 -8
  481. package/objects/Sky.cjs.js +1 -0
  482. package/objects/Sky.js +80 -119
  483. package/objects/Water.cjs.js +1 -0
  484. package/objects/Water.js +127 -83
  485. package/objects/Water2.cjs.js +1 -0
  486. package/objects/Water2.js +108 -72
  487. package/offscreen/jank.cjs.js +1 -0
  488. package/offscreen/jank.js +14 -10
  489. package/offscreen/offscreen.cjs.js +1 -0
  490. package/offscreen/offscreen.js +5 -4
  491. package/offscreen/scene.cjs.js +1 -0
  492. package/offscreen/scene.js +48 -45
  493. package/package.json +3 -3
  494. package/physics/AmmoPhysics.cjs.js +1 -0
  495. package/physics/AmmoPhysics.js +71 -30
  496. package/postprocessing/AdaptiveToneMappingPass.cjs.js +1 -0
  497. package/postprocessing/AdaptiveToneMappingPass.js +123 -97
  498. package/postprocessing/AfterimagePass.cjs.js +1 -0
  499. package/postprocessing/AfterimagePass.js +49 -28
  500. package/postprocessing/BloomPass.cjs.js +1 -0
  501. package/postprocessing/BloomPass.js +69 -43
  502. package/postprocessing/BokehPass.cjs.js +1 -0
  503. package/postprocessing/BokehPass.js +69 -39
  504. package/postprocessing/ClearPass.cjs.js +1 -0
  505. package/postprocessing/ClearPass.js +25 -10
  506. package/postprocessing/CubeTexturePass.cjs.js +1 -0
  507. package/postprocessing/CubeTexturePass.js +27 -28
  508. package/postprocessing/DotScreenPass.cjs.js +1 -0
  509. package/postprocessing/DotScreenPass.js +32 -24
  510. package/postprocessing/EffectComposer.cjs.js +1 -0
  511. package/postprocessing/EffectComposer.js +86 -39
  512. package/postprocessing/FilmPass.cjs.js +1 -0
  513. package/postprocessing/FilmPass.js +30 -25
  514. package/postprocessing/GlitchPass.cjs.js +1 -0
  515. package/postprocessing/GlitchPass.js +61 -38
  516. package/postprocessing/HalftonePass.cjs.js +1 -0
  517. package/postprocessing/HalftonePass.js +39 -19
  518. package/postprocessing/LUTPass.cjs.js +1 -0
  519. package/postprocessing/LUTPass.js +38 -13
  520. package/postprocessing/MaskPass.cjs.js +1 -0
  521. package/postprocessing/MaskPass.js +38 -19
  522. package/postprocessing/OutlinePass.cjs.js +1 -0
  523. package/postprocessing/OutlinePass.js +277 -135
  524. package/postprocessing/Pass.cjs.js +1 -0
  525. package/postprocessing/Pass.js +44 -20
  526. package/postprocessing/RenderPass.cjs.js +1 -0
  527. package/postprocessing/RenderPass.js +36 -13
  528. package/postprocessing/RenderPixelatedPass.cjs.js +1 -0
  529. package/postprocessing/RenderPixelatedPass.js +58 -44
  530. package/postprocessing/SAOPass.cjs.js +1 -0
  531. package/postprocessing/SAOPass.js +189 -154
  532. package/postprocessing/SMAAPass.cjs.js +1 -0
  533. package/postprocessing/SMAAPass.js +84 -64
  534. package/postprocessing/SSAARenderPass.cjs.js +1 -0
  535. package/postprocessing/SSAARenderPass.js +69 -121
  536. package/postprocessing/SSAOPass.cjs.js +1 -0
  537. package/postprocessing/SSAOPass.js +172 -123
  538. package/postprocessing/SSRPass.cjs.js +1 -0
  539. package/postprocessing/SSRPass.js +280 -211
  540. package/postprocessing/SavePass.cjs.js +1 -0
  541. package/postprocessing/SavePass.js +25 -20
  542. package/postprocessing/ShaderPass.cjs.js +1 -0
  543. package/postprocessing/ShaderPass.js +30 -14
  544. package/postprocessing/TAARenderPass.cjs.js +1 -0
  545. package/postprocessing/TAARenderPass.js +61 -42
  546. package/postprocessing/TexturePass.cjs.js +1 -0
  547. package/postprocessing/TexturePass.js +22 -21
  548. package/postprocessing/UnrealBloomPass.cjs.js +1 -0
  549. package/postprocessing/UnrealBloomPass.js +213 -105
  550. package/renderers/CSS2DRenderer.cjs.js +1 -0
  551. package/renderers/CSS2DRenderer.js +56 -44
  552. package/renderers/CSS3DRenderer.cjs.js +1 -0
  553. package/renderers/CSS3DRenderer.js +86 -53
  554. package/renderers/Projector.cjs.js +1 -0
  555. package/renderers/Projector.js +274 -107
  556. package/renderers/SVGRenderer.cjs.js +1 -0
  557. package/renderers/SVGRenderer.js +182 -72
  558. package/renderers/nodes/accessors/CameraNode.cjs.js +1 -0
  559. package/renderers/nodes/accessors/CameraNode.js +40 -29
  560. package/renderers/nodes/accessors/ModelNode.cjs.js +1 -0
  561. package/renderers/nodes/accessors/ModelNode.js +37 -28
  562. package/renderers/nodes/accessors/ModelViewProjectionNode.cjs.js +1 -0
  563. package/renderers/nodes/accessors/ModelViewProjectionNode.js +23 -10
  564. package/renderers/nodes/accessors/NormalNode.cjs.js +1 -0
  565. package/renderers/nodes/accessors/NormalNode.js +45 -35
  566. package/renderers/nodes/accessors/PositionNode.cjs.js +1 -0
  567. package/renderers/nodes/accessors/PositionNode.js +19 -18
  568. package/renderers/nodes/accessors/UVNode.cjs.js +1 -0
  569. package/renderers/nodes/accessors/UVNode.js +10 -5
  570. package/renderers/nodes/core/AttributeNode.cjs.js +1 -0
  571. package/renderers/nodes/core/AttributeNode.js +14 -5
  572. package/renderers/nodes/core/InputNode.cjs.js +1 -0
  573. package/renderers/nodes/core/InputNode.js +14 -4
  574. package/renderers/nodes/core/Node.cjs.js +1 -0
  575. package/renderers/nodes/core/Node.js +17 -7
  576. package/renderers/nodes/core/NodeAttribute.cjs.js +1 -0
  577. package/renderers/nodes/core/NodeAttribute.js +6 -3
  578. package/renderers/nodes/core/NodeBuilder.cjs.js +1 -0
  579. package/renderers/nodes/core/NodeBuilder.js +154 -87
  580. package/renderers/nodes/core/NodeFrame.cjs.js +1 -0
  581. package/renderers/nodes/core/NodeFrame.js +12 -9
  582. package/renderers/nodes/core/NodeSlot.cjs.js +1 -0
  583. package/renderers/nodes/core/NodeSlot.js +3 -2
  584. package/renderers/nodes/core/NodeUniform.cjs.js +1 -0
  585. package/renderers/nodes/core/NodeUniform.js +9 -4
  586. package/renderers/nodes/core/NodeVary.cjs.js +1 -0
  587. package/renderers/nodes/core/NodeVary.js +7 -4
  588. package/renderers/nodes/core/VaryNode.cjs.js +1 -0
  589. package/renderers/nodes/core/VaryNode.js +12 -6
  590. package/renderers/nodes/core/constants.cjs.js +1 -0
  591. package/renderers/nodes/core/constants.js +13 -16
  592. package/renderers/nodes/inputs/ColorNode.cjs.js +1 -0
  593. package/renderers/nodes/inputs/ColorNode.js +11 -5
  594. package/renderers/nodes/inputs/FloatNode.cjs.js +1 -0
  595. package/renderers/nodes/inputs/FloatNode.js +11 -5
  596. package/renderers/nodes/inputs/Matrix3Node.cjs.js +1 -0
  597. package/renderers/nodes/inputs/Matrix3Node.js +13 -7
  598. package/renderers/nodes/inputs/Matrix4Node.cjs.js +1 -0
  599. package/renderers/nodes/inputs/Matrix4Node.js +13 -7
  600. package/renderers/nodes/inputs/TextureNode.cjs.js +1 -0
  601. package/renderers/nodes/inputs/TextureNode.js +15 -7
  602. package/renderers/nodes/inputs/Vector2Node.cjs.js +1 -0
  603. package/renderers/nodes/inputs/Vector2Node.js +11 -5
  604. package/renderers/nodes/inputs/Vector3Node.cjs.js +1 -0
  605. package/renderers/nodes/inputs/Vector3Node.js +13 -7
  606. package/renderers/nodes/inputs/Vector4Node.cjs.js +1 -0
  607. package/renderers/nodes/inputs/Vector4Node.js +13 -7
  608. package/renderers/nodes/math/MathNode.cjs.js +1 -0
  609. package/renderers/nodes/math/MathNode.js +30 -20
  610. package/renderers/nodes/math/OperatorNode.cjs.js +1 -0
  611. package/renderers/nodes/math/OperatorNode.js +20 -4
  612. package/renderers/nodes/utils/SwitchNode.cjs.js +1 -0
  613. package/renderers/nodes/utils/SwitchNode.js +9 -4
  614. package/renderers/nodes/utils/TimerNode.cjs.js +1 -0
  615. package/renderers/nodes/utils/TimerNode.js +10 -5
  616. package/renderers/webgpu/WebGPU.cjs.js +1 -0
  617. package/renderers/webgpu/WebGPU.js +16 -14
  618. package/renderers/webgpu/WebGPUAttributes.cjs.js +1 -0
  619. package/renderers/webgpu/WebGPUAttributes.js +23 -16
  620. package/renderers/webgpu/WebGPUBackground.cjs.js +1 -0
  621. package/renderers/webgpu/WebGPUBackground.js +30 -13
  622. package/renderers/webgpu/WebGPUBinding.cjs.js +1 -0
  623. package/renderers/webgpu/WebGPUBinding.js +7 -4
  624. package/renderers/webgpu/WebGPUBindings.cjs.js +1 -0
  625. package/renderers/webgpu/WebGPUBindings.js +57 -21
  626. package/renderers/webgpu/WebGPUComputePipelines.cjs.js +1 -0
  627. package/renderers/webgpu/WebGPUComputePipelines.js +25 -14
  628. package/renderers/webgpu/WebGPUGeometries.cjs.js +1 -0
  629. package/renderers/webgpu/WebGPUGeometries.js +15 -5
  630. package/renderers/webgpu/WebGPUInfo.cjs.js +1 -0
  631. package/renderers/webgpu/WebGPUInfo.js +8 -3
  632. package/renderers/webgpu/WebGPUObjects.cjs.js +1 -0
  633. package/renderers/webgpu/WebGPUObjects.js +10 -5
  634. package/renderers/webgpu/WebGPUProperties.cjs.js +1 -0
  635. package/renderers/webgpu/WebGPUProperties.js +11 -5
  636. package/renderers/webgpu/WebGPURenderLists.cjs.js +1 -0
  637. package/renderers/webgpu/WebGPURenderLists.js +36 -20
  638. package/renderers/webgpu/WebGPURenderPipelines.cjs.js +1 -0
  639. package/renderers/webgpu/WebGPURenderPipelines.js +387 -260
  640. package/renderers/webgpu/WebGPURenderer.cjs.js +1 -0
  641. package/renderers/webgpu/WebGPURenderer.js +262 -124
  642. package/renderers/webgpu/WebGPUSampledTexture.cjs.js +1 -0
  643. package/renderers/webgpu/WebGPUSampledTexture.js +31 -18
  644. package/renderers/webgpu/WebGPUSampler.cjs.js +1 -0
  645. package/renderers/webgpu/WebGPUSampler.js +12 -7
  646. package/renderers/webgpu/WebGPUStorageBuffer.cjs.js +1 -0
  647. package/renderers/webgpu/WebGPUStorageBuffer.js +12 -7
  648. package/renderers/webgpu/WebGPUTextureRenderer.cjs.js +1 -0
  649. package/renderers/webgpu/WebGPUTextureRenderer.js +11 -5
  650. package/renderers/webgpu/WebGPUTextureUtils.cjs.js +1 -0
  651. package/renderers/webgpu/WebGPUTextureUtils.js +40 -29
  652. package/renderers/webgpu/WebGPUTextures.cjs.js +1 -0
  653. package/renderers/webgpu/WebGPUTextures.js +333 -186
  654. package/renderers/webgpu/WebGPUUniform.cjs.js +1 -0
  655. package/renderers/webgpu/WebGPUUniform.js +51 -25
  656. package/renderers/webgpu/WebGPUUniformsGroup.cjs.js +1 -0
  657. package/renderers/webgpu/WebGPUUniformsGroup.js +72 -32
  658. package/renderers/webgpu/constants.cjs.js +1 -0
  659. package/renderers/webgpu/constants.js +181 -190
  660. package/renderers/webgpu/nodes/ShaderLib.cjs.js +1 -0
  661. package/renderers/webgpu/nodes/ShaderLib.js +2 -2
  662. package/renderers/webgpu/nodes/WebGPUNodeBuilder.cjs.js +1 -0
  663. package/renderers/webgpu/nodes/WebGPUNodeBuilder.js +124 -53
  664. package/renderers/webgpu/nodes/WebGPUNodeUniform.cjs.js +1 -0
  665. package/renderers/webgpu/nodes/WebGPUNodeUniform.js +31 -17
  666. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.cjs.js +1 -0
  667. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +9 -8
  668. package/renderers/webgpu/nodes/WebGPUNodes.cjs.js +1 -0
  669. package/renderers/webgpu/nodes/WebGPUNodes.js +45 -7
  670. package/shaders/ACESFilmicToneMappingShader.cjs.js +1 -0
  671. package/shaders/ACESFilmicToneMappingShader.js +24 -44
  672. package/shaders/AfterimageShader.cjs.js +1 -0
  673. package/shaders/AfterimageShader.js +18 -28
  674. package/shaders/BasicShader.cjs.js +1 -0
  675. package/shaders/BasicShader.js +7 -9
  676. package/shaders/BleachBypassShader.cjs.js +1 -0
  677. package/shaders/BleachBypassShader.js +15 -31
  678. package/shaders/BlendShader.cjs.js +1 -0
  679. package/shaders/BlendShader.js +19 -26
  680. package/shaders/BokehShader.cjs.js +1 -0
  681. package/shaders/BokehShader.js +36 -98
  682. package/shaders/BokehShader2.cjs.js +1 -0
  683. package/shaders/BokehShader2.js +90 -261
  684. package/shaders/BrightnessContrastShader.cjs.js +1 -0
  685. package/shaders/BrightnessContrastShader.js +19 -28
  686. package/shaders/ColorCorrectionShader.cjs.js +1 -0
  687. package/shaders/ColorCorrectionShader.js +22 -26
  688. package/shaders/ColorifyShader.cjs.js +1 -0
  689. package/shaders/ColorifyShader.js +16 -24
  690. package/shaders/ConvolutionShader.cjs.js +1 -0
  691. package/shaders/ConvolutionShader.js +36 -40
  692. package/shaders/CopyShader.cjs.js +1 -0
  693. package/shaders/CopyShader.js +13 -21
  694. package/shaders/DOFMipMapShader.cjs.js +1 -0
  695. package/shaders/DOFMipMapShader.js +21 -28
  696. package/shaders/DepthLimitedBlurShader.cjs.js +1 -0
  697. package/shaders/DepthLimitedBlurShader.js +40 -85
  698. package/shaders/DigitalGlitch.cjs.js +1 -0
  699. package/shaders/DigitalGlitch.js +46 -74
  700. package/shaders/DotScreenShader.cjs.js +1 -0
  701. package/shaders/DotScreenShader.js +27 -35
  702. package/shaders/FXAAShader.cjs.js +1 -0
  703. package/shaders/FXAAShader.js +19 -1094
  704. package/shaders/FilmShader.cjs.js +1 -0
  705. package/shaders/FilmShader.js +52 -38
  706. package/shaders/FocusShader.cjs.js +1 -0
  707. package/shaders/FocusShader.js +24 -51
  708. package/shaders/FreiChenShader.cjs.js +1 -0
  709. package/shaders/FreiChenShader.js +24 -57
  710. package/shaders/FresnelShader.cjs.js +1 -0
  711. package/shaders/FresnelShader.js +22 -43
  712. package/shaders/GammaCorrectionShader.cjs.js +1 -0
  713. package/shaders/GammaCorrectionShader.js +11 -19
  714. package/shaders/GodRaysShader.cjs.js +1 -0
  715. package/shaders/GodRaysShader.js +94 -103
  716. package/shaders/HalftoneShader.cjs.js +1 -0
  717. package/shaders/HalftoneShader.js +65 -208
  718. package/shaders/HorizontalBlurShader.cjs.js +1 -0
  719. package/shaders/HorizontalBlurShader.js +23 -7
  720. package/shaders/HorizontalTiltShiftShader.cjs.js +1 -0
  721. package/shaders/HorizontalTiltShiftShader.js +21 -33
  722. package/shaders/HueSaturationShader.cjs.js +1 -0
  723. package/shaders/HueSaturationShader.js +21 -37
  724. package/shaders/KaleidoShader.cjs.js +1 -0
  725. package/shaders/KaleidoShader.js +22 -30
  726. package/shaders/LuminosityHighPassShader.cjs.js +1 -0
  727. package/shaders/LuminosityHighPassShader.js +27 -33
  728. package/shaders/LuminosityShader.cjs.js +1 -0
  729. package/shaders/LuminosityShader.js +11 -21
  730. package/shaders/MirrorShader.cjs.js +1 -0
  731. package/shaders/MirrorShader.js +16 -31
  732. package/shaders/NormalMapShader.cjs.js +1 -0
  733. package/shaders/NormalMapShader.js +23 -27
  734. package/shaders/ParallaxShader.cjs.js +1 -0
  735. package/shaders/ParallaxShader.js +48 -107
  736. package/shaders/PixelShader.cjs.js +1 -0
  737. package/shaders/PixelShader.js +16 -24
  738. package/shaders/RGBShiftShader.cjs.js +1 -0
  739. package/shaders/RGBShiftShader.js +22 -26
  740. package/shaders/SAOShader.cjs.js +1 -0
  741. package/shaders/SAOShader.js +48 -132
  742. package/shaders/SMAAShader.cjs.js +1 -0
  743. package/shaders/SMAAShader.js +135 -256
  744. package/shaders/SSAOShader.cjs.js +1 -0
  745. package/shaders/SSAOShader.js +81 -153
  746. package/shaders/SSRShader.cjs.js +1 -0
  747. package/shaders/SSRShader.js +87 -32
  748. package/shaders/SepiaShader.cjs.js +1 -0
  749. package/shaders/SepiaShader.js +15 -25
  750. package/shaders/SobelOperatorShader.cjs.js +1 -0
  751. package/shaders/SobelOperatorShader.js +29 -40
  752. package/shaders/SubsurfaceScatteringShader.cjs.js +1 -0
  753. package/shaders/SubsurfaceScatteringShader.js +39 -53
  754. package/shaders/TechnicolorShader.cjs.js +1 -0
  755. package/shaders/TechnicolorShader.js +13 -20
  756. package/shaders/ToneMapShader.cjs.js +1 -0
  757. package/shaders/ToneMapShader.js +28 -44
  758. package/shaders/ToonShader.cjs.js +1 -0
  759. package/shaders/ToonShader.js +96 -172
  760. package/shaders/TriangleBlurShader.cjs.js +1 -0
  761. package/shaders/TriangleBlurShader.js +23 -32
  762. package/shaders/UnpackDepthRGBAShader.cjs.js +1 -0
  763. package/shaders/UnpackDepthRGBAShader.js +14 -22
  764. package/shaders/VerticalBlurShader.cjs.js +1 -0
  765. package/shaders/VerticalBlurShader.js +23 -7
  766. package/shaders/VerticalTiltShiftShader.cjs.js +1 -0
  767. package/shaders/VerticalTiltShiftShader.js +21 -33
  768. package/shaders/VignetteShader.cjs.js +1 -0
  769. package/shaders/VignetteShader.js +28 -24
  770. package/shaders/VolumeShader.cjs.js +1 -0
  771. package/shaders/VolumeShader.js +77 -174
  772. package/shaders/WaterRefractionShader.cjs.js +1 -0
  773. package/shaders/WaterRefractionShader.js +6 -38
  774. package/shaders/types.cjs.js +1 -0
  775. package/shaders/types.js +1 -1
  776. package/textures/FlakesTexture.cjs.js +1 -0
  777. package/textures/FlakesTexture.js +10 -8
  778. package/types/helpers.cjs.js +1 -0
  779. package/types/helpers.js +2 -3
  780. package/types/shared.cjs.js +1 -0
  781. package/types/shared.js +1 -0
  782. package/types/utils.cjs.js +1 -0
  783. package/types/utils.js +1 -0
  784. package/utils/BufferGeometryUtils.cjs.js +1 -0
  785. package/utils/BufferGeometryUtils.js +325 -251
  786. package/utils/GeometryCompressionUtils.cjs.js +1 -0
  787. package/utils/GeometryCompressionUtils.js +239 -241
  788. package/utils/GeometryUtils.cjs.js +1 -0
  789. package/utils/GeometryUtils.js +94 -41
  790. package/utils/LDrawUtils.cjs.js +1 -0
  791. package/utils/LDrawUtils.d.ts +5 -0
  792. package/utils/LDrawUtils.js +144 -0
  793. package/utils/RoughnessMipmapper.cjs.js +1 -0
  794. package/utils/RoughnessMipmapper.js +82 -38
  795. package/utils/SceneUtils.cjs.js +1 -0
  796. package/utils/SceneUtils.js +20 -15
  797. package/utils/ShadowMapViewer.cjs.js +1 -0
  798. package/utils/ShadowMapViewer.js +95 -49
  799. package/utils/SkeletonUtils.cjs.js +1 -0
  800. package/utils/SkeletonUtils.js +165 -74
  801. package/utils/UVsDebug.cjs.js +1 -0
  802. package/utils/UVsDebug.js +62 -32
  803. package/utils/WorkerPool.cjs.js +1 -0
  804. package/utils/WorkerPool.js +33 -13
  805. package/webxr/ARButton.cjs.js +1 -0
  806. package/webxr/ARButton.js +98 -72
  807. package/webxr/OculusHandModel.cjs.js +1 -0
  808. package/webxr/OculusHandModel.js +37 -18
  809. package/webxr/OculusHandPointerModel.cjs.js +1 -0
  810. package/webxr/OculusHandPointerModel.js +80 -58
  811. package/webxr/Text2D.cjs.js +1 -0
  812. package/webxr/Text2D.js +19 -37
  813. package/webxr/VRButton.cjs.js +1 -0
  814. package/webxr/VRButton.js +90 -59
  815. package/webxr/XRControllerModelFactory.cjs.js +1 -0
  816. package/webxr/XRControllerModelFactory.js +116 -58
  817. package/webxr/XREstimatedLight.cjs.js +1 -0
  818. package/webxr/XREstimatedLight.js +66 -39
  819. package/webxr/XRHandMeshModel.cjs.js +1 -0
  820. package/webxr/XRHandMeshModel.js +29 -40
  821. package/webxr/XRHandModelFactory.cjs.js +1 -0
  822. package/webxr/XRHandModelFactory.js +31 -28
  823. package/webxr/XRHandPrimitiveModel.cjs.js +1 -0
  824. package/webxr/XRHandPrimitiveModel.js +27 -41
  825. package/animation/AnimationClipCreator.mjs +0 -57
  826. package/animation/CCDIKSolver.mjs +0 -223
  827. package/animation/MMDAnimationHelper.mjs +0 -514
  828. package/animation/MMDPhysics.mjs +0 -769
  829. package/cameras/CinematicCamera.mjs +0 -129
  830. package/controls/ArcballControls.mjs +0 -1737
  831. package/controls/DeviceOrientationControls.mjs +0 -74
  832. package/controls/DragControls.mjs +0 -172
  833. package/controls/FirstPersonControls.mjs +0 -220
  834. package/controls/FlyControls.mjs +0 -239
  835. package/controls/OrbitControls.mjs +0 -731
  836. package/controls/PointerLockControls.mjs +0 -88
  837. package/controls/TrackballControls.mjs +0 -481
  838. package/controls/TransformControls.mjs +0 -1068
  839. package/controls/experimental/CameraControls.mjs +0 -673
  840. package/csm/CSM.mjs +0 -244
  841. package/csm/CSMFrustum.mjs +0 -75
  842. package/csm/CSMHelper.mjs +0 -114
  843. package/csm/CSMShader.mjs +0 -251
  844. package/curves/CurveExtras.mjs +0 -224
  845. package/curves/NURBSCurve.mjs +0 -35
  846. package/curves/NURBSSurface.mjs +0 -28
  847. package/curves/NURBSUtils.mjs +0 -226
  848. package/deprecated/Geometry.mjs +0 -966
  849. package/effects/AnaglyphEffect.mjs +0 -120
  850. package/effects/AsciiEffect.mjs +0 -173
  851. package/effects/OutlineEffect.mjs +0 -295
  852. package/effects/ParallaxBarrierEffect.mjs +0 -64
  853. package/effects/PeppersGhostEffect.mjs +0 -85
  854. package/effects/StereoEffect.mjs +0 -32
  855. package/environments/RoomEnvironment.mjs +0 -78
  856. package/exporters/ColladaExporter.mjs +0 -299
  857. package/exporters/DRACOExporter.mjs +0 -132
  858. package/exporters/GLTFExporter.mjs +0 -1381
  859. package/exporters/MMDExporter.mjs +0 -102
  860. package/exporters/OBJExporter.mjs +0 -166
  861. package/exporters/PLYExporter.mjs +0 -278
  862. package/exporters/STLExporter.mjs +0 -129
  863. package/exporters/USDZExporter.mjs +0 -328
  864. package/geometries/BoxLineGeometry.mjs +0 -45
  865. package/geometries/ConvexGeometry.mjs +0 -29
  866. package/geometries/DecalGeometry.mjs +0 -184
  867. package/geometries/LightningStrike.mjs +0 -547
  868. package/geometries/ParametricGeometries.mjs +0 -129
  869. package/geometries/ParametricGeometry.mjs +0 -63
  870. package/geometries/RoundedBoxGeometry.mjs +0 -91
  871. package/geometries/TeapotGeometry.mjs +0 -1557
  872. package/geometries/TextGeometry.mjs +0 -23
  873. package/helpers/LightProbeHelper.mjs +0 -72
  874. package/helpers/PositionalAudioHelper.mjs +0 -68
  875. package/helpers/RectAreaLightHelper.mjs +0 -44
  876. package/helpers/VertexNormalsHelper.mjs +0 -54
  877. package/helpers/VertexTangentsHelper.mjs +0 -45
  878. package/index.mjs +0 -969
  879. package/interactive/SelectionBox.mjs +0 -137
  880. package/interactive/SelectionHelper.mjs +0 -54
  881. package/libs/MeshoptDecoder.mjs +0 -210
  882. package/libs/MotionControllers.mjs +0 -261
  883. package/lights/LightProbeGenerator.mjs +0 -145
  884. package/lights/RectAreaLightUniformsLib.mjs +0 -32842
  885. package/lines/Line2.mjs +0 -13
  886. package/lines/LineGeometry.mjs +0 -44
  887. package/lines/LineMaterial.mjs +0 -539
  888. package/lines/LineSegments2.mjs +0 -202
  889. package/lines/LineSegmentsGeometry.mjs +0 -124
  890. package/lines/Wireframe.mjs +0 -31
  891. package/lines/WireframeGeometry2.mjs +0 -13
  892. package/loaders/3DMLoader.mjs +0 -802
  893. package/loaders/3MFLoader.mjs +0 -837
  894. package/loaders/AMFLoader.mjs +0 -284
  895. package/loaders/AssimpLoader.mjs +0 -1396
  896. package/loaders/BVHLoader.mjs +0 -207
  897. package/loaders/BasisTextureLoader.mjs +0 -474
  898. package/loaders/ColladaLoader.mjs +0 -2403
  899. package/loaders/DDSLoader.mjs +0 -148
  900. package/loaders/DRACOLoader.mjs +0 -340
  901. package/loaders/EXRLoader.mjs +0 -1351
  902. package/loaders/FBXLoader.mjs +0 -2362
  903. package/loaders/FontLoader.mjs +0 -111
  904. package/loaders/GCodeLoader.mjs +0 -141
  905. package/loaders/GLTFLoader.mjs +0 -2316
  906. package/loaders/HDRCubeTextureLoader.mjs +0 -77
  907. package/loaders/KMZLoader.mjs +0 -75
  908. package/loaders/KTX2Loader.mjs +0 -427
  909. package/loaders/KTXLoader.mjs +0 -87
  910. package/loaders/LDrawLoader.mjs +0 -1409
  911. package/loaders/LUT3dlLoader.mjs +0 -100
  912. package/loaders/LUTCubeLoader.mjs +0 -104
  913. package/loaders/LWOLoader.mjs +0 -625
  914. package/loaders/LottieLoader.mjs +0 -47
  915. package/loaders/MD2Loader.mjs +0 -359
  916. package/loaders/MDDLoader.mjs +0 -58
  917. package/loaders/MMDLoader.mjs +0 -998
  918. package/loaders/MTLLoader.mjs +0 -280
  919. package/loaders/NRRDLoader.mjs +0 -401
  920. package/loaders/NodeMaterialLoader.mjs +0 -146
  921. package/loaders/OBJLoader.mjs +0 -487
  922. package/loaders/PCDLoader.mjs +0 -248
  923. package/loaders/PDBLoader.mjs +0 -246
  924. package/loaders/PLYLoader.mjs +0 -317
  925. package/loaders/PRWMLoader.mjs +0 -160
  926. package/loaders/PVRLoader.mjs +0 -131
  927. package/loaders/RGBELoader.mjs +0 -244
  928. package/loaders/RGBMLoader.mjs +0 -998
  929. package/loaders/STLLoader.mjs +0 -190
  930. package/loaders/SVGLoader.mjs +0 -1709
  931. package/loaders/TDSLoader.mjs +0 -480
  932. package/loaders/TGALoader.mjs +0 -285
  933. package/loaders/TTFLoader.mjs +0 -131
  934. package/loaders/TiltLoader.mjs +0 -373
  935. package/loaders/VOXLoader.mjs +0 -431
  936. package/loaders/VRMLLoader.mjs +0 -2093
  937. package/loaders/VRMLoader.mjs +0 -38
  938. package/loaders/VTKLoader.mjs +0 -646
  939. package/loaders/XLoader.mjs +0 -1258
  940. package/loaders/XYZLoader.mjs +0 -60
  941. package/loaders/lwo/IFFParser.mjs +0 -697
  942. package/loaders/lwo/LWO2Parser.mjs +0 -327
  943. package/loaders/lwo/LWO3Parser.mjs +0 -298
  944. package/math/Capsule.mjs +0 -100
  945. package/math/ColorConverter.mjs +0 -51
  946. package/math/ConvexHull.mjs +0 -574
  947. package/math/ImprovedNoise.mjs +0 -302
  948. package/math/Lut.mjs +0 -135
  949. package/math/MeshSurfaceSampler.mjs +0 -107
  950. package/math/OBB.mjs +0 -235
  951. package/math/Octree.mjs +0 -278
  952. package/math/SimplexNoise.mjs +0 -425
  953. package/misc/ConvexObjectBreaker.mjs +0 -292
  954. package/misc/GPUComputationRenderer.mjs +0 -171
  955. package/misc/Gyroscope.mjs +0 -35
  956. package/misc/MD2Character.mjs +0 -162
  957. package/misc/MD2CharacterComplex.mjs +0 -328
  958. package/misc/MorphAnimMesh.mjs +0 -40
  959. package/misc/MorphBlendMesh.mjs +0 -179
  960. package/misc/ProgressiveLightmap.mjs +0 -166
  961. package/misc/RollerCoaster.mjs +0 -346
  962. package/misc/TubePainter.mjs +0 -123
  963. package/misc/Volume.mjs +0 -244
  964. package/misc/VolumeSlice.mjs +0 -106
  965. package/misc/WebGL.mjs +0 -74
  966. package/modifiers/CurveModifier.mjs +0 -182
  967. package/modifiers/EdgeSplitModifier.mjs +0 -162
  968. package/modifiers/SimplifyModifier.mjs +0 -282
  969. package/modifiers/TessellateModifier.mjs +0 -206
  970. package/nodes/Nodes.mjs +0 -400
  971. package/nodes/ShaderNode.mjs +0 -408
  972. package/nodes/accessors/BufferNode.mjs +0 -15
  973. package/nodes/accessors/CameraNode.mjs +0 -44
  974. package/nodes/accessors/CubeTextureNode.mjs +0 -42
  975. package/nodes/accessors/MaterialNode.mjs +0 -71
  976. package/nodes/accessors/MaterialReferenceNode.mjs +0 -14
  977. package/nodes/accessors/ModelNode.mjs +0 -9
  978. package/nodes/accessors/ModelViewProjectionNode.mjs +0 -24
  979. package/nodes/accessors/NormalNode.mjs +0 -62
  980. package/nodes/accessors/Object3DNode.mjs +0 -76
  981. package/nodes/accessors/PointUVNode.mjs +0 -13
  982. package/nodes/accessors/PositionNode.mjs +0 -65
  983. package/nodes/accessors/ReferenceNode.mjs +0 -37
  984. package/nodes/accessors/ReflectNode.mjs +0 -43
  985. package/nodes/accessors/SkinningNode.mjs +0 -58
  986. package/nodes/accessors/TextureNode.mjs +0 -54
  987. package/nodes/accessors/UVNode.mjs +0 -23
  988. package/nodes/core/ArrayUniformNode.mjs +0 -14
  989. package/nodes/core/AttributeNode.mjs +0 -30
  990. package/nodes/core/BypassNode.mjs +0 -22
  991. package/nodes/core/CodeNode.mjs +0 -28
  992. package/nodes/core/ConstNode.mjs +0 -14
  993. package/nodes/core/ContextNode.mjs +0 -22
  994. package/nodes/core/ExpressionNode.mjs +0 -19
  995. package/nodes/core/FunctionCallNode.mjs +0 -37
  996. package/nodes/core/FunctionNode.mjs +0 -56
  997. package/nodes/core/InputNode.mjs +0 -38
  998. package/nodes/core/Node.mjs +0 -139
  999. package/nodes/core/NodeAttribute.mjs +0 -10
  1000. package/nodes/core/NodeBuilder.mjs +0 -395
  1001. package/nodes/core/NodeCode.mjs +0 -11
  1002. package/nodes/core/NodeFrame.mjs +0 -35
  1003. package/nodes/core/NodeFunctionInput.mjs +0 -13
  1004. package/nodes/core/NodeKeywords.mjs +0 -44
  1005. package/nodes/core/NodeUniform.mjs +0 -18
  1006. package/nodes/core/NodeUtils.mjs +0 -57
  1007. package/nodes/core/NodeVar.mjs +0 -10
  1008. package/nodes/core/NodeVary.mjs +0 -10
  1009. package/nodes/core/PropertyNode.mjs +0 -21
  1010. package/nodes/core/TempNode.mjs +0 -25
  1011. package/nodes/core/UniformNode.mjs +0 -23
  1012. package/nodes/core/VarNode.mjs +0 -31
  1013. package/nodes/core/VaryNode.mjs +0 -30
  1014. package/nodes/core/constants.mjs +0 -24
  1015. package/nodes/display/ColorSpaceNode.mjs +0 -63
  1016. package/nodes/display/NormalMapNode.mjs +0 -54
  1017. package/nodes/fog/FogNode.mjs +0 -15
  1018. package/nodes/fog/FogRangeNode.mjs +0 -17
  1019. package/nodes/functions/BSDFs.mjs +0 -64
  1020. package/nodes/lights/LightContextNode.mjs +0 -35
  1021. package/nodes/lights/LightNode.mjs +0 -58
  1022. package/nodes/lights/LightsNode.mjs +0 -59
  1023. package/nodes/loaders/NodeLoader.mjs +0 -66
  1024. package/nodes/loaders/NodeMaterialLoader.mjs +0 -24
  1025. package/nodes/loaders/NodeObjectLoader.mjs +0 -40
  1026. package/nodes/materials/LineBasicNodeMaterial.mjs +0 -27
  1027. package/nodes/materials/Materials.mjs +0 -28
  1028. package/nodes/materials/MeshBasicNodeMaterial.mjs +0 -28
  1029. package/nodes/materials/MeshStandardNodeMaterial.mjs +0 -41
  1030. package/nodes/materials/NodeMaterial.mjs +0 -64
  1031. package/nodes/materials/PointsNodeMaterial.mjs +0 -30
  1032. package/nodes/math/CondNode.mjs +0 -38
  1033. package/nodes/math/MathNode.mjs +0 -163
  1034. package/nodes/math/OperatorNode.mjs +0 -103
  1035. package/nodes/procedural/CheckerNode.mjs +0 -21
  1036. package/nodes/utils/ArrayElementNode.mjs +0 -19
  1037. package/nodes/utils/ConvertNode.mjs +0 -25
  1038. package/nodes/utils/JoinNode.mjs +0 -26
  1039. package/nodes/utils/MatcapUVNode.mjs +0 -16
  1040. package/nodes/utils/OscNode.mjs +0 -50
  1041. package/nodes/utils/SplitNode.mjs +0 -45
  1042. package/nodes/utils/SpriteSheetUVNode.mjs +0 -40
  1043. package/nodes/utils/TimerNode.mjs +0 -44
  1044. package/objects/GroundProjectedEnv.mjs +0 -130
  1045. package/objects/Lensflare.mjs +0 -262
  1046. package/objects/LightningStorm.mjs +0 -110
  1047. package/objects/MarchingCubes.mjs +0 -457
  1048. package/objects/Reflector.mjs +0 -166
  1049. package/objects/ReflectorForSSRPass.mjs +0 -247
  1050. package/objects/ReflectorRTT.mjs +0 -10
  1051. package/objects/Refractor.mjs +0 -178
  1052. package/objects/ShadowMesh.mjs +0 -41
  1053. package/objects/Sky.mjs +0 -124
  1054. package/objects/Water.mjs +0 -235
  1055. package/objects/Water2.mjs +0 -252
  1056. package/offscreen/jank.mjs +0 -27
  1057. package/offscreen/offscreen.mjs +0 -5
  1058. package/offscreen/scene.mjs +0 -52
  1059. package/physics/AmmoPhysics.mjs +0 -165
  1060. package/postprocessing/AdaptiveToneMappingPass.mjs +0 -221
  1061. package/postprocessing/AfterimagePass.mjs +0 -55
  1062. package/postprocessing/BloomPass.mjs +0 -90
  1063. package/postprocessing/BokehPass.mjs +0 -76
  1064. package/postprocessing/ClearPass.mjs +0 -27
  1065. package/postprocessing/CubeTexturePass.mjs +0 -49
  1066. package/postprocessing/DotScreenPass.mjs +0 -40
  1067. package/postprocessing/EffectComposer.mjs +0 -139
  1068. package/postprocessing/FilmPass.mjs +0 -42
  1069. package/postprocessing/GlitchPass.mjs +0 -75
  1070. package/postprocessing/HalftonePass.mjs +0 -44
  1071. package/postprocessing/LUTPass.mjs +0 -136
  1072. package/postprocessing/MaskPass.mjs +0 -60
  1073. package/postprocessing/OutlinePass.mjs +0 -438
  1074. package/postprocessing/Pass.mjs +0 -37
  1075. package/postprocessing/RenderPass.mjs +0 -48
  1076. package/postprocessing/RenderPixelatedPass.mjs +0 -199
  1077. package/postprocessing/SAOPass.mjs +0 -282
  1078. package/postprocessing/SMAAPass.mjs +0 -112
  1079. package/postprocessing/SSAARenderPass.mjs +0 -170
  1080. package/postprocessing/SSAOPass.mjs +0 -265
  1081. package/postprocessing/SSRPass.mjs +0 -432
  1082. package/postprocessing/SavePass.mjs +0 -37
  1083. package/postprocessing/ShaderPass.mjs +0 -39
  1084. package/postprocessing/TAARenderPass.mjs +0 -88
  1085. package/postprocessing/TexturePass.mjs +0 -39
  1086. package/postprocessing/UnrealBloomPass.mjs +0 -220
  1087. package/renderers/CSS2DRenderer.mjs +0 -112
  1088. package/renderers/CSS3DRenderer.mjs +0 -133
  1089. package/renderers/Projector.mjs +0 -511
  1090. package/renderers/SVGRenderer.mjs +0 -306
  1091. package/renderers/nodes/accessors/CameraNode.mjs +0 -63
  1092. package/renderers/nodes/accessors/ModelNode.mjs +0 -61
  1093. package/renderers/nodes/accessors/ModelViewProjectionNode.mjs +0 -21
  1094. package/renderers/nodes/accessors/NormalNode.mjs +0 -61
  1095. package/renderers/nodes/accessors/PositionNode.mjs +0 -30
  1096. package/renderers/nodes/accessors/UVNode.mjs +0 -13
  1097. package/renderers/nodes/core/AttributeNode.mjs +0 -35
  1098. package/renderers/nodes/core/InputNode.mjs +0 -31
  1099. package/renderers/nodes/core/Node.mjs +0 -34
  1100. package/renderers/nodes/core/NodeAttribute.mjs +0 -10
  1101. package/renderers/nodes/core/NodeBuilder.mjs +0 -243
  1102. package/renderers/nodes/core/NodeFrame.mjs +0 -35
  1103. package/renderers/nodes/core/NodeSlot.mjs +0 -10
  1104. package/renderers/nodes/core/NodeUniform.mjs +0 -18
  1105. package/renderers/nodes/core/NodeVary.mjs +0 -11
  1106. package/renderers/nodes/core/VaryNode.mjs +0 -22
  1107. package/renderers/nodes/core/constants.mjs +0 -22
  1108. package/renderers/nodes/inputs/ColorNode.mjs +0 -11
  1109. package/renderers/nodes/inputs/FloatNode.mjs +0 -11
  1110. package/renderers/nodes/inputs/Matrix3Node.mjs +0 -12
  1111. package/renderers/nodes/inputs/Matrix4Node.mjs +0 -12
  1112. package/renderers/nodes/inputs/TextureNode.mjs +0 -20
  1113. package/renderers/nodes/inputs/Vector2Node.mjs +0 -11
  1114. package/renderers/nodes/inputs/Vector3Node.mjs +0 -12
  1115. package/renderers/nodes/inputs/Vector4Node.mjs +0 -12
  1116. package/renderers/nodes/math/MathNode.mjs +0 -55
  1117. package/renderers/nodes/math/OperatorNode.mjs +0 -42
  1118. package/renderers/nodes/utils/SwitchNode.mjs +0 -20
  1119. package/renderers/nodes/utils/TimerNode.mjs +0 -14
  1120. package/renderers/webgpu/WebGPU.mjs +0 -24
  1121. package/renderers/webgpu/WebGPUAttributes.mjs +0 -69
  1122. package/renderers/webgpu/WebGPUBackground.mjs +0 -61
  1123. package/renderers/webgpu/WebGPUBinding.mjs +0 -14
  1124. package/renderers/webgpu/WebGPUBindings.mjs +0 -155
  1125. package/renderers/webgpu/WebGPUComputePipelines.mjs +0 -44
  1126. package/renderers/webgpu/WebGPUGeometries.mjs +0 -41
  1127. package/renderers/webgpu/WebGPUInfo.mjs +0 -46
  1128. package/renderers/webgpu/WebGPUObjects.mjs +0 -25
  1129. package/renderers/webgpu/WebGPUProperties.mjs +0 -22
  1130. package/renderers/webgpu/WebGPURenderLists.mjs +0 -119
  1131. package/renderers/webgpu/WebGPURenderPipelines.mjs +0 -545
  1132. package/renderers/webgpu/WebGPURenderer.mjs +0 -574
  1133. package/renderers/webgpu/WebGPUSampledTexture.mjs +0 -40
  1134. package/renderers/webgpu/WebGPUSampler.mjs +0 -15
  1135. package/renderers/webgpu/WebGPUStorageBuffer.mjs +0 -15
  1136. package/renderers/webgpu/WebGPUTextureRenderer.mjs +0 -23
  1137. package/renderers/webgpu/WebGPUTextureUtils.mjs +0 -98
  1138. package/renderers/webgpu/WebGPUTextures.mjs +0 -484
  1139. package/renderers/webgpu/WebGPUUniform.mjs +0 -81
  1140. package/renderers/webgpu/WebGPUUniformsGroup.mjs +0 -176
  1141. package/renderers/webgpu/constants.mjs +0 -230
  1142. package/renderers/webgpu/nodes/ShaderLib.mjs +0 -42
  1143. package/renderers/webgpu/nodes/WebGPUNodeBuilder.mjs +0 -165
  1144. package/renderers/webgpu/nodes/WebGPUNodeUniform.mjs +0 -73
  1145. package/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.mjs +0 -15
  1146. package/renderers/webgpu/nodes/WebGPUNodes.mjs +0 -40
  1147. package/shaders/ACESFilmicToneMappingShader.mjs +0 -48
  1148. package/shaders/AfterimageShader.mjs +0 -32
  1149. package/shaders/BasicShader.mjs +0 -12
  1150. package/shaders/BleachBypassShader.mjs +0 -35
  1151. package/shaders/BlendShader.mjs +0 -30
  1152. package/shaders/BokehShader.mjs +0 -106
  1153. package/shaders/BokehShader2.mjs +0 -269
  1154. package/shaders/BrightnessContrastShader.mjs +0 -32
  1155. package/shaders/ColorCorrectionShader.mjs +0 -30
  1156. package/shaders/ColorifyShader.mjs +0 -28
  1157. package/shaders/ConvolutionShader.mjs +0 -55
  1158. package/shaders/CopyShader.mjs +0 -25
  1159. package/shaders/DOFMipMapShader.mjs +0 -32
  1160. package/shaders/DepthLimitedBlurShader.mjs +0 -114
  1161. package/shaders/DigitalGlitch.mjs +0 -78
  1162. package/shaders/DotScreenShader.mjs +0 -39
  1163. package/shaders/FXAAShader.mjs +0 -1098
  1164. package/shaders/FilmShader.mjs +0 -42
  1165. package/shaders/FocusShader.mjs +0 -55
  1166. package/shaders/FreiChenShader.mjs +0 -61
  1167. package/shaders/FresnelShader.mjs +0 -47
  1168. package/shaders/GammaCorrectionShader.mjs +0 -23
  1169. package/shaders/GodRaysShader.mjs +0 -146
  1170. package/shaders/HalftoneShader.mjs +0 -212
  1171. package/shaders/HorizontalBlurShader.mjs +0 -43
  1172. package/shaders/HorizontalTiltShiftShader.mjs +0 -37
  1173. package/shaders/HueSaturationShader.mjs +0 -41
  1174. package/shaders/KaleidoShader.mjs +0 -34
  1175. package/shaders/LuminosityHighPassShader.mjs +0 -37
  1176. package/shaders/LuminosityShader.mjs +0 -25
  1177. package/shaders/MirrorShader.mjs +0 -35
  1178. package/shaders/NormalMapShader.mjs +0 -31
  1179. package/shaders/ParallaxShader.mjs +0 -113
  1180. package/shaders/PixelShader.mjs +0 -28
  1181. package/shaders/RGBShiftShader.mjs +0 -30
  1182. package/shaders/SAOShader.mjs +0 -144
  1183. package/shaders/SMAAShader.mjs +0 -272
  1184. package/shaders/SSAOShader.mjs +0 -172
  1185. package/shaders/SSRShader.mjs +0 -324
  1186. package/shaders/SepiaShader.mjs +0 -29
  1187. package/shaders/SobelOperatorShader.mjs +0 -44
  1188. package/shaders/SubsurfaceScatteringShader.mjs +0 -59
  1189. package/shaders/TechnicolorShader.mjs +0 -24
  1190. package/shaders/ToneMapShader.mjs +0 -48
  1191. package/shaders/ToonShader.mjs +0 -188
  1192. package/shaders/TriangleBlurShader.mjs +0 -36
  1193. package/shaders/UnpackDepthRGBAShader.mjs +0 -26
  1194. package/shaders/VerticalBlurShader.mjs +0 -44
  1195. package/shaders/VerticalTiltShiftShader.mjs +0 -37
  1196. package/shaders/VignetteShader.mjs +0 -28
  1197. package/shaders/VolumeShader.mjs +0 -178
  1198. package/shaders/WaterRefractionShader.mjs +0 -57
  1199. package/textures/FlakesTexture.mjs +0 -30
  1200. package/types/helpers.mjs +0 -4
  1201. package/utils/BufferGeometryUtils.mjs +0 -570
  1202. package/utils/GeometryCompressionUtils.mjs +0 -547
  1203. package/utils/GeometryUtils.mjs +0 -108
  1204. package/utils/RoughnessMipmapper.mjs +0 -213
  1205. package/utils/SceneUtils.mjs +0 -36
  1206. package/utils/ShadowMapViewer.mjs +0 -114
  1207. package/utils/SkeletonUtils.mjs +0 -292
  1208. package/utils/UVsDebug.mjs +0 -85
  1209. package/utils/WorkerPool.mjs +0 -62
  1210. package/webxr/ARButton.mjs +0 -119
  1211. package/webxr/OculusHandModel.mjs +0 -71
  1212. package/webxr/OculusHandPointerModel.mjs +0 -207
  1213. package/webxr/Text2D.mjs +0 -31
  1214. package/webxr/VRButton.mjs +0 -105
  1215. package/webxr/XRControllerModelFactory.mjs +0 -146
  1216. package/webxr/XREstimatedLight.mjs +0 -126
  1217. package/webxr/XRHandMeshModel.mjs +0 -73
  1218. package/webxr/XRHandModelFactory.mjs +0 -61
  1219. package/webxr/XRHandPrimitiveModel.mjs +0 -68
@@ -1,12 +1,15 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const THREE = require("three");
1
+ import { Vector3, Ray, Loader, FileLoader, MeshStandardMaterial, LineBasicMaterial, ShaderMaterial, UniformsUtils, UniformsLib, Color, BufferGeometry, BufferAttribute, LineSegments, Mesh, Matrix4, Group } from 'three';
2
+
3
+ // Note: "MATERIAL" tag (e.g. GLITTER, SPECKLE) is not implemented
4
+
4
5
  const FINISH_TYPE_DEFAULT = 0;
5
6
  const FINISH_TYPE_CHROME = 1;
6
7
  const FINISH_TYPE_PEARLESCENT = 2;
7
8
  const FINISH_TYPE_RUBBER = 3;
8
9
  const FINISH_TYPE_MATTE_METALLIC = 4;
9
- const FINISH_TYPE_METAL = 5;
10
+ const FINISH_TYPE_METAL = 5; // State machine to search a subobject path.
11
+ // The LDraw standard establishes these various possible subfolders.
12
+
10
13
  const FILE_LOCATION_AS_IS = 0;
11
14
  const FILE_LOCATION_TRY_PARTS = 1;
12
15
  const FILE_LOCATION_TRY_P = 2;
@@ -14,25 +17,27 @@ const FILE_LOCATION_TRY_MODELS = 3;
14
17
  const FILE_LOCATION_TRY_RELATIVE = 4;
15
18
  const FILE_LOCATION_TRY_ABSOLUTE = 5;
16
19
  const FILE_LOCATION_NOT_FOUND = 6;
17
- const MAIN_COLOUR_CODE = "16";
18
- const MAIN_EDGE_COLOUR_CODE = "24";
19
- const _tempVec0 = new THREE.Vector3();
20
- const _tempVec1 = new THREE.Vector3();
21
- class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
20
+ const MAIN_COLOUR_CODE = '16';
21
+ const MAIN_EDGE_COLOUR_CODE = '24';
22
+
23
+ const _tempVec0 = new Vector3();
24
+
25
+ const _tempVec1 = new Vector3();
26
+
27
+ class LDrawConditionalLineMaterial extends ShaderMaterial {
22
28
  constructor(parameters) {
23
29
  super({
24
- uniforms: THREE.UniformsUtils.merge([
25
- THREE.UniformsLib.fog,
26
- {
27
- diffuse: {
28
- value: new THREE.Color()
29
- },
30
- opacity: {
31
- value: 1
32
- }
30
+ uniforms: UniformsUtils.merge([UniformsLib.fog, {
31
+ diffuse: {
32
+ value: new Color()
33
+ },
34
+ opacity: {
35
+ value: 1.0
33
36
  }
34
- ]),
35
- vertexShader: `
37
+ }]),
38
+ vertexShader:
39
+ /* glsl */
40
+ `
36
41
  attribute vec3 control0;
37
42
  attribute vec3 control1;
38
43
  attribute vec3 direction;
@@ -80,7 +85,9 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
80
85
  #include <fog_vertex>
81
86
  }
82
87
  `,
83
- fragmentShader: `
88
+ fragmentShader:
89
+ /* glsl */
90
+ `
84
91
  uniform vec3 diffuse;
85
92
  uniform float opacity;
86
93
  varying float discardFlag;
@@ -110,15 +117,15 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
110
117
  });
111
118
  Object.defineProperties(this, {
112
119
  opacity: {
113
- get: function() {
120
+ get: function () {
114
121
  return this.uniforms.opacity.value;
115
122
  },
116
- set: function(value) {
123
+ set: function (value) {
117
124
  this.uniforms.opacity.value = value;
118
125
  }
119
126
  },
120
127
  color: {
121
- get: function() {
128
+ get: function () {
122
129
  return this.uniforms.diffuse.value;
123
130
  }
124
131
  }
@@ -126,13 +133,17 @@ class LDrawConditionalLineMaterial extends THREE.ShaderMaterial {
126
133
  this.setValues(parameters);
127
134
  this.isLDrawConditionalLineMaterial = true;
128
135
  }
136
+
129
137
  }
130
- class ConditionalLineSegments extends THREE.LineSegments {
138
+
139
+ class ConditionalLineSegments extends LineSegments {
131
140
  constructor(geometry, material) {
132
141
  super(geometry, material);
133
142
  this.isConditionalLine = true;
134
143
  }
144
+
135
145
  }
146
+
136
147
  function generateFaceNormals(faces) {
137
148
  for (let i = 0, l = faces.length; i < l; i++) {
138
149
  const face = faces[i];
@@ -140,179 +151,263 @@ function generateFaceNormals(faces) {
140
151
  const v0 = vertices[0];
141
152
  const v1 = vertices[1];
142
153
  const v2 = vertices[2];
154
+
143
155
  _tempVec0.subVectors(v1, v0);
156
+
144
157
  _tempVec1.subVectors(v2, v1);
145
- face.faceNormal = new THREE.Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
158
+
159
+ face.faceNormal = new Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
146
160
  }
147
161
  }
148
- const _ray = new THREE.Ray();
162
+
163
+ const _ray = new Ray();
164
+
149
165
  function smoothNormals(faces, lineSegments, checkSubSegments = false) {
150
- const hashMultiplier = (1 + 1e-10) * 100;
166
+ // NOTE: 1e2 is pretty coarse but was chosen to quantize the resulting value because
167
+ // it allows edges to be smoothed as expected (see minifig arms).
168
+ // --
169
+ // And the vector values are initialize multiplied by 1 + 1e-10 to account for floating
170
+ // point errors on vertices along quantization boundaries. Ie after matrix multiplication
171
+ // vertices that should be merged might be set to "1.7" and "1.6999..." meaning they won't
172
+ // get merged. This added epsilon attempts to push these error values to the same quantized
173
+ // value for the sake of hashing. See "AT-ST mini" dishes. See mrdoob/three#23169.
174
+ const hashMultiplier = (1 + 1e-10) * 1e2;
175
+
151
176
  function hashVertex(v) {
152
177
  const x = ~~(v.x * hashMultiplier);
153
178
  const y = ~~(v.y * hashMultiplier);
154
179
  const z = ~~(v.z * hashMultiplier);
155
180
  return `${x},${y},${z}`;
156
181
  }
182
+
157
183
  function hashEdge(v0, v1) {
158
184
  return `${hashVertex(v0)}_${hashVertex(v1)}`;
159
- }
185
+ } // converts the two vertices to a ray with a normalized direction and origin of 0, 0, 0 projected
186
+ // onto the original line.
187
+
188
+
160
189
  function toNormalizedRay(v0, v1, targetRay) {
161
190
  targetRay.direction.subVectors(v1, v0).normalize();
162
191
  const scalar = v0.dot(targetRay.direction);
163
192
  targetRay.origin.copy(v0).addScaledVector(targetRay.direction, -scalar);
164
193
  return targetRay;
165
194
  }
195
+
166
196
  function hashRay(ray) {
167
197
  return hashEdge(ray.origin, ray.direction);
168
198
  }
169
- const hardEdges = /* @__PURE__ */ new Set();
170
- const hardEdgeRays = /* @__PURE__ */ new Map();
199
+
200
+ const hardEdges = new Set();
201
+ const hardEdgeRays = new Map();
171
202
  const halfEdgeList = {};
172
- const normals = [];
203
+ const normals = []; // Save the list of hard edges by hash
204
+
173
205
  for (let i = 0, l = lineSegments.length; i < l; i++) {
174
206
  const ls = lineSegments[i];
175
207
  const vertices = ls.vertices;
176
208
  const v0 = vertices[0];
177
209
  const v1 = vertices[1];
178
210
  hardEdges.add(hashEdge(v0, v1));
179
- hardEdges.add(hashEdge(v1, v0));
211
+ hardEdges.add(hashEdge(v1, v0)); // only generate the hard edge ray map if we're checking subsegments because it's more expensive to check
212
+ // and requires more memory.
213
+
180
214
  if (checkSubSegments) {
181
- const ray = toNormalizedRay(v0, v1, new THREE.Ray());
215
+ // add both ray directions to the map
216
+ const ray = toNormalizedRay(v0, v1, new Ray());
182
217
  const rh1 = hashRay(ray);
218
+
183
219
  if (!hardEdgeRays.has(rh1)) {
184
220
  toNormalizedRay(v1, v0, ray);
185
221
  const rh2 = hashRay(ray);
186
- const info2 = {
222
+ const info = {
187
223
  ray,
188
224
  distances: []
189
225
  };
190
- hardEdgeRays.set(rh1, info2);
191
- hardEdgeRays.set(rh2, info2);
192
- }
226
+ hardEdgeRays.set(rh1, info);
227
+ hardEdgeRays.set(rh2, info);
228
+ } // store both segments ends in min, max order in the distances array to check if a face edge is a
229
+ // subsegment later.
230
+
231
+
193
232
  const info = hardEdgeRays.get(rh1);
194
233
  let d0 = info.ray.direction.dot(v0);
195
234
  let d1 = info.ray.direction.dot(v1);
235
+
196
236
  if (d0 > d1) {
197
- ;
198
237
  [d0, d1] = [d1, d0];
199
238
  }
239
+
200
240
  info.distances.push(d0, d1);
201
241
  }
202
- }
242
+ } // track the half edges associated with each triangle
243
+
244
+
203
245
  for (let i = 0, l = faces.length; i < l; i++) {
204
246
  const tri = faces[i];
205
247
  const vertices = tri.vertices;
206
248
  const vertCount = vertices.length;
249
+
207
250
  for (let i2 = 0; i2 < vertCount; i2++) {
208
251
  const index = i2;
209
252
  const next = (i2 + 1) % vertCount;
210
253
  const v0 = vertices[index];
211
254
  const v1 = vertices[next];
212
- const hash = hashEdge(v0, v1);
255
+ const hash = hashEdge(v0, v1); // don't add the triangle if the edge is supposed to be hard
256
+
213
257
  if (hardEdges.has(hash)) {
214
258
  continue;
215
- }
259
+ } // if checking subsegments then check to see if this edge lies on a hard edge ray and whether its within any ray bounds
260
+
261
+
216
262
  if (checkSubSegments) {
217
263
  toNormalizedRay(v0, v1, _ray);
218
264
  const rayHash = hashRay(_ray);
265
+
219
266
  if (hardEdgeRays.has(rayHash)) {
220
- const info2 = hardEdgeRays.get(rayHash);
221
- const { ray, distances } = info2;
267
+ const info = hardEdgeRays.get(rayHash);
268
+ const {
269
+ ray,
270
+ distances
271
+ } = info;
222
272
  let d0 = ray.direction.dot(v0);
223
273
  let d1 = ray.direction.dot(v1);
274
+
224
275
  if (d0 > d1) {
225
- ;
226
276
  [d0, d1] = [d1, d0];
227
- }
277
+ } // return early if the face edge is found to be a subsegment of a line edge meaning the edge will have "hard" normals
278
+
279
+
228
280
  let found = false;
229
- for (let i3 = 0, l2 = distances.length; i3 < l2; i3 += 2) {
230
- if (d0 >= distances[i3] && d1 <= distances[i3 + 1]) {
281
+
282
+ for (let i = 0, l = distances.length; i < l; i += 2) {
283
+ if (d0 >= distances[i] && d1 <= distances[i + 1]) {
231
284
  found = true;
232
285
  break;
233
286
  }
234
287
  }
288
+
235
289
  if (found) {
236
290
  continue;
237
291
  }
238
292
  }
239
293
  }
294
+
240
295
  const info = {
241
- index,
242
- tri
296
+ index: index,
297
+ tri: tri
243
298
  };
244
299
  halfEdgeList[hash] = info;
245
300
  }
246
- }
301
+ } // Iterate until we've tried to connect all faces to share normals
302
+
303
+
247
304
  while (true) {
305
+ // Stop if there are no more faces left
248
306
  let halfEdge = null;
307
+
249
308
  for (const key in halfEdgeList) {
250
309
  halfEdge = halfEdgeList[key];
251
310
  break;
252
311
  }
312
+
253
313
  if (halfEdge === null) {
254
314
  break;
255
- }
315
+ } // Exhaustively find all connected faces
316
+
317
+
256
318
  const queue = [halfEdge];
319
+
257
320
  while (queue.length > 0) {
321
+ // initialize all vertex normals in this triangle
258
322
  const tri = queue.pop().tri;
259
323
  const vertices = tri.vertices;
260
324
  const vertNormals = tri.normals;
261
- const faceNormal = tri.faceNormal;
325
+ const faceNormal = tri.faceNormal; // Check if any edge is connected to another triangle edge
326
+
262
327
  const vertCount = vertices.length;
328
+
263
329
  for (let i2 = 0; i2 < vertCount; i2++) {
264
330
  const index = i2;
265
331
  const next = (i2 + 1) % vertCount;
266
332
  const v0 = vertices[index];
267
- const v1 = vertices[next];
333
+ const v1 = vertices[next]; // delete this triangle from the list so it won't be found again
334
+
268
335
  const hash = hashEdge(v0, v1);
269
336
  delete halfEdgeList[hash];
270
337
  const reverseHash = hashEdge(v1, v0);
271
338
  const otherInfo = halfEdgeList[reverseHash];
339
+
272
340
  if (otherInfo) {
273
341
  const otherTri = otherInfo.tri;
274
342
  const otherIndex = otherInfo.index;
275
343
  const otherNormals = otherTri.normals;
276
344
  const otherVertCount = otherNormals.length;
277
- const otherFaceNormal = otherTri.faceNormal;
345
+ const otherFaceNormal = otherTri.faceNormal; // NOTE: If the angle between faces is > 67.5 degrees then assume it's
346
+ // hard edge. There are some cases where the line segments do not line up exactly
347
+ // with or span multiple triangle edges (see Lunar Vehicle wheels).
348
+
278
349
  if (Math.abs(otherTri.faceNormal.dot(tri.faceNormal)) < 0.25) {
279
350
  continue;
280
- }
351
+ } // if this triangle has already been traversed then it won't be in
352
+ // the halfEdgeList. If it has not then add it to the queue and delete
353
+ // it so it won't be found again.
354
+
355
+
281
356
  if (reverseHash in halfEdgeList) {
282
357
  queue.push(otherInfo);
283
358
  delete halfEdgeList[reverseHash];
284
- }
359
+ } // share the first normal
360
+
361
+
285
362
  const otherNext = (otherIndex + 1) % otherVertCount;
363
+
286
364
  if (vertNormals[index] && otherNormals[otherNext] && vertNormals[index] !== otherNormals[otherNext]) {
287
365
  otherNormals[otherNext].norm.add(vertNormals[index].norm);
288
366
  vertNormals[index].norm = otherNormals[otherNext].norm;
289
367
  }
368
+
290
369
  let sharedNormal1 = vertNormals[index] || otherNormals[otherNext];
370
+
291
371
  if (sharedNormal1 === null) {
292
- sharedNormal1 = { norm: new THREE.Vector3() };
372
+ // it's possible to encounter an edge of a triangle that has already been traversed meaning
373
+ // both edges already have different normals defined and shared. To work around this we create
374
+ // a wrapper object so when those edges are merged the normals can be updated everywhere.
375
+ sharedNormal1 = {
376
+ norm: new Vector3()
377
+ };
293
378
  normals.push(sharedNormal1.norm);
294
379
  }
380
+
295
381
  if (vertNormals[index] === null) {
296
382
  vertNormals[index] = sharedNormal1;
297
383
  sharedNormal1.norm.add(faceNormal);
298
384
  }
385
+
299
386
  if (otherNormals[otherNext] === null) {
300
387
  otherNormals[otherNext] = sharedNormal1;
301
388
  sharedNormal1.norm.add(otherFaceNormal);
302
- }
389
+ } // share the second normal
390
+
391
+
303
392
  if (vertNormals[next] && otherNormals[otherIndex] && vertNormals[next] !== otherNormals[otherIndex]) {
304
393
  otherNormals[otherIndex].norm.add(vertNormals[next].norm);
305
394
  vertNormals[next].norm = otherNormals[otherIndex].norm;
306
395
  }
396
+
307
397
  let sharedNormal2 = vertNormals[next] || otherNormals[otherIndex];
398
+
308
399
  if (sharedNormal2 === null) {
309
- sharedNormal2 = { norm: new THREE.Vector3() };
400
+ sharedNormal2 = {
401
+ norm: new Vector3()
402
+ };
310
403
  normals.push(sharedNormal2.norm);
311
404
  }
405
+
312
406
  if (vertNormals[next] === null) {
313
407
  vertNormals[next] = sharedNormal2;
314
408
  sharedNormal2.norm.add(faceNormal);
315
409
  }
410
+
316
411
  if (otherNormals[otherIndex] === null) {
317
412
  otherNormals[otherIndex] = sharedNormal2;
318
413
  sharedNormal2.norm.add(otherFaceNormal);
@@ -320,94 +415,119 @@ function smoothNormals(faces, lineSegments, checkSubSegments = false) {
320
415
  }
321
416
  }
322
417
  }
323
- }
418
+ } // The normals of each face have been added up so now we average them by normalizing the vector.
419
+
420
+
324
421
  for (let i = 0, l = normals.length; i < l; i++) {
325
422
  normals[i].normalize();
326
423
  }
327
424
  }
425
+
328
426
  function isPartType(type) {
329
- return type === "Part" || type === "Unofficial_Part";
427
+ return type === 'Part' || type === 'Unofficial_Part';
330
428
  }
429
+
331
430
  function isPrimitiveType(type) {
332
- return /primitive/i.test(type) || type === "Subpart";
431
+ return /primitive/i.test(type) || type === 'Subpart';
333
432
  }
433
+
334
434
  class LineParser {
335
435
  constructor(line, lineNumber) {
336
436
  this.line = line;
337
437
  this.lineLength = line.length;
338
438
  this.currentCharIndex = 0;
339
- this.currentChar = " ";
439
+ this.currentChar = ' ';
340
440
  this.lineNumber = lineNumber;
341
441
  }
442
+
342
443
  seekNonSpace() {
343
444
  while (this.currentCharIndex < this.lineLength) {
344
445
  this.currentChar = this.line.charAt(this.currentCharIndex);
345
- if (this.currentChar !== " " && this.currentChar !== " ") {
446
+
447
+ if (this.currentChar !== ' ' && this.currentChar !== '\t') {
346
448
  return;
347
449
  }
450
+
348
451
  this.currentCharIndex++;
349
452
  }
350
453
  }
454
+
351
455
  getToken() {
352
- const pos0 = this.currentCharIndex++;
456
+ const pos0 = this.currentCharIndex++; // Seek space
457
+
353
458
  while (this.currentCharIndex < this.lineLength) {
354
459
  this.currentChar = this.line.charAt(this.currentCharIndex);
355
- if (this.currentChar === " " || this.currentChar === " ") {
460
+
461
+ if (this.currentChar === ' ' || this.currentChar === '\t') {
356
462
  break;
357
463
  }
464
+
358
465
  this.currentCharIndex++;
359
466
  }
467
+
360
468
  const pos1 = this.currentCharIndex;
361
469
  this.seekNonSpace();
362
470
  return this.line.substring(pos0, pos1);
363
471
  }
472
+
364
473
  getVector() {
365
- return new THREE.Vector3(parseFloat(this.getToken()), parseFloat(this.getToken()), parseFloat(this.getToken()));
474
+ return new Vector3(parseFloat(this.getToken()), parseFloat(this.getToken()), parseFloat(this.getToken()));
366
475
  }
476
+
367
477
  getRemainingString() {
368
478
  return this.line.substring(this.currentCharIndex, this.lineLength);
369
479
  }
480
+
370
481
  isAtTheEnd() {
371
482
  return this.currentCharIndex >= this.lineLength;
372
483
  }
484
+
373
485
  setToEnd() {
374
486
  this.currentCharIndex = this.lineLength;
375
487
  }
488
+
376
489
  getLineNumberString() {
377
- return this.lineNumber >= 0 ? " at line " + this.lineNumber : "";
490
+ return this.lineNumber >= 0 ? ' at line ' + this.lineNumber : '';
378
491
  }
379
- }
492
+
493
+ } // Fetches and parses an intermediate representation of LDraw parts files.
494
+
495
+
380
496
  class LDrawParsedCache {
381
497
  constructor(loader) {
382
498
  this.loader = loader;
383
499
  this._cache = {};
384
500
  }
501
+
385
502
  cloneResult(original) {
386
- const result = {};
387
- result.faces = original.faces.map((face) => {
503
+ const result = {}; // vertices are transformed and normals computed before being converted to geometry
504
+ // so these pieces must be cloned.
505
+
506
+ result.faces = original.faces.map(face => {
388
507
  return {
389
508
  colorCode: face.colorCode,
390
509
  material: face.material,
391
- vertices: face.vertices.map((v) => v.clone()),
510
+ vertices: face.vertices.map(v => v.clone()),
392
511
  normals: face.normals.map(() => null),
393
512
  faceNormal: null
394
513
  };
395
514
  });
396
- result.conditionalSegments = original.conditionalSegments.map((face) => {
515
+ result.conditionalSegments = original.conditionalSegments.map(face => {
397
516
  return {
398
517
  colorCode: face.colorCode,
399
518
  material: face.material,
400
- vertices: face.vertices.map((v) => v.clone()),
401
- controlPoints: face.controlPoints.map((v) => v.clone())
519
+ vertices: face.vertices.map(v => v.clone()),
520
+ controlPoints: face.controlPoints.map(v => v.clone())
402
521
  };
403
522
  });
404
- result.lineSegments = original.lineSegments.map((face) => {
523
+ result.lineSegments = original.lineSegments.map(face => {
405
524
  return {
406
525
  colorCode: face.colorCode,
407
526
  material: face.material,
408
- vertices: face.vertices.map((v) => v.clone())
527
+ vertices: face.vertices.map(v => v.clone())
409
528
  };
410
- });
529
+ }); // none if this is subsequently modified
530
+
411
531
  result.type = original.type;
412
532
  result.category = original.category;
413
533
  result.keywords = original.keywords;
@@ -418,74 +538,95 @@ class LDrawParsedCache {
418
538
  result.group = null;
419
539
  return result;
420
540
  }
541
+
421
542
  async fetchData(fileName) {
422
543
  let triedLowerCase = false;
423
544
  let locationState = FILE_LOCATION_AS_IS;
545
+
424
546
  while (locationState !== FILE_LOCATION_NOT_FOUND) {
425
547
  let subobjectURL = fileName;
548
+
426
549
  switch (locationState) {
427
550
  case FILE_LOCATION_AS_IS:
428
551
  locationState = locationState + 1;
429
552
  break;
553
+
430
554
  case FILE_LOCATION_TRY_PARTS:
431
- subobjectURL = "parts/" + subobjectURL;
555
+ subobjectURL = 'parts/' + subobjectURL;
432
556
  locationState = locationState + 1;
433
557
  break;
558
+
434
559
  case FILE_LOCATION_TRY_P:
435
- subobjectURL = "p/" + subobjectURL;
560
+ subobjectURL = 'p/' + subobjectURL;
436
561
  locationState = locationState + 1;
437
562
  break;
563
+
438
564
  case FILE_LOCATION_TRY_MODELS:
439
- subobjectURL = "models/" + subobjectURL;
565
+ subobjectURL = 'models/' + subobjectURL;
440
566
  locationState = locationState + 1;
441
567
  break;
568
+
442
569
  case FILE_LOCATION_TRY_RELATIVE:
443
- subobjectURL = fileName.substring(0, fileName.lastIndexOf("/") + 1) + subobjectURL;
570
+ subobjectURL = fileName.substring(0, fileName.lastIndexOf('/') + 1) + subobjectURL;
444
571
  locationState = locationState + 1;
445
572
  break;
573
+
446
574
  case FILE_LOCATION_TRY_ABSOLUTE:
447
575
  if (triedLowerCase) {
576
+ // Try absolute path
448
577
  locationState = FILE_LOCATION_NOT_FOUND;
449
578
  } else {
579
+ // Next attempt is lower case
450
580
  fileName = fileName.toLowerCase();
451
581
  subobjectURL = fileName;
452
582
  triedLowerCase = true;
453
583
  locationState = FILE_LOCATION_AS_IS;
454
584
  }
585
+
455
586
  break;
456
587
  }
588
+
457
589
  const loader = this.loader;
458
- const fileLoader = new THREE.FileLoader(loader.manager);
590
+ const fileLoader = new FileLoader(loader.manager);
459
591
  fileLoader.setPath(loader.partsLibraryPath);
460
592
  fileLoader.setRequestHeader(loader.requestHeader);
461
593
  fileLoader.setWithCredentials(loader.withCredentials);
594
+
462
595
  try {
463
596
  const text = await fileLoader.loadAsync(subobjectURL);
464
597
  return text;
465
- } catch (e) {
598
+ } catch {
466
599
  continue;
467
600
  }
468
601
  }
602
+
469
603
  throw new Error('LDrawLoader: Subobject "' + fileName + '" could not be loaded.');
470
604
  }
605
+
471
606
  parse(text, fileName = null) {
472
- const loader = this.loader;
607
+ const loader = this.loader; // final results
608
+
473
609
  const faces = [];
474
610
  const lineSegments = [];
475
611
  const conditionalSegments = [];
476
612
  const subobjects = [];
477
613
  const materials = {};
478
- const getLocalMaterial = (colorCode) => {
614
+
615
+ const getLocalMaterial = colorCode => {
479
616
  return materials[colorCode] || null;
480
617
  };
481
- let type = "Model";
618
+
619
+ let type = 'Model';
482
620
  let category = null;
483
621
  let keywords = null;
484
- let totalFaces = 0;
485
- if (text.indexOf("\r\n") !== -1) {
486
- text = text.replace(/\r\n/g, "\n");
622
+ let totalFaces = 0; // split into lines
623
+
624
+ if (text.indexOf('\r\n') !== -1) {
625
+ // This is faster than String.split with regex that splits on both
626
+ text = text.replace(/\r\n/g, '\n');
487
627
  }
488
- const lines = text.split("\n");
628
+
629
+ const lines = text.split('\n');
489
630
  const numLines = lines.length;
490
631
  let parsingEmbeddedFiles = false;
491
632
  let currentEmbeddedFileName = null;
@@ -494,26 +635,35 @@ class LDrawParsedCache {
494
635
  let bfcCCW = true;
495
636
  let bfcInverted = false;
496
637
  let bfcCull = true;
497
- let startingConstructionStep = false;
638
+ let startingConstructionStep = false; // Parse all line commands
639
+
498
640
  for (let lineIndex = 0; lineIndex < numLines; lineIndex++) {
499
641
  const line = lines[lineIndex];
500
- if (line.length === 0)
501
- continue;
642
+ if (line.length === 0) continue;
643
+
502
644
  if (parsingEmbeddedFiles) {
503
- if (line.startsWith("0 FILE ")) {
504
- this.setData(currentEmbeddedFileName, currentEmbeddedText);
645
+ if (line.startsWith('0 FILE ')) {
646
+ // Save previous embedded file in the cache
647
+ this.setData(currentEmbeddedFileName, currentEmbeddedText); // New embedded text file
648
+
505
649
  currentEmbeddedFileName = line.substring(7);
506
- currentEmbeddedText = "";
650
+ currentEmbeddedText = '';
507
651
  } else {
508
- currentEmbeddedText += line + "\n";
652
+ currentEmbeddedText += line + '\n';
509
653
  }
654
+
510
655
  continue;
511
656
  }
657
+
512
658
  const lp = new LineParser(line, lineIndex + 1);
513
659
  lp.seekNonSpace();
660
+
514
661
  if (lp.isAtTheEnd()) {
662
+ // Empty line
515
663
  continue;
516
- }
664
+ } // Parse the line type
665
+
666
+
517
667
  const lineType = lp.getToken();
518
668
  let material;
519
669
  let colorCode;
@@ -521,80 +671,105 @@ class LDrawParsedCache {
521
671
  let ccw;
522
672
  let doubleSided;
523
673
  let v0, v1, v2, v3, c0, c1;
674
+
524
675
  switch (lineType) {
525
- case "0":
676
+ // Line type 0: Comment or META
677
+ case '0':
678
+ // Parse meta directive
526
679
  const meta = lp.getToken();
680
+
527
681
  if (meta) {
528
682
  switch (meta) {
529
- case "!LDRAW_ORG":
683
+ case '!LDRAW_ORG':
530
684
  type = lp.getToken();
531
685
  break;
532
- case "!COLOUR":
686
+
687
+ case '!COLOUR':
533
688
  material = loader.parseColorMetaDirective(lp);
689
+
534
690
  if (material) {
535
691
  materials[material.userData.code] = material;
536
692
  } else {
537
- console.warn("LDrawLoader: Error parsing material" + lp.getLineNumberString());
693
+ console.warn('LDrawLoader: Error parsing material' + lp.getLineNumberString());
538
694
  }
695
+
539
696
  break;
540
- case "!CATEGORY":
697
+
698
+ case '!CATEGORY':
541
699
  category = lp.getToken();
542
700
  break;
543
- case "!KEYWORDS":
544
- const newKeywords = lp.getRemainingString().split(",");
701
+
702
+ case '!KEYWORDS':
703
+ const newKeywords = lp.getRemainingString().split(',');
704
+
545
705
  if (newKeywords.length > 0) {
546
706
  if (!keywords) {
547
707
  keywords = [];
548
708
  }
549
- newKeywords.forEach(function(keyword) {
709
+
710
+ newKeywords.forEach(function (keyword) {
550
711
  keywords.push(keyword.trim());
551
712
  });
552
713
  }
714
+
553
715
  break;
554
- case "FILE":
716
+
717
+ case 'FILE':
555
718
  if (lineIndex > 0) {
719
+ // Start embedded text files parsing
556
720
  parsingEmbeddedFiles = true;
557
721
  currentEmbeddedFileName = lp.getRemainingString();
558
- currentEmbeddedText = "";
722
+ currentEmbeddedText = '';
559
723
  bfcCertified = false;
560
724
  bfcCCW = true;
561
725
  }
726
+
562
727
  break;
563
- case "BFC":
728
+
729
+ case 'BFC':
730
+ // Changes to the backface culling state
564
731
  while (!lp.isAtTheEnd()) {
565
732
  const token = lp.getToken();
733
+
566
734
  switch (token) {
567
- case "CERTIFY":
568
- case "NOCERTIFY":
569
- bfcCertified = token === "CERTIFY";
735
+ case 'CERTIFY':
736
+ case 'NOCERTIFY':
737
+ bfcCertified = token === 'CERTIFY';
570
738
  bfcCCW = true;
571
739
  break;
572
- case "CW":
573
- case "CCW":
574
- bfcCCW = token === "CCW";
740
+
741
+ case 'CW':
742
+ case 'CCW':
743
+ bfcCCW = token === 'CCW';
575
744
  break;
576
- case "INVERTNEXT":
745
+
746
+ case 'INVERTNEXT':
577
747
  bfcInverted = true;
578
748
  break;
579
- case "CLIP":
580
- case "NOCLIP":
581
- bfcCull = token === "CLIP";
749
+
750
+ case 'CLIP':
751
+ case 'NOCLIP':
752
+ bfcCull = token === 'CLIP';
582
753
  break;
754
+
583
755
  default:
584
756
  console.warn('THREE.LDrawLoader: BFC directive "' + token + '" is unknown.');
585
757
  break;
586
758
  }
587
759
  }
760
+
588
761
  break;
589
- case "STEP":
762
+
763
+ case 'STEP':
590
764
  startingConstructionStep = true;
591
765
  break;
592
- default:
593
- break;
594
766
  }
595
767
  }
768
+
596
769
  break;
597
- case "1":
770
+ // Line type 1: Sub-object file
771
+
772
+ case '1':
598
773
  colorCode = lp.getToken();
599
774
  material = getLocalMaterial(colorCode);
600
775
  const posX = parseFloat(lp.getToken());
@@ -609,40 +784,48 @@ class LDrawParsedCache {
609
784
  const m6 = parseFloat(lp.getToken());
610
785
  const m7 = parseFloat(lp.getToken());
611
786
  const m8 = parseFloat(lp.getToken());
612
- const matrix = new THREE.Matrix4().set(m0, m1, m2, posX, m3, m4, m5, posY, m6, m7, m8, posZ, 0, 0, 0, 1);
613
- let fileName2 = lp.getRemainingString().trim().replace(/\\/g, "/");
614
- if (loader.fileMap[fileName2]) {
615
- fileName2 = loader.fileMap[fileName2];
787
+ const matrix = new Matrix4().set(m0, m1, m2, posX, m3, m4, m5, posY, m6, m7, m8, posZ, 0, 0, 0, 1);
788
+ let fileName = lp.getRemainingString().trim().replace(/\\/g, '/');
789
+
790
+ if (loader.fileMap[fileName]) {
791
+ // Found the subobject path in the preloaded file path map
792
+ fileName = loader.fileMap[fileName];
616
793
  } else {
617
- if (fileName2.startsWith("s/")) {
618
- fileName2 = "parts/" + fileName2;
619
- } else if (fileName2.startsWith("48/")) {
620
- fileName2 = "p/" + fileName2;
794
+ // Standardized subfolders
795
+ if (fileName.startsWith('s/')) {
796
+ fileName = 'parts/' + fileName;
797
+ } else if (fileName.startsWith('48/')) {
798
+ fileName = 'p/' + fileName;
621
799
  }
622
800
  }
801
+
623
802
  subobjects.push({
624
- material,
625
- colorCode,
626
- matrix,
627
- fileName: fileName2,
803
+ material: material,
804
+ colorCode: colorCode,
805
+ matrix: matrix,
806
+ fileName: fileName,
628
807
  inverted: bfcInverted,
629
- startingConstructionStep
808
+ startingConstructionStep: startingConstructionStep
630
809
  });
631
810
  bfcInverted = false;
632
811
  break;
633
- case "2":
812
+ // Line type 2: Line segment
813
+
814
+ case '2':
634
815
  colorCode = lp.getToken();
635
816
  material = getLocalMaterial(colorCode);
636
817
  v0 = lp.getVector();
637
818
  v1 = lp.getVector();
638
819
  segment = {
639
- material,
640
- colorCode,
820
+ material: material,
821
+ colorCode: colorCode,
641
822
  vertices: [v0, v1]
642
823
  };
643
824
  lineSegments.push(segment);
644
825
  break;
645
- case "5":
826
+ // Line type 5: Conditional Line segment
827
+
828
+ case '5':
646
829
  colorCode = lp.getToken();
647
830
  material = getLocalMaterial(colorCode);
648
831
  v0 = lp.getVector();
@@ -650,18 +833,21 @@ class LDrawParsedCache {
650
833
  c0 = lp.getVector();
651
834
  c1 = lp.getVector();
652
835
  segment = {
653
- material,
654
- colorCode,
836
+ material: material,
837
+ colorCode: colorCode,
655
838
  vertices: [v0, v1],
656
839
  controlPoints: [c0, c1]
657
840
  };
658
841
  conditionalSegments.push(segment);
659
842
  break;
660
- case "3":
843
+ // Line type 3: Triangle
844
+
845
+ case '3':
661
846
  colorCode = lp.getToken();
662
847
  material = getLocalMaterial(colorCode);
663
848
  ccw = bfcCCW;
664
849
  doubleSided = !bfcCertified || !bfcCull;
850
+
665
851
  if (ccw === true) {
666
852
  v0 = lp.getVector();
667
853
  v1 = lp.getVector();
@@ -671,30 +857,36 @@ class LDrawParsedCache {
671
857
  v1 = lp.getVector();
672
858
  v0 = lp.getVector();
673
859
  }
860
+
674
861
  faces.push({
675
- material,
676
- colorCode,
862
+ material: material,
863
+ colorCode: colorCode,
677
864
  faceNormal: null,
678
865
  vertices: [v0, v1, v2],
679
866
  normals: [null, null, null]
680
867
  });
681
868
  totalFaces++;
869
+
682
870
  if (doubleSided === true) {
683
871
  faces.push({
684
- material,
685
- colorCode,
872
+ material: material,
873
+ colorCode: colorCode,
686
874
  faceNormal: null,
687
875
  vertices: [v2, v1, v0],
688
876
  normals: [null, null, null]
689
877
  });
690
878
  totalFaces++;
691
879
  }
880
+
692
881
  break;
693
- case "4":
882
+ // Line type 4: Quadrilateral
883
+
884
+ case '4':
694
885
  colorCode = lp.getToken();
695
886
  material = getLocalMaterial(colorCode);
696
887
  ccw = bfcCCW;
697
888
  doubleSided = !bfcCertified || !bfcCull;
889
+
698
890
  if (ccw === true) {
699
891
  v0 = lp.getVector();
700
892
  v1 = lp.getVector();
@@ -705,33 +897,41 @@ class LDrawParsedCache {
705
897
  v2 = lp.getVector();
706
898
  v1 = lp.getVector();
707
899
  v0 = lp.getVector();
708
- }
900
+ } // specifically place the triangle diagonal in the v0 and v1 slots so we can
901
+ // account for the doubling of vertices later when smoothing normals.
902
+
903
+
709
904
  faces.push({
710
- material,
711
- colorCode,
905
+ material: material,
906
+ colorCode: colorCode,
712
907
  faceNormal: null,
713
908
  vertices: [v0, v1, v2, v3],
714
909
  normals: [null, null, null, null]
715
910
  });
716
911
  totalFaces += 2;
912
+
717
913
  if (doubleSided === true) {
718
914
  faces.push({
719
- material,
720
- colorCode,
915
+ material: material,
916
+ colorCode: colorCode,
721
917
  faceNormal: null,
722
918
  vertices: [v3, v2, v1, v0],
723
919
  normals: [null, null, null, null]
724
920
  });
725
921
  totalFaces += 2;
726
922
  }
923
+
727
924
  break;
925
+
728
926
  default:
729
- throw new Error('LDrawLoader: Unknown line type "' + lineType + '"' + lp.getLineNumberString() + ".");
927
+ throw new Error('LDrawLoader: Unknown line type "' + lineType + '"' + lp.getLineNumberString() + '.');
730
928
  }
731
929
  }
930
+
732
931
  if (parsingEmbeddedFiles) {
733
932
  this.setData(currentEmbeddedFileName, currentEmbeddedText);
734
933
  }
934
+
735
935
  return {
736
936
  faces,
737
937
  conditionalSegments,
@@ -746,114 +946,155 @@ class LDrawParsedCache {
746
946
  fileName,
747
947
  group: null
748
948
  };
749
- }
949
+ } // returns an (optionally cloned) instance of the data
950
+
951
+
750
952
  getData(fileName, clone = true) {
751
953
  const key = fileName.toLowerCase();
752
954
  const result = this._cache[key];
955
+
753
956
  if (result === null || result instanceof Promise) {
754
957
  return null;
755
958
  }
959
+
756
960
  if (clone) {
757
961
  return this.cloneResult(result);
758
962
  } else {
759
963
  return result;
760
964
  }
761
- }
965
+ } // kicks off a fetch and parse of the requested data if it hasn't already been loaded. Returns when
966
+ // the data is ready to use and can be retrieved synchronously with "getData".
967
+
968
+
762
969
  async ensureDataLoaded(fileName) {
763
970
  const key = fileName.toLowerCase();
971
+
764
972
  if (!(key in this._cache)) {
765
- this._cache[key] = this.fetchData(fileName).then((text) => {
973
+ // replace the promise with a copy of the parsed data for immediate processing
974
+ this._cache[key] = this.fetchData(fileName).then(text => {
766
975
  const info = this.parse(text, fileName);
767
976
  this._cache[key] = info;
768
977
  return info;
769
978
  });
770
979
  }
980
+
771
981
  await this._cache[key];
772
- }
982
+ } // sets the data in the cache from parsed data
983
+
984
+
773
985
  setData(fileName, text) {
774
986
  const key = fileName.toLowerCase();
775
987
  this._cache[key] = this.parse(text, fileName);
776
988
  }
777
- }
989
+
990
+ } // returns the material for an associated color code. If the color code is 16 for a face or 24 for
991
+ // an edge then the passthroughColorCode is used.
992
+
993
+
778
994
  function getMaterialFromCode(colorCode, parentColorCode, materialHierarchy, forEdge) {
779
995
  const isPassthrough = !forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;
996
+
780
997
  if (isPassthrough) {
781
998
  colorCode = parentColorCode;
782
999
  }
1000
+
783
1001
  return materialHierarchy[colorCode] || null;
784
- }
1002
+ } // Class used to parse and build LDraw parts as three.js objects and cache them if they're a "Part" type.
1003
+
1004
+
785
1005
  class LDrawPartsGeometryCache {
786
1006
  constructor(loader) {
787
1007
  this.loader = loader;
788
1008
  this.parseCache = new LDrawParsedCache(loader);
789
1009
  this._cache = {};
790
- }
1010
+ } // Convert the given file information into a mesh by processing subobjects.
1011
+
1012
+
791
1013
  async processIntoMesh(info) {
792
1014
  const loader = this.loader;
793
1015
  const parseCache = this.parseCache;
794
- const faceMaterials = /* @__PURE__ */ new Set();
795
- const processInfoSubobjects = async (info2, subobject = null) => {
796
- const subobjects = info2.subobjects;
797
- const promises = [];
1016
+ const faceMaterials = new Set(); // Processes the part subobject information to load child parts and merge geometry onto part
1017
+ // piece object.
1018
+
1019
+ const processInfoSubobjects = async (info, subobject = null) => {
1020
+ const subobjects = info.subobjects;
1021
+ const promises = []; // Trigger load of all subobjects. If a subobject isn't a primitive then load it as a separate
1022
+ // group which lets instruction steps apply correctly.
1023
+
798
1024
  for (let i = 0, l = subobjects.length; i < l; i++) {
799
- const subobject2 = subobjects[i];
800
- const promise = parseCache.ensureDataLoaded(subobject2.fileName).then(() => {
801
- const subobjectInfo = parseCache.getData(subobject2.fileName, false);
1025
+ const subobject = subobjects[i];
1026
+ const promise = parseCache.ensureDataLoaded(subobject.fileName).then(() => {
1027
+ const subobjectInfo = parseCache.getData(subobject.fileName, false);
1028
+
802
1029
  if (!isPrimitiveType(subobjectInfo.type)) {
803
- return this.loadModel(subobject2.fileName).catch((error) => {
1030
+ return this.loadModel(subobject.fileName).catch(error => {
804
1031
  console.warn(error);
805
1032
  return null;
806
1033
  });
807
1034
  }
808
- return processInfoSubobjects(parseCache.getData(subobject2.fileName), subobject2);
1035
+
1036
+ return processInfoSubobjects(parseCache.getData(subobject.fileName), subobject);
809
1037
  });
810
1038
  promises.push(promise);
811
1039
  }
812
- const group2 = new THREE.Group();
813
- group2.userData.category = info2.category;
814
- group2.userData.keywords = info2.keywords;
815
- info2.group = group2;
1040
+
1041
+ const group = new Group();
1042
+ group.userData.category = info.category;
1043
+ group.userData.keywords = info.keywords;
1044
+ info.group = group;
816
1045
  const subobjectInfos = await Promise.all(promises);
1046
+
817
1047
  for (let i = 0, l = subobjectInfos.length; i < l; i++) {
818
- const subobject2 = info2.subobjects[i];
1048
+ const subobject = info.subobjects[i];
819
1049
  const subobjectInfo = subobjectInfos[i];
1050
+
820
1051
  if (subobjectInfo === null) {
1052
+ // the subobject failed to load
821
1053
  continue;
822
- }
1054
+ } // if the subobject was loaded as a separate group then apply the parent scopes materials
1055
+
1056
+
823
1057
  if (subobjectInfo.isGroup) {
824
1058
  const subobjectGroup = subobjectInfo;
825
- subobject2.matrix.decompose(subobjectGroup.position, subobjectGroup.quaternion, subobjectGroup.scale);
826
- subobjectGroup.userData.startingConstructionStep = subobject2.startingConstructionStep;
827
- subobjectGroup.name = subobject2.fileName;
828
- loader.applyMaterialsToMesh(subobjectGroup, subobject2.colorCode, info2.materials);
829
- group2.add(subobjectGroup);
1059
+ subobject.matrix.decompose(subobjectGroup.position, subobjectGroup.quaternion, subobjectGroup.scale);
1060
+ subobjectGroup.userData.startingConstructionStep = subobject.startingConstructionStep;
1061
+ subobjectGroup.name = subobject.fileName;
1062
+ loader.applyMaterialsToMesh(subobjectGroup, subobject.colorCode, info.materials);
1063
+ group.add(subobjectGroup);
830
1064
  continue;
831
- }
1065
+ } // add the subobject group if it has children in case it has both children and primitives
1066
+
1067
+
832
1068
  if (subobjectInfo.group.children.length) {
833
- group2.add(subobjectInfo.group);
834
- }
835
- const parentLineSegments = info2.lineSegments;
836
- const parentConditionalSegments = info2.conditionalSegments;
837
- const parentFaces = info2.faces;
1069
+ group.add(subobjectInfo.group);
1070
+ } // transform the primitives into the local space of the parent piece and append them to
1071
+ // to the parent primitives list.
1072
+
1073
+
1074
+ const parentLineSegments = info.lineSegments;
1075
+ const parentConditionalSegments = info.conditionalSegments;
1076
+ const parentFaces = info.faces;
838
1077
  const lineSegments = subobjectInfo.lineSegments;
839
1078
  const conditionalSegments = subobjectInfo.conditionalSegments;
840
1079
  const faces = subobjectInfo.faces;
841
- const matrix = subobject2.matrix;
842
- const inverted = subobject2.inverted;
1080
+ const matrix = subobject.matrix;
1081
+ const inverted = subobject.inverted;
843
1082
  const matrixScaleInverted = matrix.determinant() < 0;
844
- const colorCode = subobject2.colorCode;
1083
+ const colorCode = subobject.colorCode;
845
1084
  const lineColorCode = colorCode === MAIN_COLOUR_CODE ? MAIN_EDGE_COLOUR_CODE : colorCode;
846
- for (let i2 = 0, l2 = lineSegments.length; i2 < l2; i2++) {
847
- const ls = lineSegments[i2];
1085
+
1086
+ for (let i = 0, l = lineSegments.length; i < l; i++) {
1087
+ const ls = lineSegments[i];
848
1088
  const vertices = ls.vertices;
849
1089
  vertices[0].applyMatrix4(matrix);
850
1090
  vertices[1].applyMatrix4(matrix);
851
1091
  ls.colorCode = ls.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : ls.colorCode;
852
- ls.material = ls.material || getMaterialFromCode(ls.colorCode, ls.colorCode, info2.materials, true);
1092
+ ls.material = ls.material || getMaterialFromCode(ls.colorCode, ls.colorCode, info.materials, true);
853
1093
  parentLineSegments.push(ls);
854
1094
  }
855
- for (let i2 = 0, l2 = conditionalSegments.length; i2 < l2; i2++) {
856
- const os = conditionalSegments[i2];
1095
+
1096
+ for (let i = 0, l = conditionalSegments.length; i < l; i++) {
1097
+ const os = conditionalSegments[i];
857
1098
  const vertices = os.vertices;
858
1099
  const controlPoints = os.controlPoints;
859
1100
  vertices[0].applyMatrix4(matrix);
@@ -861,54 +1102,77 @@ class LDrawPartsGeometryCache {
861
1102
  controlPoints[0].applyMatrix4(matrix);
862
1103
  controlPoints[1].applyMatrix4(matrix);
863
1104
  os.colorCode = os.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : os.colorCode;
864
- os.material = os.material || getMaterialFromCode(os.colorCode, os.colorCode, info2.materials, true);
1105
+ os.material = os.material || getMaterialFromCode(os.colorCode, os.colorCode, info.materials, true);
865
1106
  parentConditionalSegments.push(os);
866
1107
  }
867
- for (let i2 = 0, l2 = faces.length; i2 < l2; i2++) {
868
- const tri = faces[i2];
1108
+
1109
+ for (let i = 0, l = faces.length; i < l; i++) {
1110
+ const tri = faces[i];
869
1111
  const vertices = tri.vertices;
870
- for (let i3 = 0, l3 = vertices.length; i3 < l3; i3++) {
871
- vertices[i3].applyMatrix4(matrix);
1112
+
1113
+ for (let i = 0, l = vertices.length; i < l; i++) {
1114
+ vertices[i].applyMatrix4(matrix);
872
1115
  }
1116
+
873
1117
  tri.colorCode = tri.colorCode === MAIN_COLOUR_CODE ? colorCode : tri.colorCode;
874
- tri.material = tri.material || getMaterialFromCode(tri.colorCode, colorCode, info2.materials, false);
875
- faceMaterials.add(tri.colorCode);
1118
+ tri.material = tri.material || getMaterialFromCode(tri.colorCode, colorCode, info.materials, false);
1119
+ faceMaterials.add(tri.colorCode); // If the scale of the object is negated then the triangle winding order
1120
+ // needs to be flipped.
1121
+
876
1122
  if (matrixScaleInverted !== inverted) {
877
1123
  vertices.reverse();
878
1124
  }
1125
+
879
1126
  parentFaces.push(tri);
880
1127
  }
881
- info2.totalFaces += subobjectInfo.totalFaces;
882
- }
1128
+
1129
+ info.totalFaces += subobjectInfo.totalFaces;
1130
+ } // Apply the parent subobjects pass through material code to this object. This is done several times due
1131
+ // to material scoping.
1132
+
1133
+
883
1134
  if (subobject) {
884
- loader.applyMaterialsToMesh(group2, subobject.colorCode, info2.materials);
1135
+ loader.applyMaterialsToMesh(group, subobject.colorCode, info.materials);
885
1136
  }
886
- return info2;
887
- };
1137
+
1138
+ return info;
1139
+ }; // Track material use to see if we need to use the normal smooth slow path for hard edges.
1140
+
1141
+
888
1142
  for (let i = 0, l = info.faces; i < l; i++) {
889
1143
  faceMaterials.add(info.faces[i].colorCode);
890
1144
  }
1145
+
891
1146
  await processInfoSubobjects(info);
1147
+
892
1148
  if (loader.smoothNormals) {
893
1149
  const checkSubSegments = faceMaterials.size > 1;
894
1150
  generateFaceNormals(info.faces);
895
1151
  smoothNormals(info.faces, info.lineSegments, checkSubSegments);
896
- }
1152
+ } // Add the primitive objects and metadata.
1153
+
1154
+
897
1155
  const group = info.group;
1156
+
898
1157
  if (info.faces.length > 0) {
899
1158
  group.add(createObject(info.faces, 3, false, info.totalFaces));
900
1159
  }
1160
+
901
1161
  if (info.lineSegments.length > 0) {
902
1162
  group.add(createObject(info.lineSegments, 2));
903
1163
  }
1164
+
904
1165
  if (info.conditionalSegments.length > 0) {
905
1166
  group.add(createObject(info.conditionalSegments, 2, true));
906
1167
  }
1168
+
907
1169
  return group;
908
1170
  }
1171
+
909
1172
  hasCachedModel(fileName) {
910
1173
  return fileName !== null && fileName.toLowerCase() in this._cache;
911
1174
  }
1175
+
912
1176
  async getCachedModel(fileName) {
913
1177
  if (fileName !== null && this.hasCachedModel(fileName)) {
914
1178
  const key = fileName.toLowerCase();
@@ -917,61 +1181,90 @@ class LDrawPartsGeometryCache {
917
1181
  } else {
918
1182
  return null;
919
1183
  }
920
- }
1184
+ } // Loads and parses the model with the given file name. Returns a cached copy if available.
1185
+
1186
+
921
1187
  async loadModel(fileName) {
922
1188
  const parseCache = this.parseCache;
923
1189
  const key = fileName.toLowerCase();
1190
+
924
1191
  if (this.hasCachedModel(fileName)) {
1192
+ // Return cached model if available.
925
1193
  return this.getCachedModel(fileName);
926
1194
  } else {
1195
+ // Otherwise parse a new model.
1196
+ // Ensure the file data is loaded and pre parsed.
927
1197
  await parseCache.ensureDataLoaded(fileName);
928
1198
  const info = parseCache.getData(fileName);
929
- const promise = this.processIntoMesh(info);
1199
+ const promise = this.processIntoMesh(info); // Now that the file has loaded it's possible that another part parse has been waiting in parallel
1200
+ // so check the cache again to see if it's been added since the last async operation so we don't
1201
+ // do unnecessary work.
1202
+
930
1203
  if (this.hasCachedModel(fileName)) {
931
1204
  return this.getCachedModel(fileName);
932
- }
1205
+ } // Cache object if it's a part so it can be reused later.
1206
+
1207
+
933
1208
  if (isPartType(info.type)) {
934
1209
  this._cache[key] = promise;
935
- }
1210
+ } // return a copy
1211
+
1212
+
936
1213
  const group = await promise;
937
1214
  return group.clone();
938
1215
  }
939
- }
1216
+ } // parses the given model text into a renderable object. Returns cached copy if available.
1217
+
1218
+
940
1219
  async parseModel(text) {
941
1220
  const parseCache = this.parseCache;
942
1221
  const info = parseCache.parse(text);
1222
+
943
1223
  if (isPartType(info.type) && this.hasCachedModel(info.fileName)) {
944
1224
  return this.getCachedModel(info.fileName);
945
1225
  }
1226
+
946
1227
  return this.processIntoMesh(info);
947
1228
  }
1229
+
948
1230
  }
1231
+
949
1232
  function sortByMaterial(a, b) {
950
1233
  if (a.colorCode === b.colorCode) {
951
1234
  return 0;
952
1235
  }
1236
+
953
1237
  if (a.colorCode < b.colorCode) {
954
1238
  return -1;
955
1239
  }
1240
+
956
1241
  return 1;
957
1242
  }
1243
+
958
1244
  function createObject(elements, elementSize, isConditionalSegments = false, totalElements = null) {
1245
+ // Creates a LineSegments (elementSize = 2) or a Mesh (elementSize = 3 )
1246
+ // With per face / segment material, implemented with mesh groups and materials array
1247
+ // Sort the faces or line segments by color code to make later the mesh groups
959
1248
  elements.sort(sortByMaterial);
1249
+
960
1250
  if (totalElements === null) {
961
1251
  totalElements = elements.length;
962
1252
  }
1253
+
963
1254
  const positions = new Float32Array(elementSize * totalElements * 3);
964
1255
  const normals = elementSize === 3 ? new Float32Array(elementSize * totalElements * 3) : null;
965
1256
  const materials = [];
966
1257
  const quadArray = new Array(6);
967
- const bufferGeometry = new THREE.BufferGeometry();
1258
+ const bufferGeometry = new BufferGeometry();
968
1259
  let prevMaterial = null;
969
1260
  let index0 = 0;
970
1261
  let numGroupVerts = 0;
971
1262
  let offset = 0;
1263
+
972
1264
  for (let iElem = 0, nElem = elements.length; iElem < nElem; iElem++) {
973
1265
  const elem = elements[iElem];
974
1266
  let vertices = elem.vertices;
1267
+
975
1268
  if (vertices.length === 4) {
976
1269
  quadArray[0] = vertices[0];
977
1270
  quadArray[1] = vertices[1];
@@ -981,23 +1274,31 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
981
1274
  quadArray[5] = vertices[3];
982
1275
  vertices = quadArray;
983
1276
  }
1277
+
984
1278
  for (let j = 0, l = vertices.length; j < l; j++) {
985
1279
  const v = vertices[j];
986
1280
  const index = offset + j * 3;
987
1281
  positions[index + 0] = v.x;
988
1282
  positions[index + 1] = v.y;
989
1283
  positions[index + 2] = v.z;
990
- }
1284
+ } // create the normals array if this is a set of faces
1285
+
1286
+
991
1287
  if (elementSize === 3) {
992
1288
  if (!elem.faceNormal) {
993
1289
  const v0 = vertices[0];
994
1290
  const v1 = vertices[1];
995
1291
  const v2 = vertices[2];
1292
+
996
1293
  _tempVec0.subVectors(v1, v0);
1294
+
997
1295
  _tempVec1.subVectors(v2, v1);
998
- elem.faceNormal = new THREE.Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
1296
+
1297
+ elem.faceNormal = new Vector3().crossVectors(_tempVec0, _tempVec1).normalize();
999
1298
  }
1299
+
1000
1300
  let elemNormals = elem.normals;
1301
+
1001
1302
  if (elemNormals.length === 4) {
1002
1303
  quadArray[0] = elemNormals[0];
1003
1304
  quadArray[1] = elemNormals[1];
@@ -1007,22 +1308,29 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
1007
1308
  quadArray[5] = elemNormals[3];
1008
1309
  elemNormals = quadArray;
1009
1310
  }
1311
+
1010
1312
  for (let j = 0, l = elemNormals.length; j < l; j++) {
1313
+ // use face normal if a vertex normal is not provided
1011
1314
  let n = elem.faceNormal;
1315
+
1012
1316
  if (elemNormals[j]) {
1013
1317
  n = elemNormals[j].norm;
1014
1318
  }
1319
+
1015
1320
  const index = offset + j * 3;
1016
1321
  normals[index + 0] = n.x;
1017
1322
  normals[index + 1] = n.y;
1018
1323
  normals[index + 2] = n.z;
1019
1324
  }
1020
1325
  }
1326
+
1021
1327
  if (prevMaterial !== elem.colorCode) {
1022
1328
  if (prevMaterial !== null) {
1023
1329
  bufferGeometry.addGroup(index0, numGroupVerts, materials.length - 1);
1024
1330
  }
1331
+
1025
1332
  const material = elem.material;
1333
+
1026
1334
  if (material !== null) {
1027
1335
  if (elementSize === 3) {
1028
1336
  materials.push(material);
@@ -1038,38 +1346,49 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
1038
1346
  }
1039
1347
  }
1040
1348
  } else {
1349
+ // If a material has not been made available yet then keep the color code string in the material array
1350
+ // to save the spot for the material once a parent scopes materials are being applied to the object.
1041
1351
  materials.push(elem.colorCode);
1042
1352
  }
1353
+
1043
1354
  prevMaterial = elem.colorCode;
1044
1355
  index0 = offset / 3;
1045
1356
  numGroupVerts = vertices.length;
1046
1357
  } else {
1047
1358
  numGroupVerts += vertices.length;
1048
1359
  }
1360
+
1049
1361
  offset += 3 * vertices.length;
1050
1362
  }
1363
+
1051
1364
  if (numGroupVerts > 0) {
1052
1365
  bufferGeometry.addGroup(index0, Infinity, materials.length - 1);
1053
1366
  }
1054
- bufferGeometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
1367
+
1368
+ bufferGeometry.setAttribute('position', new BufferAttribute(positions, 3));
1369
+
1055
1370
  if (normals !== null) {
1056
- bufferGeometry.setAttribute("normal", new THREE.BufferAttribute(normals, 3));
1371
+ bufferGeometry.setAttribute('normal', new BufferAttribute(normals, 3));
1057
1372
  }
1373
+
1058
1374
  let object3d = null;
1375
+
1059
1376
  if (elementSize === 2) {
1060
1377
  if (isConditionalSegments) {
1061
1378
  object3d = new ConditionalLineSegments(bufferGeometry, materials.length === 1 ? materials[0] : materials);
1062
1379
  } else {
1063
- object3d = new THREE.LineSegments(bufferGeometry, materials.length === 1 ? materials[0] : materials);
1380
+ object3d = new LineSegments(bufferGeometry, materials.length === 1 ? materials[0] : materials);
1064
1381
  }
1065
1382
  } else if (elementSize === 3) {
1066
- object3d = new THREE.Mesh(bufferGeometry, materials.length === 1 ? materials[0] : materials);
1383
+ object3d = new Mesh(bufferGeometry, materials.length === 1 ? materials[0] : materials);
1067
1384
  }
1385
+
1068
1386
  if (isConditionalSegments) {
1069
1387
  object3d.isConditionalLine = true;
1070
1388
  const controlArray0 = new Float32Array(elements.length * 3 * 2);
1071
1389
  const controlArray1 = new Float32Array(elements.length * 3 * 2);
1072
1390
  const directionArray = new Float32Array(elements.length * 3 * 2);
1391
+
1073
1392
  for (let i = 0, l = elements.length; i < l; i++) {
1074
1393
  const os = elements[i];
1075
1394
  const vertices = os.vertices;
@@ -1098,29 +1417,41 @@ function createObject(elements, elementSize, isConditionalSegments = false, tota
1098
1417
  directionArray[index + 4] = v1.y - v0.y;
1099
1418
  directionArray[index + 5] = v1.z - v0.z;
1100
1419
  }
1101
- bufferGeometry.setAttribute("control0", new THREE.BufferAttribute(controlArray0, 3, false));
1102
- bufferGeometry.setAttribute("control1", new THREE.BufferAttribute(controlArray1, 3, false));
1103
- bufferGeometry.setAttribute("direction", new THREE.BufferAttribute(directionArray, 3, false));
1420
+
1421
+ bufferGeometry.setAttribute('control0', new BufferAttribute(controlArray0, 3, false));
1422
+ bufferGeometry.setAttribute('control1', new BufferAttribute(controlArray1, 3, false));
1423
+ bufferGeometry.setAttribute('direction', new BufferAttribute(directionArray, 3, false));
1104
1424
  }
1425
+
1105
1426
  return object3d;
1106
- }
1107
- class LDrawLoader extends THREE.Loader {
1427
+ } //
1428
+
1429
+
1430
+ class LDrawLoader extends Loader {
1108
1431
  constructor(manager) {
1109
- super(manager);
1432
+ super(manager); // Array of THREE.Material
1433
+
1110
1434
  this.materials = [];
1111
- this.materialLibrary = {};
1112
- this.partsCache = new LDrawPartsGeometryCache(this);
1113
- this.fileMap = {};
1114
- this.setMaterials([]);
1115
- this.smoothNormals = true;
1116
- this.partsLibraryPath = "";
1435
+ this.materialLibrary = {}; // This also allows to handle the embedded text files ("0 FILE" lines)
1436
+
1437
+ this.partsCache = new LDrawPartsGeometryCache(this); // This object is a map from file names to paths. It agilizes the paths search. If it is not set then files will be searched by trial and error.
1438
+
1439
+ this.fileMap = {}; // Initializes the materials library with default materials
1440
+
1441
+ this.setMaterials([]); // If this flag is set to true the vertex normals will be smoothed.
1442
+
1443
+ this.smoothNormals = true; // The path to load parts from the LDraw parts library from.
1444
+
1445
+ this.partsLibraryPath = '';
1117
1446
  }
1447
+
1118
1448
  setPartsLibraryPath(path) {
1119
1449
  this.partsLibraryPath = path;
1120
1450
  return this;
1121
1451
  }
1452
+
1122
1453
  async preloadMaterials(url) {
1123
- const fileLoader = new THREE.FileLoader(this.manager);
1454
+ const fileLoader = new FileLoader(this.manager);
1124
1455
  fileLoader.setPath(this.path);
1125
1456
  fileLoader.setRequestHeader(this.requestHeader);
1126
1457
  fileLoader.setWithCredentials(this.withCredentials);
@@ -1128,75 +1459,89 @@ class LDrawLoader extends THREE.Loader {
1128
1459
  const colorLineRegex = /^0 !COLOUR/;
1129
1460
  const lines = text.split(/[\n\r]/g);
1130
1461
  const materials = [];
1462
+
1131
1463
  for (let i = 0, l = lines.length; i < l; i++) {
1132
1464
  const line = lines[i];
1465
+
1133
1466
  if (colorLineRegex.test(line)) {
1134
- const directive = line.replace(colorLineRegex, "");
1467
+ const directive = line.replace(colorLineRegex, '');
1135
1468
  const material = this.parseColorMetaDirective(new LineParser(directive));
1136
1469
  materials.push(material);
1137
1470
  }
1138
1471
  }
1472
+
1139
1473
  this.setMaterials(materials);
1140
1474
  }
1475
+
1141
1476
  load(url, onLoad, onProgress, onError) {
1142
- const fileLoader = new THREE.FileLoader(this.manager);
1477
+ const fileLoader = new FileLoader(this.manager);
1143
1478
  fileLoader.setPath(this.path);
1144
1479
  fileLoader.setRequestHeader(this.requestHeader);
1145
1480
  fileLoader.setWithCredentials(this.withCredentials);
1146
- fileLoader.load(
1147
- url,
1148
- (text) => {
1149
- this.partsCache.parseModel(text, this.materialLibrary).then((group) => {
1150
- this.applyMaterialsToMesh(group, MAIN_COLOUR_CODE, this.materialLibrary, true);
1151
- this.computeConstructionSteps(group);
1152
- onLoad(group);
1153
- }).catch(onError);
1154
- },
1155
- onProgress,
1156
- onError
1157
- );
1481
+ fileLoader.load(url, text => {
1482
+ this.partsCache.parseModel(text, this.materialLibrary).then(group => {
1483
+ this.applyMaterialsToMesh(group, MAIN_COLOUR_CODE, this.materialLibrary, true);
1484
+ this.computeConstructionSteps(group);
1485
+ onLoad(group);
1486
+ }).catch(onError);
1487
+ }, onProgress, onError);
1158
1488
  }
1489
+
1159
1490
  parse(text, onLoad) {
1160
- this.partsCache.parseModel(text, this.materialLibrary).then((group) => {
1491
+ this.partsCache.parseModel(text, this.materialLibrary).then(group => {
1161
1492
  this.computeConstructionSteps(group);
1162
1493
  onLoad(group);
1163
1494
  });
1164
1495
  }
1496
+
1165
1497
  setMaterials(materials) {
1166
1498
  this.materialLibrary = {};
1167
1499
  this.materials = [];
1500
+
1168
1501
  for (let i = 0, l = materials.length; i < l; i++) {
1169
1502
  this.addMaterial(materials[i]);
1170
- }
1171
- this.addMaterial(this.parseColorMetaDirective(new LineParser("Main_Colour CODE 16 VALUE #FF8080 EDGE #333333")));
1172
- this.addMaterial(this.parseColorMetaDirective(new LineParser("Edge_Colour CODE 24 VALUE #A0A0A0 EDGE #333333")));
1503
+ } // Add default main triangle and line edge materials (used in pieces that can be colored with a main color)
1504
+
1505
+
1506
+ this.addMaterial(this.parseColorMetaDirective(new LineParser('Main_Colour CODE 16 VALUE #FF8080 EDGE #333333')));
1507
+ this.addMaterial(this.parseColorMetaDirective(new LineParser('Edge_Colour CODE 24 VALUE #A0A0A0 EDGE #333333')));
1173
1508
  return this;
1174
1509
  }
1510
+
1175
1511
  setFileMap(fileMap) {
1176
1512
  this.fileMap = fileMap;
1177
1513
  return this;
1178
1514
  }
1515
+
1179
1516
  addMaterial(material) {
1517
+ // Adds a material to the material library which is on top of the parse scopes stack. And also to the materials array
1180
1518
  const matLib = this.materialLibrary;
1519
+
1181
1520
  if (!matLib[material.userData.code]) {
1182
1521
  this.materials.push(material);
1183
1522
  matLib[material.userData.code] = material;
1184
1523
  }
1524
+
1185
1525
  return this;
1186
1526
  }
1527
+
1187
1528
  getMaterial(colorCode) {
1188
- if (colorCode.startsWith("0x2")) {
1529
+ if (colorCode.startsWith('0x2')) {
1530
+ // Special 'direct' material value (RGB color)
1189
1531
  const color = colorCode.substring(3);
1190
- return this.parseColorMetaDirective(
1191
- new LineParser("Direct_Color_" + color + " CODE -1 VALUE #" + color + " EDGE #" + color)
1192
- );
1532
+ return this.parseColorMetaDirective(new LineParser('Direct_Color_' + color + ' CODE -1 VALUE #' + color + ' EDGE #' + color + ''));
1193
1533
  }
1534
+
1194
1535
  return this.materialLibrary[colorCode] || null;
1195
- }
1536
+ } // Applies the appropriate materials to a prebuilt hierarchy of geometry. Assumes that color codes are present
1537
+ // in the material array if they need to be filled in.
1538
+
1539
+
1196
1540
  applyMaterialsToMesh(group, parentColorCode, materialHierarchy, finalMaterialPass = false) {
1541
+ // find any missing materials as indicated by a color code string and replace it with a material from the current material lib
1197
1542
  const loader = this;
1198
1543
  const parentIsPassthrough = parentColorCode === MAIN_COLOUR_CODE;
1199
- group.traverse((c) => {
1544
+ group.traverse(c => {
1200
1545
  if (c.isMesh || c.isLineSegments) {
1201
1546
  if (Array.isArray(c.material)) {
1202
1547
  for (let i = 0, l = c.material.length; i < l; i++) {
@@ -1208,177 +1553,259 @@ class LDrawLoader extends THREE.Loader {
1208
1553
  c.material = getMaterial(c, c.material);
1209
1554
  }
1210
1555
  }
1211
- });
1556
+ }); // Returns the appropriate material for the object (line or face) given color code. If the code is "pass through"
1557
+ // (24 for lines, 16 for edges) then the pass through color code is used. If that is also pass through then it's
1558
+ // simply returned for the subsequent material application.
1559
+
1212
1560
  function getMaterial(c, colorCode) {
1561
+ // if our parent is a passthrough color code and we don't have the current material color available then
1562
+ // return early.
1213
1563
  if (parentIsPassthrough && !(colorCode in materialHierarchy) && !finalMaterialPass) {
1214
1564
  return colorCode;
1215
1565
  }
1566
+
1216
1567
  const forEdge = c.isLineSegments || c.isConditionalLine;
1217
1568
  const isPassthrough = !forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;
1569
+
1218
1570
  if (isPassthrough) {
1219
1571
  colorCode = parentColorCode;
1220
1572
  }
1573
+
1221
1574
  let material = null;
1575
+
1222
1576
  if (colorCode in materialHierarchy) {
1223
1577
  material = materialHierarchy[colorCode];
1224
1578
  } else if (finalMaterialPass) {
1579
+ // see if we can get the final material from from the "getMaterial" function which will attempt to
1580
+ // parse the "direct" colors
1225
1581
  material = loader.getMaterial(colorCode);
1582
+
1226
1583
  if (material === null) {
1584
+ // otherwise throw an error if this is final opportunity to set the material
1227
1585
  throw new Error(`LDrawLoader: Material properties for code ${colorCode} not available.`);
1228
1586
  }
1229
1587
  } else {
1230
1588
  return colorCode;
1231
1589
  }
1590
+
1232
1591
  if (c.isLineSegments) {
1233
1592
  material = material.userData.edgeMaterial;
1593
+
1234
1594
  if (c.isConditionalLine) {
1235
1595
  material = material.userData.conditionalEdgeMaterial;
1236
1596
  }
1237
1597
  }
1598
+
1238
1599
  return material;
1239
1600
  }
1240
1601
  }
1602
+
1241
1603
  getMainMaterial() {
1242
1604
  return this.getMaterial(MAIN_COLOUR_CODE);
1243
1605
  }
1606
+
1244
1607
  getMainEdgeMaterial() {
1245
1608
  return this.getMaterial(MAIN_EDGE_COLOUR_CODE);
1246
1609
  }
1610
+
1247
1611
  parseColorMetaDirective(lineParser) {
1248
- let code = null;
1249
- let color = 16711935;
1250
- let edgeColor = 16711935;
1612
+ // Parses a color definition and returns a THREE.Material
1613
+ let code = null; // Triangle and line colors
1614
+
1615
+ let color = 0xff00ff;
1616
+ let edgeColor = 0xff00ff; // Transparency
1617
+
1251
1618
  let alpha = 1;
1252
- let isTransparent = false;
1619
+ let isTransparent = false; // Self-illumination:
1620
+
1253
1621
  let luminance = 0;
1254
1622
  let finishType = FINISH_TYPE_DEFAULT;
1255
1623
  let edgeMaterial = null;
1256
1624
  const name = lineParser.getToken();
1625
+
1257
1626
  if (!name) {
1258
- throw new Error(
1259
- 'LDrawLoader: Material name was expected after "!COLOUR tag' + lineParser.getLineNumberString() + "."
1260
- );
1261
- }
1627
+ throw new Error('LDrawLoader: Material name was expected after "!COLOUR tag' + lineParser.getLineNumberString() + '.');
1628
+ } // Parse tag tokens and their parameters
1629
+
1630
+
1262
1631
  let token = null;
1632
+
1263
1633
  while (true) {
1264
1634
  token = lineParser.getToken();
1635
+
1265
1636
  if (!token) {
1266
1637
  break;
1267
1638
  }
1639
+
1268
1640
  switch (token.toUpperCase()) {
1269
- case "CODE":
1641
+ case 'CODE':
1270
1642
  code = lineParser.getToken();
1271
1643
  break;
1272
- case "VALUE":
1644
+
1645
+ case 'VALUE':
1273
1646
  color = lineParser.getToken();
1274
- if (color.startsWith("0x")) {
1275
- color = "#" + color.substring(2);
1276
- } else if (!color.startsWith("#")) {
1277
- throw new Error(
1278
- "LDrawLoader: Invalid color while parsing material" + lineParser.getLineNumberString() + "."
1279
- );
1647
+
1648
+ if (color.startsWith('0x')) {
1649
+ color = '#' + color.substring(2);
1650
+ } else if (!color.startsWith('#')) {
1651
+ throw new Error('LDrawLoader: Invalid color while parsing material' + lineParser.getLineNumberString() + '.');
1280
1652
  }
1653
+
1281
1654
  break;
1282
- case "EDGE":
1655
+
1656
+ case 'EDGE':
1283
1657
  edgeColor = lineParser.getToken();
1284
- if (edgeColor.startsWith("0x")) {
1285
- edgeColor = "#" + edgeColor.substring(2);
1286
- } else if (!edgeColor.startsWith("#")) {
1658
+
1659
+ if (edgeColor.startsWith('0x')) {
1660
+ edgeColor = '#' + edgeColor.substring(2);
1661
+ } else if (!edgeColor.startsWith('#')) {
1662
+ // Try to see if edge color is a color code
1287
1663
  edgeMaterial = this.getMaterial(edgeColor);
1664
+
1288
1665
  if (!edgeMaterial) {
1289
- throw new Error(
1290
- "LDrawLoader: Invalid edge color while parsing material" + lineParser.getLineNumberString() + "."
1291
- );
1292
- }
1666
+ throw new Error('LDrawLoader: Invalid edge color while parsing material' + lineParser.getLineNumberString() + '.');
1667
+ } // Get the edge material for this triangle material
1668
+
1669
+
1293
1670
  edgeMaterial = edgeMaterial.userData.edgeMaterial;
1294
1671
  }
1672
+
1295
1673
  break;
1296
- case "ALPHA":
1674
+
1675
+ case 'ALPHA':
1297
1676
  alpha = parseInt(lineParser.getToken());
1677
+
1298
1678
  if (isNaN(alpha)) {
1299
- throw new Error(
1300
- "LDrawLoader: Invalid alpha value in material definition" + lineParser.getLineNumberString() + "."
1301
- );
1679
+ throw new Error('LDrawLoader: Invalid alpha value in material definition' + lineParser.getLineNumberString() + '.');
1302
1680
  }
1681
+
1303
1682
  alpha = Math.max(0, Math.min(1, alpha / 255));
1683
+
1304
1684
  if (alpha < 1) {
1305
1685
  isTransparent = true;
1306
1686
  }
1687
+
1307
1688
  break;
1308
- case "LUMINANCE":
1689
+
1690
+ case 'LUMINANCE':
1309
1691
  luminance = parseInt(lineParser.getToken());
1692
+
1310
1693
  if (isNaN(luminance)) {
1311
- throw new Error(
1312
- "LDrawLoader: Invalid luminance value in material definition" + LineParser.getLineNumberString() + "."
1313
- );
1694
+ throw new Error('LDrawLoader: Invalid luminance value in material definition' + LineParser.getLineNumberString() + '.');
1314
1695
  }
1696
+
1315
1697
  luminance = Math.max(0, Math.min(1, luminance / 255));
1316
1698
  break;
1317
- case "CHROME":
1699
+
1700
+ case 'CHROME':
1318
1701
  finishType = FINISH_TYPE_CHROME;
1319
1702
  break;
1320
- case "PEARLESCENT":
1703
+
1704
+ case 'PEARLESCENT':
1321
1705
  finishType = FINISH_TYPE_PEARLESCENT;
1322
1706
  break;
1323
- case "RUBBER":
1707
+
1708
+ case 'RUBBER':
1324
1709
  finishType = FINISH_TYPE_RUBBER;
1325
1710
  break;
1326
- case "MATTE_METALLIC":
1711
+
1712
+ case 'MATTE_METALLIC':
1327
1713
  finishType = FINISH_TYPE_MATTE_METALLIC;
1328
1714
  break;
1329
- case "METAL":
1715
+
1716
+ case 'METAL':
1330
1717
  finishType = FINISH_TYPE_METAL;
1331
1718
  break;
1332
- case "MATERIAL":
1719
+
1720
+ case 'MATERIAL':
1721
+ // Not implemented
1333
1722
  lineParser.setToEnd();
1334
1723
  break;
1724
+
1335
1725
  default:
1336
- throw new Error(
1337
- 'LDrawLoader: Unknown token "' + token + '" while parsing material' + lineParser.getLineNumberString() + "."
1338
- );
1726
+ throw new Error('LDrawLoader: Unknown token "' + token + '" while parsing material' + lineParser.getLineNumberString() + '.');
1339
1727
  }
1340
1728
  }
1729
+
1341
1730
  let material = null;
1731
+
1342
1732
  switch (finishType) {
1343
1733
  case FINISH_TYPE_DEFAULT:
1344
- material = new THREE.MeshStandardMaterial({ color, roughness: 0.3, metalness: 0 });
1734
+ material = new MeshStandardMaterial({
1735
+ color: color,
1736
+ roughness: 0.3,
1737
+ metalness: 0
1738
+ });
1345
1739
  break;
1740
+
1346
1741
  case FINISH_TYPE_PEARLESCENT:
1347
- material = new THREE.MeshStandardMaterial({ color, roughness: 0.3, metalness: 0.25 });
1742
+ // Try to imitate pearlescency by making the surface glossy
1743
+ material = new MeshStandardMaterial({
1744
+ color: color,
1745
+ roughness: 0.3,
1746
+ metalness: 0.25
1747
+ });
1348
1748
  break;
1749
+
1349
1750
  case FINISH_TYPE_CHROME:
1350
- material = new THREE.MeshStandardMaterial({ color, roughness: 0, metalness: 1 });
1751
+ // Mirror finish surface
1752
+ material = new MeshStandardMaterial({
1753
+ color: color,
1754
+ roughness: 0,
1755
+ metalness: 1
1756
+ });
1351
1757
  break;
1758
+
1352
1759
  case FINISH_TYPE_RUBBER:
1353
- material = new THREE.MeshStandardMaterial({ color, roughness: 0.9, metalness: 0 });
1760
+ // Rubber finish
1761
+ material = new MeshStandardMaterial({
1762
+ color: color,
1763
+ roughness: 0.9,
1764
+ metalness: 0
1765
+ });
1354
1766
  break;
1767
+
1355
1768
  case FINISH_TYPE_MATTE_METALLIC:
1356
- material = new THREE.MeshStandardMaterial({ color, roughness: 0.8, metalness: 0.4 });
1769
+ // Brushed metal finish
1770
+ material = new MeshStandardMaterial({
1771
+ color: color,
1772
+ roughness: 0.8,
1773
+ metalness: 0.4
1774
+ });
1357
1775
  break;
1776
+
1358
1777
  case FINISH_TYPE_METAL:
1359
- material = new THREE.MeshStandardMaterial({ color, roughness: 0.2, metalness: 0.85 });
1360
- break;
1361
- default:
1778
+ // Average metal finish
1779
+ material = new MeshStandardMaterial({
1780
+ color: color,
1781
+ roughness: 0.2,
1782
+ metalness: 0.85
1783
+ });
1362
1784
  break;
1363
1785
  }
1786
+
1364
1787
  material.transparent = isTransparent;
1365
1788
  material.premultipliedAlpha = true;
1366
1789
  material.opacity = alpha;
1367
1790
  material.depthWrite = !isTransparent;
1368
1791
  material.polygonOffset = true;
1369
1792
  material.polygonOffsetFactor = 1;
1793
+
1370
1794
  if (luminance !== 0) {
1371
1795
  material.emissive.set(material.color).multiplyScalar(luminance);
1372
1796
  }
1797
+
1373
1798
  if (!edgeMaterial) {
1374
- edgeMaterial = new THREE.LineBasicMaterial({
1799
+ // This is the material used for edges
1800
+ edgeMaterial = new LineBasicMaterial({
1375
1801
  color: edgeColor,
1376
1802
  transparent: isTransparent,
1377
1803
  opacity: alpha,
1378
1804
  depthWrite: !isTransparent
1379
1805
  });
1380
1806
  edgeMaterial.userData.code = code;
1381
- edgeMaterial.name = name + " - Edge";
1807
+ edgeMaterial.name = name + ' - Edge'; // This is the material used for conditional edges
1808
+
1382
1809
  edgeMaterial.userData.conditionalEdgeMaterial = new LDrawConditionalLineMaterial({
1383
1810
  fog: true,
1384
1811
  transparent: isTransparent,
@@ -1387,23 +1814,29 @@ class LDrawLoader extends THREE.Loader {
1387
1814
  opacity: alpha
1388
1815
  });
1389
1816
  }
1817
+
1390
1818
  material.userData.code = code;
1391
1819
  material.name = name;
1392
1820
  material.userData.edgeMaterial = edgeMaterial;
1393
1821
  this.addMaterial(material);
1394
1822
  return material;
1395
1823
  }
1824
+
1396
1825
  computeConstructionSteps(model) {
1826
+ // Sets userdata.constructionStep number in Group objects and userData.numConstructionSteps number in the root Group object.
1397
1827
  let stepNumber = 0;
1398
- model.traverse((c) => {
1828
+ model.traverse(c => {
1399
1829
  if (c.isGroup) {
1400
1830
  if (c.userData.startingConstructionStep) {
1401
1831
  stepNumber++;
1402
1832
  }
1833
+
1403
1834
  c.userData.constructionStep = stepNumber;
1404
1835
  }
1405
1836
  });
1406
1837
  model.userData.numConstructionSteps = stepNumber + 1;
1407
1838
  }
1839
+
1408
1840
  }
1409
- exports.LDrawLoader = LDrawLoader;
1841
+
1842
+ export { LDrawLoader };