@needle-tools/three 0.145.4 → 0.146.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +32586 -35951
  3. package/build/three.js +32600 -35965
  4. package/build/three.min.js +6 -7
  5. package/build/three.module.js +1547 -1154
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +49 -66
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +70 -134
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +138 -405
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -54
  14. package/examples/js/controls/FlyControls.js +29 -55
  15. package/examples/js/controls/OrbitControls.js +85 -95
  16. package/examples/js/controls/PointerLockControls.js +5 -14
  17. package/examples/js/controls/TrackballControls.js +33 -86
  18. package/examples/js/controls/TransformControls.js +84 -169
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +4 -18
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +26 -30
  30. package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
  31. package/examples/js/effects/PeppersGhostEffect.js +12 -39
  32. package/examples/js/effects/StereoEffect.js +0 -4
  33. package/examples/js/environments/RoomEnvironment.js +12 -10
  34. package/examples/js/exporters/ColladaExporter.js +48 -65
  35. package/examples/js/exporters/DRACOExporter.js +22 -22
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +143 -261
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +42 -33
  40. package/examples/js/exporters/PLYExporter.js +38 -33
  41. package/examples/js/exporters/STLExporter.js +5 -7
  42. package/examples/js/exporters/USDZExporter.js +110 -25
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +11 -6
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +25 -12
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +22 -33
  60. package/examples/js/interactive/InteractiveGroup.js +6 -12
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +0 -8
  63. package/examples/js/lights/LightProbeGenerator.js +32 -39
  64. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  65. package/examples/js/lines/LineGeometry.js +3 -5
  66. package/examples/js/lines/LineMaterial.js +4 -11
  67. package/examples/js/lines/LineSegments2.js +38 -89
  68. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  69. package/examples/js/lines/Wireframe.js +2 -7
  70. package/examples/js/lines/WireframeGeometry2.js +3 -1
  71. package/examples/js/loaders/3DMLoader.js +58 -155
  72. package/examples/js/loaders/3MFLoader.js +72 -106
  73. package/examples/js/loaders/AMFLoader.js +0 -25
  74. package/examples/js/loaders/BVHLoader.js +44 -43
  75. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  76. package/examples/js/loaders/ColladaLoader.js +201 -359
  77. package/examples/js/loaders/DDSLoader.js +24 -25
  78. package/examples/js/loaders/DRACOLoader.js +29 -66
  79. package/examples/js/loaders/EXRLoader.js +67 -164
  80. package/examples/js/loaders/FBXLoader.js +286 -441
  81. package/examples/js/loaders/FontLoader.js +6 -15
  82. package/examples/js/loaders/GCodeLoader.js +15 -16
  83. package/examples/js/loaders/GLTFLoader.js +354 -405
  84. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
  85. package/examples/js/loaders/KMZLoader.js +3 -7
  86. package/examples/js/loaders/KTXLoader.js +12 -30
  87. package/examples/js/loaders/LDrawLoader.js +178 -289
  88. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  89. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  90. package/examples/js/loaders/LWOLoader.js +59 -124
  91. package/examples/js/loaders/LogLuvLoader.js +27 -77
  92. package/examples/js/loaders/LottieLoader.js +4 -4
  93. package/examples/js/loaders/MD2Loader.js +26 -27
  94. package/examples/js/loaders/MDDLoader.js +6 -10
  95. package/examples/js/loaders/MMDLoader.js +180 -189
  96. package/examples/js/loaders/MTLLoader.js +18 -47
  97. package/examples/js/loaders/MaterialXLoader.js +392 -0
  98. package/examples/js/loaders/NRRDLoader.js +44 -84
  99. package/examples/js/loaders/OBJLoader.js +50 -65
  100. package/examples/js/loaders/PCDLoader.js +34 -29
  101. package/examples/js/loaders/PDBLoader.js +17 -13
  102. package/examples/js/loaders/PLYLoader.js +9 -39
  103. package/examples/js/loaders/PRWMLoader.js +11 -22
  104. package/examples/js/loaders/PVRLoader.js +7 -16
  105. package/examples/js/loaders/RGBELoader.js +36 -61
  106. package/examples/js/loaders/RGBMLoader.js +26 -87
  107. package/examples/js/loaders/STLLoader.js +20 -27
  108. package/examples/js/loaders/SVGLoader.js +361 -233
  109. package/examples/js/loaders/TDSLoader.js +81 -118
  110. package/examples/js/loaders/TGALoader.js +39 -41
  111. package/examples/js/loaders/TIFFLoader.js +0 -1
  112. package/examples/js/loaders/TTFLoader.js +0 -8
  113. package/examples/js/loaders/TiltLoader.js +14 -15
  114. package/examples/js/loaders/VOXLoader.js +8 -16
  115. package/examples/js/loaders/VRMLLoader.js +243 -340
  116. package/examples/js/loaders/VTKLoader.js +101 -118
  117. package/examples/js/loaders/XYZLoader.js +2 -4
  118. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  119. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  120. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  121. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  122. package/examples/js/math/Capsule.js +0 -17
  123. package/examples/js/math/ColorConverter.js +3 -3
  124. package/examples/js/math/ConvexHull.js +183 -139
  125. package/examples/js/math/ImprovedNoise.js +1 -1
  126. package/examples/js/math/Lut.js +8 -15
  127. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  128. package/examples/js/math/OBB.js +90 -49
  129. package/examples/js/math/Octree.js +2 -57
  130. package/examples/js/math/SimplexNoise.js +74 -88
  131. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  132. package/examples/js/misc/GPUComputationRenderer.js +14 -18
  133. package/examples/js/misc/Gyroscope.js +5 -9
  134. package/examples/js/misc/MD2Character.js +14 -23
  135. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  136. package/examples/js/misc/MorphAnimMesh.js +0 -6
  137. package/examples/js/misc/MorphBlendMesh.js +3 -30
  138. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  139. package/examples/js/misc/RollerCoaster.js +17 -24
  140. package/examples/js/misc/TubePainter.js +18 -12
  141. package/examples/js/misc/Volume.js +16 -45
  142. package/examples/js/misc/VolumeSlice.js +14 -24
  143. package/examples/js/modifiers/CurveModifier.js +19 -21
  144. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  145. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  146. package/examples/js/modifiers/TessellateModifier.js +2 -9
  147. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  148. package/examples/js/objects/Lensflare.js +47 -38
  149. package/examples/js/objects/LightningStorm.js +10 -13
  150. package/examples/js/objects/MarchingCubes.js +80 -59
  151. package/examples/js/objects/Reflector.js +22 -20
  152. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  153. package/examples/js/objects/Refractor.js +52 -30
  154. package/examples/js/objects/ShadowMesh.js +1 -2
  155. package/examples/js/objects/Sky.js +2 -7
  156. package/examples/js/objects/Water.js +23 -18
  157. package/examples/js/objects/Water2.js +20 -19
  158. package/examples/js/physics/AmmoPhysics.js +23 -20
  159. package/examples/js/physics/OimoPhysics.js +19 -17
  160. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  161. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  162. package/examples/js/postprocessing/BloomPass.js +38 -17
  163. package/examples/js/postprocessing/BokehPass.js +29 -12
  164. package/examples/js/postprocessing/ClearPass.js +1 -6
  165. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  166. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  167. package/examples/js/postprocessing/EffectComposer.js +25 -32
  168. package/examples/js/postprocessing/FilmPass.js +7 -5
  169. package/examples/js/postprocessing/GlitchPass.js +10 -11
  170. package/examples/js/postprocessing/HalftonePass.js +9 -9
  171. package/examples/js/postprocessing/LUTPass.js +2 -15
  172. package/examples/js/postprocessing/MaskPass.js +20 -17
  173. package/examples/js/postprocessing/OutlinePass.js +45 -36
  174. package/examples/js/postprocessing/Pass.js +11 -14
  175. package/examples/js/postprocessing/RenderPass.js +3 -7
  176. package/examples/js/postprocessing/SAOPass.js +40 -32
  177. package/examples/js/postprocessing/SMAAPass.js +34 -17
  178. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  179. package/examples/js/postprocessing/SSAOPass.js +56 -42
  180. package/examples/js/postprocessing/SSRPass.js +78 -61
  181. package/examples/js/postprocessing/SavePass.js +14 -6
  182. package/examples/js/postprocessing/ShaderPass.js +9 -8
  183. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  184. package/examples/js/postprocessing/TexturePass.js +7 -4
  185. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  186. package/examples/js/renderers/CSS2DRenderer.js +2 -21
  187. package/examples/js/renderers/CSS3DRenderer.js +3 -24
  188. package/examples/js/renderers/Projector.js +29 -85
  189. package/examples/js/renderers/SVGRenderer.js +4 -50
  190. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  191. package/examples/js/shaders/AfterimageShader.js +3 -6
  192. package/examples/js/shaders/BasicShader.js +3 -6
  193. package/examples/js/shaders/BleachBypassShader.js +3 -6
  194. package/examples/js/shaders/BlendShader.js +3 -6
  195. package/examples/js/shaders/BokehShader.js +3 -6
  196. package/examples/js/shaders/BokehShader2.js +4 -13
  197. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  198. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  199. package/examples/js/shaders/ColorifyShader.js +2 -6
  200. package/examples/js/shaders/ConvolutionShader.js +5 -10
  201. package/examples/js/shaders/CopyShader.js +3 -6
  202. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  203. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  204. package/examples/js/shaders/DigitalGlitch.js +3 -6
  205. package/examples/js/shaders/DotScreenShader.js +2 -6
  206. package/examples/js/shaders/FXAAShader.js +1 -3
  207. package/examples/js/shaders/FilmShader.js +3 -6
  208. package/examples/js/shaders/FocusShader.js +3 -6
  209. package/examples/js/shaders/FreiChenShader.js +2 -6
  210. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  211. package/examples/js/shaders/GodRaysShader.js +11 -24
  212. package/examples/js/shaders/HalftoneShader.js +3 -6
  213. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  214. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  215. package/examples/js/shaders/HueSaturationShader.js +3 -6
  216. package/examples/js/shaders/KaleidoShader.js +3 -6
  217. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  218. package/examples/js/shaders/LuminosityShader.js +3 -6
  219. package/examples/js/shaders/MMDToonShader.js +2 -6
  220. package/examples/js/shaders/MirrorShader.js +3 -6
  221. package/examples/js/shaders/NormalMapShader.js +2 -6
  222. package/examples/js/shaders/RGBShiftShader.js +3 -6
  223. package/examples/js/shaders/SAOShader.js +2 -6
  224. package/examples/js/shaders/SMAAShader.js +6 -18
  225. package/examples/js/shaders/SSAOShader.js +2 -6
  226. package/examples/js/shaders/SSRShader.js +6 -18
  227. package/examples/js/shaders/SepiaShader.js +3 -6
  228. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  229. package/examples/js/shaders/TechnicolorShader.js +3 -6
  230. package/examples/js/shaders/ToneMapShader.js +3 -6
  231. package/examples/js/shaders/ToonShader.js +8 -24
  232. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  233. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  234. package/examples/js/shaders/VelocityShader.js +126 -0
  235. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  236. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  237. package/examples/js/shaders/VignetteShader.js +3 -6
  238. package/examples/js/shaders/VolumeShader.js +2 -6
  239. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  240. package/examples/js/textures/FlakesTexture.js +0 -1
  241. package/examples/js/utils/BufferGeometryUtils.js +234 -168
  242. package/examples/js/utils/CameraUtils.js +5 -20
  243. package/examples/js/utils/GPUStatsPanel.js +3 -12
  244. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  245. package/examples/js/utils/GeometryUtils.js +13 -18
  246. package/examples/js/utils/LDrawUtils.js +8 -11
  247. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  248. package/examples/js/utils/SceneUtils.js +117 -6
  249. package/examples/js/utils/ShadowMapViewer.js +17 -14
  250. package/examples/js/utils/SkeletonUtils.js +13 -27
  251. package/examples/js/utils/UVsDebug.js +20 -12
  252. package/examples/js/utils/WorkerPool.js +1 -11
  253. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  254. package/examples/jsm/capabilities/WebGPU.js +3 -1
  255. package/examples/jsm/controls/OrbitControls.js +44 -4
  256. package/examples/jsm/exporters/GLTFExporter.js +17 -131
  257. package/examples/jsm/exporters/USDZExporter.js +75 -19
  258. package/examples/jsm/interactive/HTMLMesh.js +2 -0
  259. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  260. package/examples/jsm/loaders/3DMLoader.js +1 -2
  261. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  262. package/examples/jsm/loaders/FBXLoader.js +16 -2
  263. package/examples/jsm/loaders/GLTFLoader.js +204 -377
  264. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  265. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  266. package/examples/jsm/loaders/LottieLoader.js +4 -2
  267. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  268. package/examples/jsm/loaders/PCDLoader.js +1 -1
  269. package/examples/jsm/loaders/PLYLoader.js +68 -16
  270. package/examples/jsm/loaders/SVGLoader.js +227 -14
  271. package/examples/jsm/loaders/USDZLoader.js +31 -16
  272. package/examples/jsm/nodes/Nodes.js +14 -2
  273. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  274. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  275. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  276. package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
  277. package/examples/jsm/nodes/core/Node.js +1 -1
  278. package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
  279. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  280. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  281. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  282. package/examples/jsm/nodes/core/constants.js +13 -13
  283. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  284. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  285. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  286. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  287. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  288. package/examples/jsm/nodes/materials/Materials.js +9 -7
  289. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  290. package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
  291. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  292. package/examples/jsm/nodes/math/MathNode.js +5 -0
  293. package/examples/jsm/nodes/math/OperatorNode.js +6 -1
  294. package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
  295. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
  296. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
  297. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  298. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  299. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  300. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  301. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  302. package/examples/jsm/nodes/utils/TimerNode.js +1 -1
  303. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  304. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  305. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  306. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  307. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  308. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  309. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  310. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  311. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  312. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  313. package/examples/jsm/postprocessing/OutlinePass.js +10 -0
  314. package/examples/jsm/postprocessing/Pass.js +2 -0
  315. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  316. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  317. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  318. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  319. package/examples/jsm/postprocessing/SavePass.js +17 -1
  320. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  321. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  322. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  323. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  324. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
  325. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  326. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  327. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  328. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  329. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
  330. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  331. package/examples/jsm/shaders/VelocityShader.js +128 -0
  332. package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
  333. package/examples/jsm/utils/SceneUtils.js +129 -4
  334. package/examples/jsm/utils/TextureUtils.js +85 -0
  335. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  336. package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
  337. package/package.json +11 -12
  338. package/src/Three.js +1 -0
  339. package/src/audio/AudioContext.js +5 -5
  340. package/src/cameras/CubeCamera.js +14 -14
  341. package/src/constants.js +1 -1
  342. package/src/core/InstancedBufferGeometry.js +1 -7
  343. package/src/extras/Earcut.js +67 -67
  344. package/src/helpers/DirectionalLightHelper.js +5 -1
  345. package/src/helpers/HemisphereLightHelper.js +4 -1
  346. package/src/helpers/PointLightHelper.js +2 -1
  347. package/src/helpers/SpotLightHelper.js +4 -2
  348. package/src/lights/PointLight.js +2 -2
  349. package/src/lights/SpotLight.js +2 -2
  350. package/src/loaders/FileLoader.js +4 -1
  351. package/src/loaders/ObjectLoader.js +5 -1
  352. package/src/materials/Material.js +1 -1
  353. package/src/math/Color.js +5 -5
  354. package/src/math/Matrix3.js +53 -18
  355. package/src/math/Ray.js +2 -5
  356. package/src/math/Sphere.js +19 -26
  357. package/src/objects/InstancedMesh.js +7 -0
  358. package/src/objects/LOD.js +25 -6
  359. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  360. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  361. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  362. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  363. package/src/renderers/WebGLRenderTarget.js +1 -1
  364. package/src/renderers/WebGLRenderer.js +36 -62
  365. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  367. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  369. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  370. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  371. package/src/renderers/shaders/ShaderChunk.js +3 -0
  372. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  373. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  374. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  375. package/src/renderers/shaders/ShaderLib.js +20 -6
  376. package/src/renderers/shaders/UniformsLib.js +1 -1
  377. package/src/renderers/shaders/UniformsUtils.js +15 -0
  378. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  379. package/src/renderers/webgl/WebGLBackground.js +15 -7
  380. package/src/renderers/webgl/WebGLLights.js +0 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  382. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  383. package/src/renderers/webgl/WebGLState.js +31 -1
  384. package/src/renderers/webgl/WebGLTextures.js +71 -18
  385. package/src/renderers/webgl/WebGLUniforms.js +116 -20
  386. package/src/renderers/webgl/WebGLUtils.js +1 -1
  387. package/src/renderers/webxr/WebXRController.js +46 -13
  388. package/src/renderers/webxr/WebXRManager.js +85 -3
  389. package/src/scenes/Scene.js +8 -0
  390. package/src/textures/CompressedArrayTexture.js +18 -0
  391. package/examples/js/libs/lottie_canvas.js +0 -12751
  392. package/examples/js/shaders/PixelShader.js +0 -51
  393. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -1,6 +1,6 @@
