super-three 0.144.0 → 0.147.1

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 (450) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +737 -388
  3. package/build/three.js +737 -388
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +911 -409
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +50 -67
  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 +125 -99
  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 +85 -170
  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 +141 -317
  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 +113 -27
  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 +25 -39
  60. package/examples/js/interactive/InteractiveGroup.js +9 -14
  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 +40 -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 +228 -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 +287 -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 +409 -706
  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/NRRDLoader.js +44 -84
  98. package/examples/js/loaders/OBJLoader.js +50 -65
  99. package/examples/js/loaders/PCDLoader.js +34 -29
  100. package/examples/js/loaders/PDBLoader.js +17 -13
  101. package/examples/js/loaders/PLYLoader.js +62 -48
  102. package/examples/js/loaders/PRWMLoader.js +11 -22
  103. package/examples/js/loaders/PVRLoader.js +7 -16
  104. package/examples/js/loaders/RGBELoader.js +36 -61
  105. package/examples/js/loaders/RGBMLoader.js +26 -87
  106. package/examples/js/loaders/STLLoader.js +20 -27
  107. package/examples/js/loaders/SVGLoader.js +361 -233
  108. package/examples/js/loaders/TDSLoader.js +81 -118
  109. package/examples/js/loaders/TGALoader.js +39 -41
  110. package/examples/js/loaders/TIFFLoader.js +0 -1
  111. package/examples/js/loaders/TTFLoader.js +0 -8
  112. package/examples/js/loaders/TiltLoader.js +14 -15
  113. package/examples/js/loaders/VOXLoader.js +8 -16
  114. package/examples/js/loaders/VRMLLoader.js +243 -340
  115. package/examples/js/loaders/VTKLoader.js +101 -118
  116. package/examples/js/loaders/XYZLoader.js +2 -4
  117. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  118. package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
  119. package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
  120. package/examples/js/materials/MeshGouraudMaterial.js +15 -13
  121. package/examples/js/math/Capsule.js +0 -17
  122. package/examples/js/math/ColorConverter.js +3 -3
  123. package/examples/js/math/ConvexHull.js +185 -141
  124. package/examples/js/math/ImprovedNoise.js +1 -1
  125. package/examples/js/math/Lut.js +8 -15
  126. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  127. package/examples/js/math/OBB.js +90 -49
  128. package/examples/js/math/Octree.js +2 -57
  129. package/examples/js/math/SimplexNoise.js +74 -88
  130. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  131. package/examples/js/misc/GPUComputationRenderer.js +26 -16
  132. package/examples/js/misc/Gyroscope.js +5 -9
  133. package/examples/js/misc/MD2Character.js +14 -23
  134. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  135. package/examples/js/misc/MorphAnimMesh.js +0 -6
  136. package/examples/js/misc/MorphBlendMesh.js +3 -30
  137. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  138. package/examples/js/misc/RollerCoaster.js +17 -24
  139. package/examples/js/misc/TubePainter.js +18 -12
  140. package/examples/js/misc/Volume.js +16 -45
  141. package/examples/js/misc/VolumeSlice.js +14 -24
  142. package/examples/js/modifiers/CurveModifier.js +19 -21
  143. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  144. package/examples/js/modifiers/SimplifyModifier.js +56 -59
  145. package/examples/js/modifiers/TessellateModifier.js +2 -9
  146. package/examples/js/objects/GroundProjectedEnv.js +2 -14
  147. package/examples/js/objects/Lensflare.js +47 -38
  148. package/examples/js/objects/LightningStorm.js +10 -13
  149. package/examples/js/objects/MarchingCubes.js +80 -59
  150. package/examples/js/objects/Reflector.js +22 -20
  151. package/examples/js/objects/ReflectorForSSRPass.js +19 -23
  152. package/examples/js/objects/Refractor.js +52 -30
  153. package/examples/js/objects/ShadowMesh.js +1 -2
  154. package/examples/js/objects/Sky.js +2 -7
  155. package/examples/js/objects/Water.js +23 -18
  156. package/examples/js/objects/Water2.js +20 -19
  157. package/examples/js/physics/AmmoPhysics.js +23 -20
  158. package/examples/js/physics/OimoPhysics.js +19 -17
  159. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  160. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  161. package/examples/js/postprocessing/BloomPass.js +38 -17
  162. package/examples/js/postprocessing/BokehPass.js +29 -12
  163. package/examples/js/postprocessing/ClearPass.js +1 -6
  164. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  165. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  166. package/examples/js/postprocessing/EffectComposer.js +25 -32
  167. package/examples/js/postprocessing/FilmPass.js +7 -5
  168. package/examples/js/postprocessing/GlitchPass.js +10 -11
  169. package/examples/js/postprocessing/HalftonePass.js +9 -9
  170. package/examples/js/postprocessing/LUTPass.js +2 -15
  171. package/examples/js/postprocessing/MaskPass.js +20 -17
  172. package/examples/js/postprocessing/OutlinePass.js +45 -36
  173. package/examples/js/postprocessing/Pass.js +11 -14
  174. package/examples/js/postprocessing/RenderPass.js +3 -7
  175. package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
  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 -8
  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 +236 -170
  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 +27 -3
  254. package/examples/jsm/animation/MMDPhysics.js +25 -0
  255. package/examples/jsm/capabilities/WebGPU.js +3 -1
  256. package/examples/jsm/controls/FirstPersonControls.js +20 -20
  257. package/examples/jsm/controls/FlyControls.js +16 -17
  258. package/examples/jsm/controls/OrbitControls.js +44 -4
  259. package/examples/jsm/controls/TrackballControls.js +14 -2
  260. package/examples/jsm/controls/TransformControls.js +1 -1
  261. package/examples/jsm/csm/CSM.js +1 -0
  262. package/examples/jsm/csm/CSMHelper.js +30 -0
  263. package/examples/jsm/exporters/GLTFExporter.js +0 -79
  264. package/examples/jsm/exporters/USDZExporter.js +93 -1
  265. package/examples/jsm/helpers/OctreeHelper.js +22 -8
  266. package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
  267. package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
  268. package/examples/jsm/helpers/ViewHelper.js +24 -0
  269. package/examples/jsm/interactive/HTMLMesh.js +5 -6
  270. package/examples/jsm/interactive/InteractiveGroup.js +4 -2
  271. package/examples/jsm/libs/flow.module.js +610 -160
  272. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  273. package/examples/jsm/lines/LineSegments2.js +4 -0
  274. package/examples/jsm/loaders/3DMLoader.js +1 -2
  275. package/examples/jsm/loaders/ColladaLoader.js +28 -0
  276. package/examples/jsm/loaders/FBXLoader.js +18 -2
  277. package/examples/jsm/loaders/GLTFLoader.js +269 -428
  278. package/examples/jsm/loaders/KTX2Loader.js +68 -29
  279. package/examples/jsm/loaders/LDrawLoader.js +14 -13
  280. package/examples/jsm/loaders/LottieLoader.js +4 -2
  281. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  282. package/examples/jsm/loaders/PCDLoader.js +1 -1
  283. package/examples/jsm/loaders/PLYLoader.js +68 -16
  284. package/examples/jsm/loaders/SVGLoader.js +227 -14
  285. package/examples/jsm/loaders/USDZLoader.js +351 -111
  286. package/examples/jsm/loaders/VRMLLoader.js +13 -1
  287. package/examples/jsm/math/ConvexHull.js +4 -4
  288. package/examples/jsm/math/Octree.js +1 -1
  289. package/examples/jsm/node-editor/NodeEditor.js +91 -12
  290. package/examples/jsm/node-editor/core/BaseNode.js +10 -3
  291. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +6 -9
  292. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +6 -9
  293. package/examples/jsm/node-editor/math/AngleEditor.js +3 -3
  294. package/examples/jsm/node-editor/math/InvertEditor.js +2 -2
  295. package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
  296. package/examples/jsm/node-editor/utils/PreviewEditor.js +4 -0
  297. package/examples/jsm/nodes/Nodes.js +30 -3
  298. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  299. package/examples/jsm/nodes/accessors/NormalNode.js +6 -6
  300. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  301. package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
  302. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  303. package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
  304. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  305. package/examples/jsm/nodes/core/AttributeNode.js +31 -8
  306. package/examples/jsm/nodes/core/Node.js +1 -1
  307. package/examples/jsm/nodes/core/NodeBuilder.js +55 -6
  308. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  309. package/examples/jsm/nodes/core/NodeVarying.js +7 -4
  310. package/examples/jsm/nodes/core/VaryingNode.js +6 -4
  311. package/examples/jsm/nodes/core/constants.js +13 -13
  312. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  313. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -12
  314. package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
  315. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  316. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  317. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
  318. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
  319. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
  320. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  321. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  322. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
  323. package/examples/jsm/nodes/materials/Materials.js +9 -7
  324. package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
  325. package/examples/jsm/nodes/materialx/{Disclaimer.md → DISCLAIMER.md} +1 -1
  326. package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
  327. package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_hsv.js +1 -1
  328. package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_noise.js +13 -3
  329. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  330. package/examples/jsm/nodes/math/MathNode.js +5 -5
  331. package/examples/jsm/nodes/math/OperatorNode.js +16 -3
  332. package/examples/jsm/nodes/shadernode/ShaderNode.js +35 -20
  333. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +87 -63
  334. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +29 -0
  335. package/examples/jsm/nodes/utils/ConvertNode.js +15 -14
  336. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  337. package/examples/jsm/nodes/utils/JoinNode.js +8 -2
  338. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  339. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  340. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  341. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  342. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  343. package/examples/jsm/nodes/utils/TimerNode.js +21 -1
  344. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  345. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  346. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  347. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  348. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  349. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  350. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  351. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  352. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  353. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  354. package/examples/jsm/postprocessing/OutlinePass.js +21 -1
  355. package/examples/jsm/postprocessing/Pass.js +2 -0
  356. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  357. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  358. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  359. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  360. package/examples/jsm/postprocessing/SavePass.js +17 -1
  361. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  362. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  363. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  364. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  365. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +56 -35
  366. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  367. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  368. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
  369. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
  370. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +41 -9
  371. package/examples/jsm/shaders/MMDToonShader.js +0 -2
  372. package/examples/jsm/shaders/VelocityShader.js +128 -0
  373. package/examples/jsm/utils/BufferGeometryUtils.js +174 -42
  374. package/examples/jsm/utils/SceneUtils.js +129 -4
  375. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  376. package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
  377. package/package.json +13 -13
  378. package/src/Three.js +1 -0
  379. package/src/animation/PropertyBinding.js +7 -0
  380. package/src/audio/AudioContext.js +5 -5
  381. package/src/cameras/CubeCamera.js +14 -14
  382. package/src/constants.js +1 -1
  383. package/src/core/InstancedBufferGeometry.js +1 -7
  384. package/src/core/InterleavedBufferAttribute.js +4 -4
  385. package/src/extras/Earcut.js +67 -67
  386. package/src/geometries/PolyhedronGeometry.js +1 -1
  387. package/src/geometries/ShapeGeometry.js +1 -1
  388. package/src/helpers/ArrowHelper.js +9 -0
  389. package/src/helpers/Box3Helper.js +7 -0
  390. package/src/helpers/BoxHelper.js +7 -1
  391. package/src/helpers/DirectionalLightHelper.js +5 -1
  392. package/src/helpers/GridHelper.js +7 -0
  393. package/src/helpers/HemisphereLightHelper.js +4 -1
  394. package/src/helpers/PlaneHelper.js +9 -0
  395. package/src/helpers/PointLightHelper.js +2 -1
  396. package/src/helpers/PolarGridHelper.js +7 -0
  397. package/src/helpers/SkeletonHelper.js +7 -0
  398. package/src/helpers/SpotLightHelper.js +4 -2
  399. package/src/lights/LightShadow.js +1 -2
  400. package/src/lights/PointLight.js +2 -2
  401. package/src/lights/SpotLight.js +2 -2
  402. package/src/loaders/FileLoader.js +4 -1
  403. package/src/loaders/ObjectLoader.js +5 -1
  404. package/src/materials/Material.js +1 -1
  405. package/src/materials/MeshPhysicalMaterial.js +1 -1
  406. package/src/math/Color.js +5 -5
  407. package/src/math/Matrix3.js +53 -18
  408. package/src/math/Ray.js +2 -5
  409. package/src/math/Sphere.js +36 -21
  410. package/src/objects/InstancedMesh.js +7 -0
  411. package/src/objects/LOD.js +25 -6
  412. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  413. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  414. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  415. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  416. package/src/renderers/WebGLRenderTarget.js +1 -1
  417. package/src/renderers/WebGLRenderer.js +36 -62
  418. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  419. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
  420. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
  421. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  422. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  423. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
  424. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  425. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
  426. package/src/renderers/shaders/ShaderChunk.js +3 -0
  427. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  428. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  429. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  430. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
  431. package/src/renderers/shaders/ShaderLib.js +20 -6
  432. package/src/renderers/shaders/UniformsLib.js +1 -1
  433. package/src/renderers/shaders/UniformsUtils.js +15 -0
  434. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  435. package/src/renderers/webgl/WebGLBackground.js +15 -7
  436. package/src/renderers/webgl/WebGLLights.js +0 -4
  437. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  438. package/src/renderers/webgl/WebGLShadowMap.js +3 -1
  439. package/src/renderers/webgl/WebGLState.js +78 -41
  440. package/src/renderers/webgl/WebGLTextures.js +94 -39
  441. package/src/renderers/webgl/WebGLUniforms.js +152 -24
  442. package/src/renderers/webgl/WebGLUtils.js +1 -1
  443. package/src/renderers/webxr/WebXRController.js +46 -13
  444. package/src/renderers/webxr/WebXRManager.js +71 -3
  445. package/src/scenes/Scene.js +8 -0
  446. package/src/textures/CompressedArrayTexture.js +18 -0
  447. package/src/textures/Texture.js +2 -1
  448. package/examples/js/libs/lottie_canvas.js +0 -12751
  449. package/examples/js/shaders/PixelShader.js +0 -51
  450. package/examples/jsm/shaders/PixelShader.js +0 -44