1
1
  import { GPULoadOp, GPUStoreOp } from './constants.js';
2
- import { Color, Mesh, BoxGeometry, BackSide } from 'three';
3
- import { context, transformDirection, positionWorld, modelWorldMatrix, MeshBasicNodeMaterial } from 'three/nodes';
2
+ import { Color, Mesh, BoxGeometry, BackSide, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
3
+ import { context, vec2, invert, texture, cubeTexture, transformDirection, positionWorld, modelWorldMatrix, viewportBottomLeft, equirectUV, MeshBasicNodeMaterial } from 'three/nodes';
4
4
 
5
5
  let _clearAlpha;
6
6
  const _clearColor = new Color();
@@ -45,7 +45,7 @@ class WebGPUBackground {
45
45
  _clearAlpha = 1;
46
46
  forceClear = true;
47
47
 
48
- } else if ( background.isNode === true ) {
48
+ } else if ( background.isNode === true || background.isTexture === true ) {
49
49
 
50
50
  _clearColor.copy( renderer._clearColor );
51
51
  _clearAlpha = renderer._clearAlpha;
@@ -54,12 +54,41 @@ class WebGPUBackground {
54
54
 
55
55
  if ( boxMesh === null ) {
56
56
 
57
- const colorNode = context( background, {
58
- uvNode: transformDirection( positionWorld, modelWorldMatrix )
59
- } );
57
+ let node = null;
58
+
59
+ if ( background.isCubeTexture === true ) {
60
+
61
+ node = cubeTexture( background, transformDirection( positionWorld, modelWorldMatrix ) );
62
+
63
+ } else if ( background.isTexture === true ) {
64
+
65
+ let nodeUV = null;
66
+
67
+ if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
68
+
69
+ const dirNode = transformDirection( positionWorld, modelWorldMatrix );
70
+
71
+ nodeUV = equirectUV( dirNode );
72
+ nodeUV = vec2( nodeUV.x, invert( nodeUV.y ) );
73
+
74
+ } else {
75
+
76
+ nodeUV = viewportBottomLeft;
77
+
78
+ }
79
+
80
+ node = texture( background, nodeUV );
81
+
82
+ } else /*if ( background.isNode === true )*/ {
83
+
84
+ node = context( background, {
85
+ uvNode: transformDirection( positionWorld, modelWorldMatrix )
86
+ } );
87
+
88
+ }
60
89
 
61
90
  const nodeMaterial = new MeshBasicNodeMaterial();
62
- nodeMaterial.colorNode = colorNode;
91
+ nodeMaterial.colorNode = node;
63
92
  nodeMaterial.side = BackSide;
64
93
  nodeMaterial.depthTest = false;
65
94
  nodeMaterial.depthWrite = false;
@@ -1,4 +1,5 @@
1
1
  import { GPUIndexFormat, GPUTextureFormat, GPUStoreOp } from './constants.js';
2
+ import WebGPUAnimation from './WebGPUAnimation.js';
2
3
  import WebGPUObjects from './WebGPUObjects.js';
3
4
  import WebGPUAttributes from './WebGPUAttributes.js';
4
5
  import WebGPUGeometries from './WebGPUGeometries.js';
@@ -132,6 +133,8 @@ class WebGPURenderer {
132
133
  this._textures = null;
133
134
  this._background = null;
134
135
 
136
+ this._animation = new WebGPUAnimation();
137
+
135
138
  this._renderPassDescriptor = null;
136
139
 
137
140
  this._currentRenderState = null;
@@ -147,6 +150,8 @@ class WebGPURenderer {
147
150
 
148
151
  this._renderTarget = null;
149
152
 
153
+ this._initialized = false;
154
+
150
155
  // some parameters require default values other than "undefined"
151
156
 
152
157
  this._parameters.antialias = ( parameters.antialias === true );
@@ -168,6 +173,12 @@ class WebGPURenderer {
168
173
 
169
174
  async init() {
170
175
 
176
+ if ( this._initialized === true ) {
177
+
178
+ throw new Error( 'WebGPURenderer: Device has already been initialized.' );
179
+
180
+ }
181
+
171
182
  const parameters = this._parameters;
172
183
 
173
184
  const adapterOptions = {
@@ -192,7 +203,7 @@ class WebGPURenderer {
192
203
  const context = ( parameters.context !== undefined ) ? parameters.context : this.domElement.getContext( 'webgpu' );
193
204
 
194
205
  context.configure( {
195
- device: device,
206
+ device,
196
207
  format: GPUTextureFormat.BGRA8Unorm, // this is the only valid context format right now (r121)
197
208
  alphaMode: 'premultiplied'
198
209
  } );
@@ -232,16 +243,21 @@ class WebGPURenderer {
232
243
  this._setupColorBuffer();
233
244
  this._setupDepthBuffer();
234
245
 
235
- }
246
+ this._animation.setNodes( this._nodes );
247
+ this._animation.start();
248
+
249
+ this._initialized = true;
236
250
 
237
- render( scene, camera ) {
251
+ }
238
252
 
239
- // @TODO: move this to animation loop
253
+ async render( scene, camera ) {
240
254
 
241
- this._nodes.updateFrame();
255
+ if ( this._initialized === false ) return await this.init();
242
256
 
243
257
  //
244
258
 
259
+ if ( this._animation.isAnimating === false ) this._nodes.updateFrame();
260
+
245
261
  if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
246
262
 
247
263
  if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
@@ -276,6 +292,8 @@ class WebGPURenderer {
276
292
 
277
293
  if ( renderTarget !== null ) {
278
294
 
295
+ this._textures.initRenderTarget( renderTarget );
296
+
279
297
  // @TODO: Support RenderTarget with antialiasing.
280
298
 
281
299
  const renderTargetProperties = this._properties.get( renderTarget );
@@ -354,6 +372,24 @@ class WebGPURenderer {
354
372
 
355
373
  }
356
374
 
375
+ setAnimationLoop( callback ) {
376
+
377
+ if ( this._initialized === false ) this.init();
378
+
379
+ const animation = this._animation;
380
+
381
+ animation.setAnimationLoop( callback );
382
+
383
+ ( callback === null ) ? animation.stop() : animation.start();
384
+
385
+ }
386
+
387
+ async getArrayFromBuffer( attribute ) {
388
+
389
+ return await this._attributes.getArrayBuffer( attribute );
390
+
391
+ }
392
+
357
393
  getContext() {
358
394
 
359
395
  return this._context;
@@ -571,21 +607,20 @@ class WebGPURenderer {
571
607
  this._renderStates.dispose();
572
608
  this._textures.dispose();
573
609
 
610
+ this.setRenderTarget( null );
611
+ this.setAnimationLoop( null );
612
+
574
613
  }
575
614
 
576
615
  setRenderTarget( renderTarget ) {
577
616
 
578
617
  this._renderTarget = renderTarget;
579
618
 
580
- if ( renderTarget !== null ) {
581
-
582
- this._textures.initRenderTarget( renderTarget );
583
-
584
- }
585
-
586
619
  }
587
620
 
588
- compute( ...computeNodes ) {
621
+ async compute( ...computeNodes ) {
622
+
623
+ if ( this._initialized === false ) return await this.init();
589
624
 
590
625
  const device = this._device;
591
626
  const computePipelines = this._computePipelines;
@@ -78,9 +78,9 @@ fn threejs_mod( x : f32, y : f32 ) -> f32 {
78
78
  }
79
79
  ` ),
80
80
  repeatWrapping: new CodeNode( `
81
- fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<i32> ) -> vec2<i32> {
81
+ fn threejs_repeatWrapping( uv : vec2<f32>, dimension : vec2<u32> ) -> vec2<u32> {
82
82
 
83
- let uvScaled = vec2<i32>( uv * vec2<f32>( dimension ) );
83
+ let uvScaled = vec2<u32>( uv * vec2<f32>( dimension ) );
84
84
 
85
85
  return ( ( uvScaled % dimension ) + dimension ) % dimension;
86
86
 
@@ -200,7 +200,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
200
200
 
201
201
  getPropertyName( node, shaderStage = this.shaderStage ) {
202
202
 
203
- if ( node.isNodeVarying === true ) {
203
+ if ( node.isNodeVarying === true && node.needsInterpolation === true ) {
204
204
 
205
205
  if ( shaderStage === 'vertex' ) {
206
206
 
@@ -399,6 +399,18 @@ class WebGPUNodeBuilder extends NodeBuilder {
399
399
 
400
400
  }
401
401
 
402
+ getFragCoord() {
403
+
404
+ return this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>', 'fragment' );
405
+
406
+ }
407
+
408
+ isFlipY() {
409
+
410
+ return false;
411
+
412
+ }
413
+
402
414
  getAttributes( shaderStage ) {
403
415
 
404
416
  const snippets = [];
@@ -463,24 +475,42 @@ class WebGPUNodeBuilder extends NodeBuilder {
463
475
  this.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );
464
476
 
465
477
  const varyings = this.varyings;
478
+ const vars = this.vars[ shaderStage ];
466
479
 
467
480
  for ( let index = 0; index < varyings.length; index ++ ) {
468
481
 
469
482
  const varying = varyings[ index ];
470
483
 
471
- snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
484
+ if ( varying.needsInterpolation ) {
485
+
486
+ snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
487
+
488
+ } else if ( vars.includes( varying ) === false ) {
489
+
490
+ vars.push( varying );
491
+
492
+ }
472
493
 
473
494
  }
474
495
 
475
496
  } else if ( shaderStage === 'fragment' ) {
476
497
 
477
498
  const varyings = this.varyings;
499
+ const vars = this.vars[ shaderStage ];
478
500
 
479
501
  for ( let index = 0; index < varyings.length; index ++ ) {
480
502
 
481
503
  const varying = varyings[ index ];
482
504
 
483
- snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
505
+ if ( varying.needsInterpolation ) {
506
+
507
+ snippets.push( `@location( ${index} ) ${ varying.name } : ${ this.getType( varying.type ) }` );
508
+
509
+ } else if ( vars.includes( varying ) === false ) {
510
+
511
+ vars.push( varying );
512
+
513
+ }
484
514
 
485
515
  }
486
516
 
@@ -45,8 +45,6 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in Geometric
45
45
 
46
46
  #define RE_Direct RE_Direct_BlinnPhong
47
47
  #define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong
48
-
49
- #define Material_LightProbeLOD( material ) (0)
50
48
  `;
51
49
 
52
50
  const mmd_toon_matcap_fragment = /* glsl */`
@@ -0,0 +1,128 @@
1
+ import {
2
+ UniformsLib,
3
+ UniformsUtils,
4
+ Matrix4
5
+ } from 'three';
6
+
7
+ /**
8
+ * Mesh Velocity Shader @bhouston
9
+ */
10
+
11
+ const VelocityShader = {
12
+
13
+ uniforms: UniformsUtils.merge( [
14
+ UniformsLib.common,
15
+ UniformsLib.displacementmap,
16
+ {
17
+ modelMatrixPrev: { value: new Matrix4() },
18
+ currentProjectionViewMatrix: { value: new Matrix4() },
19
+ previousProjectionViewMatrix: { value: new Matrix4() }
20
+ }
21
+ ] ),
22
+
23
+ vertexShader: /* glsl */`
24
+ #define NORMAL
25
+
26
+ #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )
27
+
28
+ varying vec3 vViewPosition;
29
+
30
+ #endif
31
+
32
+ #include <common>
33
+ #include <packing>
34
+ #include <uv_pars_vertex>
35
+ #include <displacementmap_pars_vertex>
36
+ #include <normal_pars_vertex>
37
+ #include <morphtarget_pars_vertex>
38
+ #include <skinning_pars_vertex>
39
+ #include <logdepthbuf_pars_vertex>
40
+ #include <clipping_planes_pars_vertex>
41
+
42
+ uniform mat4 previousProjectionViewMatrix;
43
+ uniform mat4 currentProjectionViewMatrix;
44
+
45
+ uniform mat4 modelMatrixPrev;
46
+
47
+ varying vec4 clipPositionCurrent;
48
+ varying vec4 clipPositionPrevious;
49
+
50
+ void main() {
51
+
52
+
53
+ #include <uv_vertex>
54
+
55
+ #include <beginnormal_vertex>
56
+ #include <morphnormal_vertex>
57
+ #include <skinbase_vertex>
58
+ #include <skinnormal_vertex>
59
+ #include <defaultnormal_vertex>
60
+ #include <normal_vertex>
61
+
62
+ #include <begin_vertex>
63
+ #include <morphtarget_vertex>
64
+ #include <displacementmap_vertex>
65
+ #include <morphtarget_vertex>
66
+ #include <skinning_vertex>
67
+
68
+ #ifdef USE_SKINNING
69
+
70
+ vec4 mvPosition = modelViewMatrix * skinned;
71
+ clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * skinned;
72
+ clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;
73
+
74
+ #else
75
+
76
+ vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );
77
+ clipPositionCurrent = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );
78
+ clipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );
79
+
80
+ #endif
81
+
82
+ gl_Position = projectionMatrix * mvPosition;
83
+
84
+ #include <logdepthbuf_vertex>
85
+ #include <clipping_planes_vertex>
86
+ }
87
+ `,
88
+ fragmentShader: /* glsl */`
89
+ #define NORMAL
90
+
91
+ uniform float opacity;
92
+
93
+ #include <packing>
94
+ #include <uv_pars_fragment>
95
+ #include <map_pars_fragment>
96
+ #include <alphamap_pars_fragment>
97
+ #include <alphatest_pars_fragment>
98
+ #include <logdepthbuf_pars_fragment>
99
+ #include <clipping_planes_pars_fragment>
100
+
101
+ varying vec4 clipPositionCurrent;
102
+ varying vec4 clipPositionPrevious;
103
+
104
+ void main() {
105
+
106
+ vec4 diffuseColor = vec4( 1.0 );
107
+ diffuseColor.a = opacity;
108
+
109
+ #include <map_fragment>
110
+ #include <alphamap_fragment>
111
+ #include <alphatest_fragment>
112
+
113
+ vec2 ndcPositionCurrent = clipPositionCurrent.xy/clipPositionCurrent.w;
114
+ vec2 ndcPositionPrevious = clipPositionPrevious.xy/clipPositionPrevious.w;
115
+ vec2 vel = ( ndcPositionCurrent - ndcPositionPrevious ) * 0.5;
116
+ vel = vel * 0.5 + 0.5;
117
+ vec2 v1 = packDepthToRG(vel.x);
118
+ vec2 v2 = packDepthToRG(vel.y);
119
+ gl_FragColor = vec4(v1.x, v1.y, v2.x, v2.y);
120
+
121
+ #include <logdepthbuf_fragment>
122
+
123
+ }
124
+
125
+ `
126
+ };
127
+
128
+ export { VelocityShader };
@@ -192,11 +192,6 @@ function mergeBufferGeometries( geometries, useGroups = false ) {
192
192
 
193
193
  }
194
194
 
195
- // gather .userData
196
-
197
- mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];
198
- mergedGeometry.userData.mergedUserData.push( geometry.userData );
199
-
200
195
  if ( useGroups ) {
201
196
 
202
197
  let count;
@@ -371,6 +366,28 @@ function mergeBufferAttributes( attributes ) {
371
366
 
372
367
  }
373
368
 
369
+ /**
370
+ * @param {BufferAttribute}
371
+ * @return {BufferAttribute}
372
+ */
373
+ export function deepCloneAttribute( attribute ) {
374
+
375
+ if ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {
376
+
377
+ return deinterleaveAttribute( attribute );
378
+
379
+ }
380
+
381
+ if ( attribute.isInstancedBufferAttribute ) {
382
+
383
+ return new InstancedBufferAttribute().copy( attribute );
384
+
385
+ }
386
+
387
+ return new BufferAttribute().copy( attribute );
388
+
389
+ }
390
+
374
391
  /**
375
392
  * @param {Array<BufferAttribute>} attributes
376
393
  * @return {Array<InterleavedBufferAttribute>}
@@ -1208,6 +1225,112 @@ function mergeGroups( geometry ) {
1208
1225
 
1209
1226
  }
1210
1227
 
1228
+
1229
+ // Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at
1230
+ // an angle greater than the crease angle.
1231
+ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
1232
+
1233
+ const creaseDot = Math.cos( creaseAngle );
1234
+ const hashMultiplier = ( 1 + 1e-10 ) * 1e2;
1235
+
1236
+ // reusable vertors
1237
+ const verts = [ new Vector3(), new Vector3(), new Vector3() ];
1238
+ const tempVec1 = new Vector3();
1239
+ const tempVec2 = new Vector3();
1240
+ const tempNorm = new Vector3();
1241
+ const tempNorm2 = new Vector3();
1242
+
1243
+ // hashes a vector
1244
+ function hashVertex( v ) {
1245
+
1246
+ const x = ~ ~ ( v.x * hashMultiplier );
1247
+ const y = ~ ~ ( v.y * hashMultiplier );
1248
+ const z = ~ ~ ( v.z * hashMultiplier );
1249
+ return `${x},${y},${z}`;
1250
+
1251
+ }
1252
+
1253
+ const resultGeometry = geometry.toNonIndexed();
1254
+ const posAttr = resultGeometry.attributes.position;
1255
+ const vertexMap = {};
1256
+
1257
+ // find all the normals shared by commonly located vertices
1258
+ for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
1259
+
1260
+ const i3 = 3 * i;
1261
+ const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
1262
+ const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
1263
+ const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
1264
+
1265
+ tempVec1.subVectors( c, b );
1266
+ tempVec2.subVectors( a, b );
1267
+
1268
+ // add the normal to the map for all vertices
1269
+ const normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();
1270
+ for ( let n = 0; n < 3; n ++ ) {
1271
+
1272
+ const vert = verts[ n ];
1273
+ const hash = hashVertex( vert );
1274
+ if ( ! ( hash in vertexMap ) ) {
1275
+
1276
+ vertexMap[ hash ] = [];
1277
+
1278
+ }
1279
+
1280
+ vertexMap[ hash ].push( normal );
1281
+
1282
+ }
1283
+
1284
+ }
1285
+
1286
+ // average normals from all vertices that share a common location if they are within the
1287
+ // provided crease threshold
1288
+ const normalArray = new Float32Array( posAttr.count * 3 );
1289
+ const normAttr = new BufferAttribute( normalArray, 3, false );
1290
+ for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
1291
+
1292
+ // get the face normal for this vertex
1293
+ const i3 = 3 * i;
1294
+ const a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );
1295
+ const b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );
1296
+ const c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );
1297
+
1298
+ tempVec1.subVectors( c, b );
1299
+ tempVec2.subVectors( a, b );
1300
+
1301
+ tempNorm.crossVectors( tempVec1, tempVec2 ).normalize();
1302
+
1303
+ // average all normals that meet the threshold and set the normal value
1304
+ for ( let n = 0; n < 3; n ++ ) {
1305
+
1306
+ const vert = verts[ n ];
1307
+ const hash = hashVertex( vert );
1308
+ const otherNormals = vertexMap[ hash ];
1309
+ tempNorm2.set( 0, 0, 0 );
1310
+
1311
+ for ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {
1312
+
1313
+ const otherNorm = otherNormals[ k ];
1314
+ if ( tempNorm.dot( otherNorm ) > creaseDot ) {
1315
+
1316
+ tempNorm2.add( otherNorm );
1317
+
1318
+ }
1319
+
1320
+ }
1321
+
1322
+ tempNorm2.normalize();
1323
+ normAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );
1324
+
1325
+ }
1326
+
1327
+ }
1328
+
1329
+ resultGeometry.setAttribute( 'normal', normAttr );
1330
+ return resultGeometry;
1331
+
1332
+ }
1333
+
1211
1334
  export {
1212
1335
  computeTangents,
1213
1336
  computeMikkTSpaceTangents,
@@ -1218,5 +1341,6 @@ export {
1218
1341
  mergeVertices,
1219
1342
  toTrianglesDrawMode,
1220
1343
  computeMorphedAttributes,
1221
- mergeGroups
1344
+ mergeGroups,
1345
+ toCreasedNormals
1222
1346
  };