@@ -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 };
@@ -5,7 +5,6 @@ import {
5
5
  InstancedBufferAttribute,
6
6
  InterleavedBuffer,
7
7
  InterleavedBufferAttribute,
8
- MathUtils,
9
8
  TriangleFanDrawMode,
10
9
  TriangleStripDrawMode,
11
10
  TrianglesDrawMode,
@@ -36,17 +35,16 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
36
35
 
37
36
  if ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {
38
37
 
39
- const srcArray = attribute.isInterleavedBufferAttribute ? attribute.data.array : attribute.array;
40
38
  const dstArray = new Float32Array( attribute.getCount() * attribute.itemSize );
41
39
 
42
40
  for ( let i = 0, j = 0; i < attribute.getCount(); i ++ ) {
43
41
 
44
- dstArray[ j ++ ] = MathUtils.denormalize( attribute.getX( i ), srcArray );
45
- dstArray[ j ++ ] = MathUtils.denormalize( attribute.getY( i ), srcArray );
42
+ dstArray[ j ++ ] = attribute.getX( i );
43
+ dstArray[ j ++ ] = attribute.getY( i );
46
44
 
47
45
  if ( attribute.itemSize > 2 ) {
48
46
 
49
- dstArray[ j ++ ] = MathUtils.denormalize( attribute.getZ( i ), srcArray );
47
+ dstArray[ j ++ ] = attribute.getZ( i );
50
48
 
51
49
  }
52
50
 
@@ -194,11 +192,6 @@ function mergeBufferGeometries( geometries, useGroups = false ) {
194
192
 
195
193
  }
196
194
 
197
- // gather .userData
198
-
199
- mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];
200
- mergedGeometry.userData.mergedUserData.push( geometry.userData );
201
-
202
195
  if ( useGroups ) {
203
196
 
204
197
  let count;
@@ -373,6 +366,28 @@ function mergeBufferAttributes( attributes ) {
373
366
 
374
367
  }
375
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
+
376
391
  /**
377
392
  * @param {Array<BufferAttribute>} attributes
378
393
  * @return {Array<InterleavedBufferAttribute>}
@@ -385,7 +400,7 @@ function interleaveAttributes( attributes ) {
385
400
  let arrayLength = 0;
386
401
  let stride = 0;
387
402
 
388
- // calculate the the length and type of the interleavedBuffer
403
+ // calculate the length and type of the interleavedBuffer
389
404
  for ( let i = 0, l = attributes.length; i < l; ++ i ) {
390
405
 
391
406
  const attribute = attributes[ i ];
@@ -555,7 +570,7 @@ function estimateBytesUsed( geometry ) {
555
570
  /**
556
571
  * @param {BufferGeometry} geometry
557
572
  * @param {number} tolerance
558
- * @return {BufferGeometry>}
573
+ * @return {BufferGeometry}
559
574
  */
560
575
  function mergeVertices( geometry, tolerance = 1e-4 ) {
561
576
 
@@ -573,22 +588,33 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
573
588
 
574
589
  // attributes and new attribute arrays
575
590
  const attributeNames = Object.keys( geometry.attributes );
576
- const attrArrays = {};
577
- const morphAttrsArrays = {};
591
+ const tmpAttributes = {};
592
+ const tmpMorphAttributes = {};
578
593
  const newIndices = [];
579
594
  const getters = [ 'getX', 'getY', 'getZ', 'getW' ];
595
+ const setters = [ 'setX', 'setY', 'setZ', 'setW' ];
580
596
 
581
- // initialize the arrays
597
+ // Initialize the arrays, allocating space conservatively. Extra
598
+ // space will be trimmed in the last step.
582
599
  for ( let i = 0, l = attributeNames.length; i < l; i ++ ) {
583
600
 
584
601
  const name = attributeNames[ i ];
602
+ const attr = geometry.attributes[ name ];
585
603
 
586
- attrArrays[ name ] = [];
604
+ tmpAttributes[ name ] = new BufferAttribute(
605
+ new attr.array.constructor( attr.count * attr.itemSize ),
606
+ attr.itemSize,
607
+ attr.normalized
608
+ );
587
609
 
588
610
  const morphAttr = geometry.morphAttributes[ name ];
589
611
  if ( morphAttr ) {
590
612
 
591
- morphAttrsArrays[ name ] = new Array( morphAttr.length ).fill().map( () => [] );
613
+ tmpMorphAttributes[ name ] = new BufferAttribute(
614
+ new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize ),
615
+ morphAttr.itemSize,
616
+ morphAttr.normalized
617
+ );
592
618
 
593
619
  }
594
620
 
@@ -626,26 +652,27 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
626
652
 
627
653
  } else {
628
654
 
629
- // copy data to the new index in the attribute arrays
655
+ // copy data to the new index in the temporary attributes
630
656
  for ( let j = 0, l = attributeNames.length; j < l; j ++ ) {
631
657
 
632
658
  const name = attributeNames[ j ];
633
659
  const attribute = geometry.getAttribute( name );
634
660
  const morphAttr = geometry.morphAttributes[ name ];
635
661
  const itemSize = attribute.itemSize;
636
- const newarray = attrArrays[ name ];
637
- const newMorphArrays = morphAttrsArrays[ name ];
662
+ const newarray = tmpAttributes[ name ];
663
+ const newMorphArrays = tmpMorphAttributes[ name ];
638
664
 
639
665
  for ( let k = 0; k < itemSize; k ++ ) {
640
666
 
641
667
  const getterFunc = getters[ k ];
642
- newarray.push( attribute[ getterFunc ]( index ) );
668
+ const setterFunc = setters[ k ];
669
+ newarray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );
643
670
 
644
671
  if ( morphAttr ) {
645
672
 
646
673
  for ( let m = 0, ml = morphAttr.length; m < ml; m ++ ) {
647
674
 
648
- newMorphArrays[ m ].push( morphAttr[ m ][ getterFunc ]( index ) );
675
+ newMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttr[ m ][ getterFunc ]( index ) );
649
676
 
650
677
  }
651
678
 
@@ -663,31 +690,29 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
663
690
 
664
691
  }
665
692
 
666
- // Generate typed arrays from new attribute arrays and update
667
- // the attributeBuffers
693
+ // generate result BufferGeometry
668
694
  const result = geometry.clone();
669
- for ( let i = 0, l = attributeNames.length; i < l; i ++ ) {
670
-
671
- const name = attributeNames[ i ];
672
- const oldAttribute = geometry.getAttribute( name );
673
-
674
- const buffer = new oldAttribute.array.constructor( attrArrays[ name ] );
675
- const attribute = new BufferAttribute( buffer, oldAttribute.itemSize, oldAttribute.normalized );
695
+ for ( const name in geometry.attributes ) {
676
696
 
677
- result.setAttribute( name, attribute );
697
+ const tmpAttribute = tmpAttributes[ name ];
678
698
 
679
- // Update the attribute arrays
680
- if ( name in morphAttrsArrays ) {
699
+ result.setAttribute( name, new BufferAttribute(
700
+ tmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),
701
+ tmpAttribute.itemSize,
702
+ tmpAttribute.normalized,
703
+ ) );
681
704
 
682
- for ( let j = 0; j < morphAttrsArrays[ name ].length; j ++ ) {
705
+ if ( ! ( name in tmpMorphAttributes ) ) continue;
683
706
 
684
- const oldMorphAttribute = geometry.morphAttributes[ name ][ j ];
707
+ for ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {
685
708
 
686
- const buffer = new oldMorphAttribute.array.constructor( morphAttrsArrays[ name ][ j ] );
687
- const morphAttribute = new BufferAttribute( buffer, oldMorphAttribute.itemSize, oldMorphAttribute.normalized );
688
- result.morphAttributes[ name ][ j ] = morphAttribute;
709
+ const tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];
689
710
 
690
- }
711
+ result.morphAttributes[ name ][ j ] = new BufferAttribute(
712
+ tmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),
713
+ tmpMorphAttribute.itemSize,
714
+ tmpMorphAttribute.normalized,
715
+ );
691
716
 
692
717
  }
693
718
 
@@ -704,7 +729,7 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
704
729
  /**
705
730
  * @param {BufferGeometry} geometry
706
731
  * @param {number} drawMode
707
- * @return {BufferGeometry>}
732
+ * @return {BufferGeometry}
708
733
  */
709
734
  function toTrianglesDrawMode( geometry, drawMode ) {
710
735
 
@@ -1200,6 +1225,112 @@ function mergeGroups( geometry ) {
1200
1225
 
1201
1226
  }
1202
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
+
1203
1334
  export {
1204
1335
  computeTangents,
1205
1336
  computeMikkTSpaceTangents,
@@ -1210,5 +1341,6 @@ export {
1210
1341
  mergeVertices,
1211
1342
  toTrianglesDrawMode,
1212
1343
  computeMorphedAttributes,
1213
- mergeGroups
1344
+ mergeGroups,
1345
+ toCreasedNormals
1214
1346
  };
@@ -1,11 +1,17 @@
1
1
  import {
2
+ BufferAttribute,
3
+ BufferGeometry,
4
+ Color,
2
5
  Group,
6
+ Matrix4,
3
7
  Mesh,
4
- BufferAttribute,
5
- BufferGeometry
8
+ Vector3
6
9
  } from 'three';
7
10
 
8
- import { mergeGroups } from './BufferGeometryUtils.js';
11
+ import { mergeGroups, deepCloneAttribute } from './BufferGeometryUtils.js';
12
+
13
+ const _color = /*@__PURE__*/new Color();
14
+ const _matrix = /*@__PURE__*/new Matrix4();
9
15
 
10
16
  function createMeshesFromInstancedMesh( instancedMesh ) {
11
17
 
@@ -118,8 +124,127 @@ function createMultiMaterialObject( geometry, materials ) {
118
124
 
119
125
  }
120
126
 
127
+ function reduceVertices( object, func, initialValue ) {
128
+
129
+ let value = initialValue;
130
+ const vertex = new Vector3();
131
+
132
+ object.updateWorldMatrix( true, true );
133
+
134
+ object.traverseVisible( ( child ) => {
135
+
136
+ const { geometry } = child;
137
+
138
+ if ( geometry !== undefined ) {
139
+
140
+ const { position } = geometry.attributes;
141
+
142
+ if ( position !== undefined ) {
143
+
144
+ for ( let i = 0, l = position.count; i < l; i ++ ) {
145
+
146
+ vertex.fromBufferAttribute( position, i );
147
+
148
+ if ( child.isSkinnedMesh ) {
149
+
150
+ child.boneTransform( i, vertex );
151
+
152
+ } else {
153
+
154
+ vertex.applyMatrix4( child.matrixWorld );
155
+
156
+ }
157
+
158
+ value = func( value, vertex );
159
+
160
+ }
161
+
162
+ }
163
+
164
+ }
165
+
166
+ } );
167
+
168
+ return value;
169
+
170
+ }
171
+
172
+ /**
173
+ * @param {InstancedMesh}
174
+ * @param {function(int, int):int}
175
+ */
176
+ function sortInstancedMesh( mesh, compareFn ) {
177
+
178
+ // store copy of instanced attributes for lookups
179
+
180
+ const instanceMatrixRef = deepCloneAttribute( mesh.instanceMatrix );
181
+ const instanceColorRef = mesh.instanceColor ? deepCloneAttribute( mesh.instanceColor ) : null;
182
+
183
+ const attributeRefs = new Map();
184
+
185
+ for ( const name in mesh.geometry.attributes ) {
186
+
187
+ const attribute = mesh.geometry.attributes[ name ];
188
+
189
+ if ( attribute.isInstancedBufferAttribute ) {
190
+
191
+ attributeRefs.set( attribute, deepCloneAttribute( attribute ) );
192
+
193
+ }
194
+
195
+ }
196
+
197
+
198
+ // compute sort order
199
+
200
+ const tokens = [];
201
+
202
+ for ( let i = 0; i < mesh.count; i ++ ) tokens.push( i );
203
+
204
+ tokens.sort( compareFn );
205
+
206
+
207
+ // apply sort order
208
+
209
+ for ( let i = 0; i < tokens.length; i ++ ) {
210
+
211
+ const refIndex = tokens[ i ];
212
+
213
+ _matrix.fromArray( instanceMatrixRef.array, refIndex * mesh.instanceMatrix.itemSize );
214
+ _matrix.toArray( mesh.instanceMatrix.array, i * mesh.instanceMatrix.itemSize );
215
+
216
+ if ( mesh.instanceColor ) {
217
+
218
+ _color.fromArray( instanceColorRef.array, refIndex * mesh.instanceColor.itemSize );
219
+ _color.toArray( mesh.instanceColor.array, i * mesh.instanceColor.itemSize );
220
+
221
+ }
222
+
223
+ for ( const name in mesh.geometry.attributes ) {
224
+
225
+ const attribute = mesh.geometry.attributes[ name ];
226
+
227
+ if ( attribute.isInstancedBufferAttribute ) {
228
+
229
+ const attributeRef = attributeRefs.get( attribute );
230
+
231
+ attribute.setX( i, attributeRef.getX( refIndex ) );
232
+ if ( attribute.itemSize > 1 ) attribute.setY( i, attributeRef.getY( refIndex ) );
233
+ if ( attribute.itemSize > 2 ) attribute.setZ( i, attributeRef.getZ( refIndex ) );
234
+ if ( attribute.itemSize > 3 ) attribute.setW( i, attributeRef.getW( refIndex ) );
235
+
236
+ }
237
+
238
+ }
239
+
240
+ }
241
+
242
+ }
243
+
121
244
  export {
122
245
  createMeshesFromInstancedMesh,
123
246
  createMeshesFromMultiMaterialMesh,
124
- createMultiMaterialObject
247
+ createMultiMaterialObject,
248
+ reduceVertices,
249
+ sortInstancedMesh
125
250
  };
@@ -6,13 +6,14 @@ const POINTING_JOINT = 'index-finger-tip';
6
6
 
7
7
  class OculusHandModel extends Object3D {
8
8
 
9
- constructor( controller ) {
9
+ constructor( controller, loader = null ) {
10
10
 
11
11
  super();
12
12
 
13
13
  this.controller = controller;
14
14
  this.motionController = null;
15
15
  this.envMap = null;
16
+ this.loader = loader;
16
17
 
17
18
  this.mesh = null;
18
19
 
@@ -24,7 +25,7 @@ class OculusHandModel extends Object3D {
24
25
 
25
26
  this.xrInputSource = xrInputSource;
26
27
 
27
- this.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness );
28
+ this.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness, this.loader );
28
29
 
29
30
  }
30
31
 
@@ -4,15 +4,20 @@ const DEFAULT_HAND_PROFILE_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-pro
4
4
 
5
5
  class XRHandMeshModel {
6
6
 
7
- constructor( handModel, controller, path, handedness ) {
7
+ constructor( handModel, controller, path, handedness, loader = null ) {
8
8
 
9
9
  this.controller = controller;
10
10
  this.handModel = handModel;
11
11
 
12
12
  this.bones = [];
13
13
 
14
- const loader = new GLTFLoader();
15
- loader.setPath( path || DEFAULT_HAND_PROFILE_PATH );
14
+ if ( loader === null ) {
15
+
16
+ loader = new GLTFLoader();
17
+ loader.setPath( path || DEFAULT_HAND_PROFILE_PATH );
18
+
19
+ }
20
+
16
21
  loader.load( `${handedness}.glb`, gltf => {
17
22
 
18
23
  const object = gltf.scene.children[ 0 ];