three-stdlib 2.35.3 → 2.35.4

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 (514) hide show
  1. package/_polyfill/CapsuleGeometry.cjs +20 -17
  2. package/_polyfill/CapsuleGeometry.cjs.map +1 -1
  3. package/_polyfill/CapsuleGeometry.js +20 -17
  4. package/_polyfill/CapsuleGeometry.js.map +1 -1
  5. package/_polyfill/constants.cjs +1 -1
  6. package/_polyfill/constants.cjs.map +1 -1
  7. package/_polyfill/constants.js +1 -1
  8. package/_polyfill/constants.js.map +1 -1
  9. package/animation/AnimationClipCreator.cjs +13 -13
  10. package/animation/AnimationClipCreator.cjs.map +1 -1
  11. package/animation/AnimationClipCreator.js +13 -13
  12. package/animation/AnimationClipCreator.js.map +1 -1
  13. package/animation/CCDIKSolver.cjs +11 -11
  14. package/animation/CCDIKSolver.cjs.map +1 -1
  15. package/animation/CCDIKSolver.js +12 -12
  16. package/animation/CCDIKSolver.js.map +1 -1
  17. package/animation/MMDAnimationHelper.cjs +1 -1
  18. package/animation/MMDAnimationHelper.cjs.map +1 -1
  19. package/animation/MMDAnimationHelper.js +1 -1
  20. package/animation/MMDAnimationHelper.js.map +1 -1
  21. package/animation/MMDPhysics.cjs +4 -4
  22. package/animation/MMDPhysics.cjs.map +1 -1
  23. package/animation/MMDPhysics.js +4 -4
  24. package/animation/MMDPhysics.js.map +1 -1
  25. package/controls/ArcballControls.cjs +2 -2
  26. package/controls/ArcballControls.cjs.map +1 -1
  27. package/controls/ArcballControls.js +3 -3
  28. package/controls/ArcballControls.js.map +1 -1
  29. package/controls/FirstPersonControls.cjs +1 -1
  30. package/controls/FirstPersonControls.cjs.map +1 -1
  31. package/controls/FirstPersonControls.js +1 -1
  32. package/controls/FirstPersonControls.js.map +1 -1
  33. package/controls/OrbitControls.cjs +2 -2
  34. package/controls/OrbitControls.cjs.map +1 -1
  35. package/controls/OrbitControls.js +3 -3
  36. package/controls/OrbitControls.js.map +1 -1
  37. package/controls/PointerLockControls.cjs +2 -2
  38. package/controls/PointerLockControls.cjs.map +1 -1
  39. package/controls/PointerLockControls.js +3 -3
  40. package/controls/PointerLockControls.js.map +1 -1
  41. package/csm/CSM.cjs +4 -4
  42. package/csm/CSM.cjs.map +1 -1
  43. package/csm/CSM.js +5 -5
  44. package/csm/CSM.js.map +1 -1
  45. package/csm/CSMFrustum.cjs +1 -1
  46. package/csm/CSMFrustum.cjs.map +1 -1
  47. package/csm/CSMFrustum.js +2 -2
  48. package/csm/CSMFrustum.js.map +1 -1
  49. package/deprecated/Geometry.cjs +722 -715
  50. package/deprecated/Geometry.cjs.map +1 -1
  51. package/deprecated/Geometry.js +723 -716
  52. package/deprecated/Geometry.js.map +1 -1
  53. package/effects/AnaglyphEffect.cjs +2 -1
  54. package/effects/AnaglyphEffect.cjs.map +1 -1
  55. package/effects/AnaglyphEffect.js +3 -2
  56. package/effects/AnaglyphEffect.js.map +1 -1
  57. package/effects/OutlineEffect.cjs +2 -1
  58. package/effects/OutlineEffect.cjs.map +1 -1
  59. package/effects/OutlineEffect.js +3 -2
  60. package/effects/OutlineEffect.js.map +1 -1
  61. package/effects/ParallaxBarrierEffect.cjs +2 -1
  62. package/effects/ParallaxBarrierEffect.cjs.map +1 -1
  63. package/effects/ParallaxBarrierEffect.js +3 -2
  64. package/effects/ParallaxBarrierEffect.js.map +1 -1
  65. package/exporters/DRACOExporter.cjs +133 -122
  66. package/exporters/DRACOExporter.cjs.map +1 -1
  67. package/exporters/DRACOExporter.d.ts +23 -21
  68. package/exporters/DRACOExporter.js +133 -122
  69. package/exporters/DRACOExporter.js.map +1 -1
  70. package/exporters/GLTFExporter.cjs +170 -167
  71. package/exporters/GLTFExporter.cjs.map +1 -1
  72. package/exporters/GLTFExporter.js +170 -167
  73. package/exporters/GLTFExporter.js.map +1 -1
  74. package/geometries/LightningStrike.cjs +524 -515
  75. package/geometries/LightningStrike.cjs.map +1 -1
  76. package/geometries/LightningStrike.js +524 -515
  77. package/geometries/LightningStrike.js.map +1 -1
  78. package/geometries/RoundedBoxGeometry.cjs +1 -1
  79. package/geometries/RoundedBoxGeometry.cjs.map +1 -1
  80. package/geometries/RoundedBoxGeometry.js +2 -2
  81. package/geometries/RoundedBoxGeometry.js.map +1 -1
  82. package/helpers/RaycasterHelper.cjs +2 -2
  83. package/helpers/RaycasterHelper.cjs.map +1 -1
  84. package/helpers/RaycasterHelper.js +3 -3
  85. package/helpers/RaycasterHelper.js.map +1 -1
  86. package/helpers/VertexNormalsHelper.cjs +3 -3
  87. package/helpers/VertexNormalsHelper.cjs.map +1 -1
  88. package/helpers/VertexNormalsHelper.js +4 -4
  89. package/helpers/VertexNormalsHelper.js.map +1 -1
  90. package/helpers/VertexTangentsHelper.cjs +2 -2
  91. package/helpers/VertexTangentsHelper.cjs.map +1 -1
  92. package/helpers/VertexTangentsHelper.js +3 -3
  93. package/helpers/VertexTangentsHelper.js.map +1 -1
  94. package/interactive/InteractiveGroup.cjs +1 -1
  95. package/interactive/InteractiveGroup.cjs.map +1 -1
  96. package/interactive/InteractiveGroup.js +2 -2
  97. package/interactive/InteractiveGroup.js.map +1 -1
  98. package/interactive/SelectionBox.cjs +15 -15
  99. package/interactive/SelectionBox.cjs.map +1 -1
  100. package/interactive/SelectionBox.js +16 -16
  101. package/interactive/SelectionBox.js.map +1 -1
  102. package/libs/chevrotain.cjs +1 -1
  103. package/libs/chevrotain.cjs.map +1 -1
  104. package/libs/chevrotain.js +1 -1
  105. package/libs/chevrotain.js.map +1 -1
  106. package/libs/lottie.cjs +1 -1
  107. package/libs/lottie.cjs.map +1 -1
  108. package/libs/lottie.js +1 -1
  109. package/libs/lottie.js.map +1 -1
  110. package/libs/opentype.cjs +1 -1
  111. package/libs/opentype.cjs.map +1 -1
  112. package/libs/opentype.js +1 -1
  113. package/libs/opentype.js.map +1 -1
  114. package/lights/LightProbeGenerator.cjs +5 -5
  115. package/lights/LightProbeGenerator.cjs.map +1 -1
  116. package/lights/LightProbeGenerator.js +5 -5
  117. package/lights/LightProbeGenerator.js.map +1 -1
  118. package/lights/RectAreaLightUniformsLib.cjs +3 -3
  119. package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
  120. package/lights/RectAreaLightUniformsLib.js +3 -3
  121. package/lights/RectAreaLightUniformsLib.js.map +1 -1
  122. package/lines/LineMaterial.cjs +2 -1
  123. package/lines/LineMaterial.cjs.map +1 -1
  124. package/lines/LineMaterial.js +3 -2
  125. package/lines/LineMaterial.js.map +1 -1
  126. package/lines/LineSegments2.cjs +13 -13
  127. package/lines/LineSegments2.cjs.map +1 -1
  128. package/lines/LineSegments2.js +14 -14
  129. package/lines/LineSegments2.js.map +1 -1
  130. package/lines/LineSegmentsGeometry.cjs +2 -2
  131. package/lines/LineSegmentsGeometry.cjs.map +1 -1
  132. package/lines/LineSegmentsGeometry.js +3 -3
  133. package/lines/LineSegmentsGeometry.js.map +1 -1
  134. package/lines/Wireframe.cjs +3 -3
  135. package/lines/Wireframe.cjs.map +1 -1
  136. package/lines/Wireframe.js +4 -4
  137. package/lines/Wireframe.js.map +1 -1
  138. package/loaders/BasisTextureLoader.cjs +441 -435
  139. package/loaders/BasisTextureLoader.cjs.map +1 -1
  140. package/loaders/BasisTextureLoader.js +441 -435
  141. package/loaders/BasisTextureLoader.js.map +1 -1
  142. package/loaders/EXRLoader.cjs +2 -1
  143. package/loaders/EXRLoader.cjs.map +1 -1
  144. package/loaders/EXRLoader.js +3 -2
  145. package/loaders/EXRLoader.js.map +1 -1
  146. package/loaders/FBXLoader.cjs +2 -2
  147. package/loaders/FBXLoader.cjs.map +1 -1
  148. package/loaders/FBXLoader.js +2 -2
  149. package/loaders/FBXLoader.js.map +1 -1
  150. package/loaders/FontLoader.cjs +2 -2
  151. package/loaders/FontLoader.cjs.map +1 -1
  152. package/loaders/FontLoader.d.ts +2 -2
  153. package/loaders/FontLoader.js +2 -2
  154. package/loaders/FontLoader.js.map +1 -1
  155. package/loaders/GLTFLoader.cjs +2 -2
  156. package/loaders/GLTFLoader.cjs.map +1 -1
  157. package/loaders/GLTFLoader.js +2 -2
  158. package/loaders/GLTFLoader.js.map +1 -1
  159. package/loaders/KTX2Loader.cjs +377 -374
  160. package/loaders/KTX2Loader.cjs.map +1 -1
  161. package/loaders/KTX2Loader.js +377 -374
  162. package/loaders/KTX2Loader.js.map +1 -1
  163. package/loaders/LDrawLoader.cjs +5 -4
  164. package/loaders/LDrawLoader.cjs.map +1 -1
  165. package/loaders/LDrawLoader.js +6 -5
  166. package/loaders/LDrawLoader.js.map +1 -1
  167. package/loaders/OBJLoader.cjs +5 -5
  168. package/loaders/OBJLoader.cjs.map +1 -1
  169. package/loaders/OBJLoader.js +6 -6
  170. package/loaders/OBJLoader.js.map +1 -1
  171. package/loaders/PRWMLoader.cjs +46 -43
  172. package/loaders/PRWMLoader.cjs.map +1 -1
  173. package/loaders/PRWMLoader.js +46 -43
  174. package/loaders/PRWMLoader.js.map +1 -1
  175. package/loaders/SVGLoader.cjs +1694 -1688
  176. package/loaders/SVGLoader.cjs.map +1 -1
  177. package/loaders/SVGLoader.js +1694 -1688
  178. package/loaders/SVGLoader.js.map +1 -1
  179. package/loaders/XLoader.cjs +1 -1
  180. package/loaders/XLoader.cjs.map +1 -1
  181. package/loaders/XLoader.js +1 -1
  182. package/loaders/XLoader.js.map +1 -1
  183. package/math/Capsule.cjs +3 -3
  184. package/math/Capsule.cjs.map +1 -1
  185. package/math/Capsule.js +3 -3
  186. package/math/Capsule.js.map +1 -1
  187. package/math/ColorConverter.cjs +9 -9
  188. package/math/ColorConverter.cjs.map +1 -1
  189. package/math/ColorConverter.js +9 -9
  190. package/math/ColorConverter.js.map +1 -1
  191. package/math/ConvexHull.cjs +53 -50
  192. package/math/ConvexHull.cjs.map +1 -1
  193. package/math/ConvexHull.js +53 -50
  194. package/math/ConvexHull.js.map +1 -1
  195. package/math/ImprovedNoise.cjs +1 -1
  196. package/math/ImprovedNoise.cjs.map +1 -1
  197. package/math/ImprovedNoise.js +1 -1
  198. package/math/ImprovedNoise.js.map +1 -1
  199. package/math/MeshSurfaceSampler.cjs +2 -2
  200. package/math/MeshSurfaceSampler.cjs.map +1 -1
  201. package/math/MeshSurfaceSampler.js +2 -2
  202. package/math/MeshSurfaceSampler.js.map +1 -1
  203. package/math/OBB.cjs +14 -14
  204. package/math/OBB.cjs.map +1 -1
  205. package/math/OBB.js +15 -15
  206. package/math/OBB.js.map +1 -1
  207. package/math/Octree.cjs +7 -7
  208. package/math/Octree.cjs.map +1 -1
  209. package/math/Octree.js +8 -8
  210. package/math/Octree.js.map +1 -1
  211. package/misc/ConvexObjectBreaker.cjs +271 -268
  212. package/misc/ConvexObjectBreaker.cjs.map +1 -1
  213. package/misc/ConvexObjectBreaker.js +272 -269
  214. package/misc/ConvexObjectBreaker.js.map +1 -1
  215. package/misc/Gyroscope.cjs +6 -6
  216. package/misc/Gyroscope.cjs.map +1 -1
  217. package/misc/Gyroscope.js +7 -7
  218. package/misc/Gyroscope.js.map +1 -1
  219. package/modifiers/CurveModifier.cjs +1 -1
  220. package/modifiers/CurveModifier.cjs.map +1 -1
  221. package/modifiers/CurveModifier.js +2 -2
  222. package/modifiers/CurveModifier.js.map +1 -1
  223. package/modifiers/SimplifyModifier.cjs +2 -2
  224. package/modifiers/SimplifyModifier.cjs.map +1 -1
  225. package/modifiers/SimplifyModifier.js +2 -2
  226. package/modifiers/SimplifyModifier.js.map +1 -1
  227. package/objects/BatchedMesh.cjs +2 -2
  228. package/objects/BatchedMesh.cjs.map +1 -1
  229. package/objects/BatchedMesh.js +3 -3
  230. package/objects/BatchedMesh.js.map +1 -1
  231. package/objects/GroundProjectedEnv.cjs +2 -1
  232. package/objects/GroundProjectedEnv.cjs.map +1 -1
  233. package/objects/GroundProjectedEnv.js +3 -2
  234. package/objects/GroundProjectedEnv.js.map +1 -1
  235. package/objects/Lensflare.cjs +209 -206
  236. package/objects/Lensflare.cjs.map +1 -1
  237. package/objects/Lensflare.js +209 -206
  238. package/objects/Lensflare.js.map +1 -1
  239. package/objects/Reflector.cjs +154 -146
  240. package/objects/Reflector.cjs.map +1 -1
  241. package/objects/Reflector.js +154 -146
  242. package/objects/Reflector.js.map +1 -1
  243. package/objects/ReflectorForSSRPass.cjs +183 -180
  244. package/objects/ReflectorForSSRPass.cjs.map +1 -1
  245. package/objects/ReflectorForSSRPass.js +183 -180
  246. package/objects/ReflectorForSSRPass.js.map +1 -1
  247. package/objects/Refractor.cjs +164 -161
  248. package/objects/Refractor.cjs.map +1 -1
  249. package/objects/Refractor.js +164 -161
  250. package/objects/Refractor.js.map +1 -1
  251. package/objects/ShadowMesh.cjs +1 -1
  252. package/objects/ShadowMesh.cjs.map +1 -1
  253. package/objects/ShadowMesh.js +2 -2
  254. package/objects/ShadowMesh.js.map +1 -1
  255. package/objects/Sky.cjs +35 -32
  256. package/objects/Sky.cjs.map +1 -1
  257. package/objects/Sky.d.ts +100 -6
  258. package/objects/Sky.js +35 -32
  259. package/objects/Sky.js.map +1 -1
  260. package/objects/Water.cjs +2 -1
  261. package/objects/Water.cjs.map +1 -1
  262. package/objects/Water.js +3 -2
  263. package/objects/Water.js.map +1 -1
  264. package/objects/Water2.cjs +143 -140
  265. package/objects/Water2.cjs.map +1 -1
  266. package/objects/Water2.js +143 -140
  267. package/objects/Water2.js.map +1 -1
  268. package/package.json +1 -1
  269. package/postprocessing/SAOPass.cjs +267 -264
  270. package/postprocessing/SAOPass.cjs.map +1 -1
  271. package/postprocessing/SAOPass.js +267 -264
  272. package/postprocessing/SAOPass.js.map +1 -1
  273. package/postprocessing/SSAOPass.cjs +253 -250
  274. package/postprocessing/SSAOPass.cjs.map +1 -1
  275. package/postprocessing/SSAOPass.js +253 -250
  276. package/postprocessing/SSAOPass.js.map +1 -1
  277. package/postprocessing/SSRPass.cjs +379 -376
  278. package/postprocessing/SSRPass.cjs.map +1 -1
  279. package/postprocessing/SSRPass.js +379 -376
  280. package/postprocessing/SSRPass.js.map +1 -1
  281. package/postprocessing/UnrealBloomPass.cjs +205 -202
  282. package/postprocessing/UnrealBloomPass.cjs.map +1 -1
  283. package/postprocessing/UnrealBloomPass.js +205 -202
  284. package/postprocessing/UnrealBloomPass.js.map +1 -1
  285. package/renderers/CSS2DRenderer.cjs +5 -5
  286. package/renderers/CSS2DRenderer.cjs.map +1 -1
  287. package/renderers/CSS2DRenderer.js +5 -5
  288. package/renderers/CSS2DRenderer.js.map +1 -1
  289. package/renderers/CSS3DRenderer.cjs +5 -5
  290. package/renderers/CSS3DRenderer.cjs.map +1 -1
  291. package/renderers/CSS3DRenderer.js +6 -6
  292. package/renderers/CSS3DRenderer.js.map +1 -1
  293. package/shaders/ACESFilmicToneMappingShader.cjs +71 -46
  294. package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
  295. package/shaders/ACESFilmicToneMappingShader.js +71 -46
  296. package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
  297. package/shaders/AfterimageShader.cjs +41 -22
  298. package/shaders/AfterimageShader.cjs.map +1 -1
  299. package/shaders/AfterimageShader.js +41 -22
  300. package/shaders/AfterimageShader.js.map +1 -1
  301. package/shaders/BasicShader.cjs +20 -6
  302. package/shaders/BasicShader.cjs.map +1 -1
  303. package/shaders/BasicShader.js +20 -6
  304. package/shaders/BasicShader.js.map +1 -1
  305. package/shaders/BleachBypassShader.cjs +46 -26
  306. package/shaders/BleachBypassShader.cjs.map +1 -1
  307. package/shaders/BleachBypassShader.js +46 -26
  308. package/shaders/BleachBypassShader.js.map +1 -1
  309. package/shaders/BlendShader.cjs +33 -19
  310. package/shaders/BlendShader.cjs.map +1 -1
  311. package/shaders/BlendShader.js +33 -19
  312. package/shaders/BlendShader.js.map +1 -1
  313. package/shaders/BokehShader.cjs +117 -90
  314. package/shaders/BokehShader.cjs.map +1 -1
  315. package/shaders/BokehShader.js +117 -90
  316. package/shaders/BokehShader.js.map +1 -1
  317. package/shaders/BokehShader2.cjs +333 -232
  318. package/shaders/BokehShader2.cjs.map +1 -1
  319. package/shaders/BokehShader2.js +333 -232
  320. package/shaders/BokehShader2.js.map +1 -1
  321. package/shaders/BrightnessContrastShader.cjs +38 -22
  322. package/shaders/BrightnessContrastShader.cjs.map +1 -1
  323. package/shaders/BrightnessContrastShader.js +38 -22
  324. package/shaders/BrightnessContrastShader.js.map +1 -1
  325. package/shaders/ColorCorrectionShader.cjs +35 -21
  326. package/shaders/ColorCorrectionShader.cjs.map +1 -1
  327. package/shaders/ColorCorrectionShader.js +35 -21
  328. package/shaders/ColorCorrectionShader.js.map +1 -1
  329. package/shaders/ColorifyShader.cjs +34 -19
  330. package/shaders/ColorifyShader.cjs.map +1 -1
  331. package/shaders/ColorifyShader.js +34 -19
  332. package/shaders/ColorifyShader.js.map +1 -1
  333. package/shaders/ConvolutionShader.cjs +43 -24
  334. package/shaders/ConvolutionShader.cjs.map +1 -1
  335. package/shaders/ConvolutionShader.js +43 -24
  336. package/shaders/ConvolutionShader.js.map +1 -1
  337. package/shaders/CopyShader.cjs +30 -16
  338. package/shaders/CopyShader.cjs.map +1 -1
  339. package/shaders/CopyShader.js +30 -16
  340. package/shaders/CopyShader.js.map +1 -1
  341. package/shaders/DOFMipMapShader.cjs +38 -21
  342. package/shaders/DOFMipMapShader.cjs.map +1 -1
  343. package/shaders/DOFMipMapShader.js +38 -21
  344. package/shaders/DOFMipMapShader.js.map +1 -1
  345. package/shaders/DepthLimitedBlurShader.cjs +98 -69
  346. package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
  347. package/shaders/DepthLimitedBlurShader.js +98 -69
  348. package/shaders/DepthLimitedBlurShader.js.map +1 -1
  349. package/shaders/DigitalGlitch.cjs +70 -59
  350. package/shaders/DigitalGlitch.cjs.map +1 -1
  351. package/shaders/DigitalGlitch.js +70 -59
  352. package/shaders/DigitalGlitch.js.map +1 -1
  353. package/shaders/DotScreenShader.cjs +49 -28
  354. package/shaders/DotScreenShader.cjs.map +1 -1
  355. package/shaders/DotScreenShader.js +49 -28
  356. package/shaders/DotScreenShader.js.map +1 -1
  357. package/shaders/FXAAShader.cjs +1098 -1089
  358. package/shaders/FXAAShader.cjs.map +1 -1
  359. package/shaders/FXAAShader.js +1098 -1089
  360. package/shaders/FXAAShader.js.map +1 -1
  361. package/shaders/FilmShader.cjs +57 -29
  362. package/shaders/FilmShader.cjs.map +1 -1
  363. package/shaders/FilmShader.js +57 -29
  364. package/shaders/FilmShader.js.map +1 -1
  365. package/shaders/FocusShader.cjs +70 -43
  366. package/shaders/FocusShader.cjs.map +1 -1
  367. package/shaders/FocusShader.js +70 -43
  368. package/shaders/FocusShader.js.map +1 -1
  369. package/shaders/FreiChenShader.cjs +74 -53
  370. package/shaders/FreiChenShader.cjs.map +1 -1
  371. package/shaders/FreiChenShader.js +74 -53
  372. package/shaders/FreiChenShader.js.map +1 -1
  373. package/shaders/FresnelShader.cjs +55 -35
  374. package/shaders/FresnelShader.cjs.map +1 -1
  375. package/shaders/FresnelShader.js +55 -35
  376. package/shaders/FresnelShader.js.map +1 -1
  377. package/shaders/GammaCorrectionShader.cjs +33 -19
  378. package/shaders/GammaCorrectionShader.cjs.map +1 -1
  379. package/shaders/GammaCorrectionShader.js +33 -19
  380. package/shaders/GammaCorrectionShader.js.map +1 -1
  381. package/shaders/GodRaysShader.cjs +193 -116
  382. package/shaders/GodRaysShader.cjs.map +1 -1
  383. package/shaders/GodRaysShader.js +193 -116
  384. package/shaders/GodRaysShader.js.map +1 -1
  385. package/shaders/HalftoneShader.cjs +270 -192
  386. package/shaders/HalftoneShader.cjs.map +1 -1
  387. package/shaders/HalftoneShader.js +270 -192
  388. package/shaders/HalftoneShader.js.map +1 -1
  389. package/shaders/HorizontalTiltShiftShader.cjs +43 -27
  390. package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
  391. package/shaders/HorizontalTiltShiftShader.js +43 -27
  392. package/shaders/HorizontalTiltShiftShader.js.map +1 -1
  393. package/shaders/HueSaturationShader.cjs +47 -31
  394. package/shaders/HueSaturationShader.cjs.map +1 -1
  395. package/shaders/HueSaturationShader.js +47 -31
  396. package/shaders/HueSaturationShader.js.map +1 -1
  397. package/shaders/KaleidoShader.cjs +37 -24
  398. package/shaders/KaleidoShader.cjs.map +1 -1
  399. package/shaders/KaleidoShader.js +37 -24
  400. package/shaders/KaleidoShader.js.map +1 -1
  401. package/shaders/LuminosityHighPassShader.cjs +43 -24
  402. package/shaders/LuminosityHighPassShader.cjs.map +1 -1
  403. package/shaders/LuminosityHighPassShader.js +43 -24
  404. package/shaders/LuminosityHighPassShader.js.map +1 -1
  405. package/shaders/LuminosityShader.cjs +34 -17
  406. package/shaders/LuminosityShader.cjs.map +1 -1
  407. package/shaders/LuminosityShader.js +34 -17
  408. package/shaders/LuminosityShader.js.map +1 -1
  409. package/shaders/MirrorShader.cjs +39 -26
  410. package/shaders/MirrorShader.cjs.map +1 -1
  411. package/shaders/MirrorShader.js +39 -26
  412. package/shaders/MirrorShader.js.map +1 -1
  413. package/shaders/NormalMapShader.cjs +36 -21
  414. package/shaders/NormalMapShader.cjs.map +1 -1
  415. package/shaders/NormalMapShader.js +36 -21
  416. package/shaders/NormalMapShader.js.map +1 -1
  417. package/shaders/ParallaxShader.cjs +147 -97
  418. package/shaders/ParallaxShader.cjs.map +1 -1
  419. package/shaders/ParallaxShader.js +147 -97
  420. package/shaders/ParallaxShader.js.map +1 -1
  421. package/shaders/PixelShader.cjs +31 -18
  422. package/shaders/PixelShader.cjs.map +1 -1
  423. package/shaders/PixelShader.js +31 -18
  424. package/shaders/PixelShader.js.map +1 -1
  425. package/shaders/RGBShiftShader.cjs +33 -20
  426. package/shaders/RGBShiftShader.cjs.map +1 -1
  427. package/shaders/RGBShiftShader.js +33 -20
  428. package/shaders/RGBShiftShader.js.map +1 -1
  429. package/shaders/SAOShader.cjs +154 -117
  430. package/shaders/SAOShader.cjs.map +1 -1
  431. package/shaders/SAOShader.js +154 -117
  432. package/shaders/SAOShader.js.map +1 -1
  433. package/shaders/SMAAShader.cjs +358 -270
  434. package/shaders/SMAAShader.cjs.map +1 -1
  435. package/shaders/SMAAShader.js +358 -270
  436. package/shaders/SMAAShader.js.map +1 -1
  437. package/shaders/SSAOShader.cjs +236 -142
  438. package/shaders/SSAOShader.cjs.map +1 -1
  439. package/shaders/SSAOShader.js +236 -142
  440. package/shaders/SSAOShader.js.map +1 -1
  441. package/shaders/SSRShader.cjs +4 -4
  442. package/shaders/SSRShader.cjs.map +1 -1
  443. package/shaders/SSRShader.js +4 -4
  444. package/shaders/SSRShader.js.map +1 -1
  445. package/shaders/SepiaShader.cjs +36 -20
  446. package/shaders/SepiaShader.cjs.map +1 -1
  447. package/shaders/SepiaShader.js +36 -20
  448. package/shaders/SepiaShader.js.map +1 -1
  449. package/shaders/SobelOperatorShader.cjs +64 -37
  450. package/shaders/SobelOperatorShader.cjs.map +1 -1
  451. package/shaders/SobelOperatorShader.js +64 -37
  452. package/shaders/SobelOperatorShader.js.map +1 -1
  453. package/shaders/TechnicolorShader.cjs +29 -16
  454. package/shaders/TechnicolorShader.cjs.map +1 -1
  455. package/shaders/TechnicolorShader.js +29 -16
  456. package/shaders/TechnicolorShader.js.map +1 -1
  457. package/shaders/ToneMapShader.cjs +55 -35
  458. package/shaders/ToneMapShader.cjs.map +1 -1
  459. package/shaders/ToneMapShader.js +55 -35
  460. package/shaders/ToneMapShader.js.map +1 -1
  461. package/shaders/ToonShader.cjs +275 -165
  462. package/shaders/ToonShader.cjs.map +1 -1
  463. package/shaders/ToonShader.js +275 -165
  464. package/shaders/ToonShader.js.map +1 -1
  465. package/shaders/TriangleBlurShader.cjs +50 -27
  466. package/shaders/TriangleBlurShader.cjs.map +1 -1
  467. package/shaders/TriangleBlurShader.js +50 -27
  468. package/shaders/TriangleBlurShader.js.map +1 -1
  469. package/shaders/UnpackDepthRGBAShader.cjs +32 -17
  470. package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
  471. package/shaders/UnpackDepthRGBAShader.js +32 -17
  472. package/shaders/UnpackDepthRGBAShader.js.map +1 -1
  473. package/shaders/VerticalTiltShiftShader.cjs +43 -27
  474. package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
  475. package/shaders/VerticalTiltShiftShader.js +43 -27
  476. package/shaders/VerticalTiltShiftShader.js.map +1 -1
  477. package/shaders/VignetteShader.cjs +43 -27
  478. package/shaders/VignetteShader.cjs.map +1 -1
  479. package/shaders/VignetteShader.js +43 -27
  480. package/shaders/VignetteShader.js.map +1 -1
  481. package/shaders/VolumeShader.cjs +264 -213
  482. package/shaders/VolumeShader.cjs.map +1 -1
  483. package/shaders/VolumeShader.js +264 -213
  484. package/shaders/VolumeShader.js.map +1 -1
  485. package/shaders/WaterRefractionShader.cjs +63 -35
  486. package/shaders/WaterRefractionShader.cjs.map +1 -1
  487. package/shaders/WaterRefractionShader.js +63 -35
  488. package/shaders/WaterRefractionShader.js.map +1 -1
  489. package/utils/GeometryCompressionUtils.cjs +2 -1
  490. package/utils/GeometryCompressionUtils.cjs.map +1 -1
  491. package/utils/GeometryCompressionUtils.js +3 -2
  492. package/utils/GeometryCompressionUtils.js.map +1 -1
  493. package/utils/RoughnessMipmapper.cjs +3 -3
  494. package/utils/RoughnessMipmapper.cjs.map +1 -1
  495. package/utils/RoughnessMipmapper.js +4 -4
  496. package/utils/RoughnessMipmapper.js.map +1 -1
  497. package/webxr/ARButton.cjs +109 -106
  498. package/webxr/ARButton.cjs.map +1 -1
  499. package/webxr/ARButton.d.ts +4 -3
  500. package/webxr/ARButton.js +109 -106
  501. package/webxr/ARButton.js.map +1 -1
  502. package/webxr/OculusHandPointerModel.cjs +2 -2
  503. package/webxr/OculusHandPointerModel.cjs.map +1 -1
  504. package/webxr/OculusHandPointerModel.js +2 -2
  505. package/webxr/OculusHandPointerModel.js.map +1 -1
  506. package/webxr/VRButton.cjs +98 -95
  507. package/webxr/VRButton.cjs.map +1 -1
  508. package/webxr/VRButton.d.ts +6 -5
  509. package/webxr/VRButton.js +98 -95
  510. package/webxr/VRButton.js.map +1 -1
  511. package/webxr/XRHandPrimitiveModel.cjs +2 -2
  512. package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
  513. package/webxr/XRHandPrimitiveModel.js +3 -3
  514. package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MMDAnimationHelper.cjs","sources":["../../src/animation/MMDAnimationHelper.js"],"sourcesContent":["import { AnimationMixer, Object3D, Quaternion, Vector3 } from 'three'\nimport { CCDIKSolver } from '../animation/CCDIKSolver'\nimport { MMDPhysics } from '../animation/MMDPhysics'\n\n/**\n * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader\n * with MMD special features as IK, Grant, and Physics.\n *\n * Dependencies\n * - ammo.js https://github.com/kripken/ammo.js\n * - MMDPhysics\n * - CCDIKSolver\n *\n * TODO\n * - more precise grant skinning support.\n */\nclass MMDAnimationHelper {\n /**\n * @param {Object} params - (optional)\n * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.\n * @param {Number} params.afterglow - Default is 0.0.\n * @param {boolean} params.resetPhysicsOnLoop - Default is true.\n */\n constructor(params = {}) {\n this.meshes = []\n\n this.camera = null\n this.cameraTarget = new Object3D()\n this.cameraTarget.name = 'target'\n\n this.audio = null\n this.audioManager = null\n\n this.objects = new WeakMap()\n\n this.configuration = {\n sync: params.sync !== undefined ? params.sync : true,\n afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,\n resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,\n pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false,\n }\n\n this.enabled = {\n animation: true,\n ik: true,\n grant: true,\n physics: true,\n cameraAnimation: true,\n }\n\n this.onBeforePhysics = function (/* mesh */) {}\n\n // experimental\n this.sharedPhysics = false\n this.masterPhysics = null\n }\n\n /**\n * Adds an Three.js Object to helper and setups animation.\n * The anmation durations of added objects are synched\n * if this.configuration.sync is true.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @param {Object} params - (optional)\n * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.\n * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.\n * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.\n * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.\n * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.\n * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).\n * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.\n * @return {MMDAnimationHelper}\n */\n add(object, params = {}) {\n if (object.isSkinnedMesh) {\n this._addMesh(object, params)\n } else if (object.isCamera) {\n this._setupCamera(object, params)\n } else if (object.type === 'Audio') {\n this._setupAudio(object, params)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.add: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Removes an Three.js Object from helper.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @return {MMDAnimationHelper}\n */\n remove(object) {\n if (object.isSkinnedMesh) {\n this._removeMesh(object)\n } else if (object.isCamera) {\n this._clearCamera(object)\n } else if (object.type === 'Audio') {\n this._clearAudio(object)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.remove: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Updates the animation.\n *\n * @param {Number} delta\n * @return {MMDAnimationHelper}\n */\n update(delta) {\n if (this.audioManager !== null) this.audioManager.control(delta)\n\n for (let i = 0; i < this.meshes.length; i++) {\n this._animateMesh(this.meshes[i], delta)\n }\n\n if (this.sharedPhysics) this._updateSharedPhysics(delta)\n\n if (this.camera !== null) this._animateCamera(this.camera, delta)\n\n return this\n }\n\n /**\n * Changes the pose of SkinnedMesh as VPD specifies.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @param {Object} vpd - VPD content parsed MMDParser\n * @param {Object} params - (optional)\n * @param {boolean} params.resetPose - Default is true.\n * @param {boolean} params.ik - Default is true.\n * @param {boolean} params.grant - Default is true.\n * @return {MMDAnimationHelper}\n */\n pose(mesh, vpd, params = {}) {\n if (params.resetPose !== false) mesh.pose()\n\n const bones = mesh.skeleton.bones\n const boneParams = vpd.bones\n\n const boneNameDictionary = {}\n\n for (let i = 0, il = bones.length; i < il; i++) {\n boneNameDictionary[bones[i].name] = i\n }\n\n const vector = new Vector3()\n const quaternion = new Quaternion()\n\n for (let i = 0, il = boneParams.length; i < il; i++) {\n const boneParam = boneParams[i]\n const boneIndex = boneNameDictionary[boneParam.name]\n\n if (boneIndex === undefined) continue\n\n const bone = bones[boneIndex]\n bone.position.add(vector.fromArray(boneParam.translation))\n bone.quaternion.multiply(quaternion.fromArray(boneParam.quaternion))\n }\n\n mesh.updateMatrixWorld(true)\n\n // PMX animation system special path\n if (this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx') {\n const sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n const ikSolver = params.ik !== false ? this._createCCDIKSolver(mesh) : null\n const grantSolver = params.grant !== false ? this.createGrantSolver(mesh) : null\n this._animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver)\n } else {\n if (params.ik !== false) {\n this._createCCDIKSolver(mesh).update()\n }\n\n if (params.grant !== false) {\n this.createGrantSolver(mesh).update()\n }\n }\n\n return this\n }\n\n /**\n * Enabes/Disables an animation feature.\n *\n * @param {string} key\n * @param {boolean} enabled\n * @return {MMDAnimationHelper}\n */\n enable(key, enabled) {\n if (this.enabled[key] === undefined) {\n throw new Error('THREE.MMDAnimationHelper.enable: ' + 'unknown key ' + key)\n }\n\n this.enabled[key] = enabled\n\n if (key === 'physics') {\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n this._optimizeIK(this.meshes[i], enabled)\n }\n }\n\n return this\n }\n\n /**\n * Creates an GrantSolver instance.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @return {GrantSolver}\n */\n createGrantSolver(mesh) {\n return new GrantSolver(mesh, mesh.geometry.userData.MMD.grants)\n }\n\n // private methods\n\n _addMesh(mesh, params) {\n if (this.meshes.indexOf(mesh) >= 0) {\n throw new Error('THREE.MMDAnimationHelper._addMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has already been added.\")\n }\n\n this.meshes.push(mesh)\n this.objects.set(mesh, { looped: false })\n\n this._setupMeshAnimation(mesh, params.animation)\n\n if (params.physics !== false) {\n this._setupMeshPhysics(mesh, params)\n }\n\n return this\n }\n\n _setupCamera(camera, params) {\n if (this.camera === camera) {\n throw new Error('THREE.MMDAnimationHelper._setupCamera: ' + \"Camera '\" + camera.name + \"' has already been set.\")\n }\n\n if (this.camera) this.clearCamera(this.camera)\n\n this.camera = camera\n\n camera.add(this.cameraTarget)\n\n this.objects.set(camera, {})\n\n if (params.animation !== undefined) {\n this._setupCameraAnimation(camera, params.animation)\n }\n\n return this\n }\n\n _setupAudio(audio, params) {\n if (this.audio === audio) {\n throw new Error('THREE.MMDAnimationHelper._setupAudio: ' + \"Audio '\" + audio.name + \"' has already been set.\")\n }\n\n if (this.audio) this.clearAudio(this.audio)\n\n this.audio = audio\n this.audioManager = new AudioManager(audio, params)\n\n this.objects.set(this.audioManager, {\n duration: this.audioManager.duration,\n })\n\n return this\n }\n\n _removeMesh(mesh) {\n let found = false\n let writeIndex = 0\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n if (this.meshes[i] === mesh) {\n this.objects.delete(mesh)\n found = true\n\n continue\n }\n\n this.meshes[writeIndex++] = this.meshes[i]\n }\n\n if (!found) {\n throw new Error(\n 'THREE.MMDAnimationHelper._removeMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has not been added yet.\",\n )\n }\n\n this.meshes.length = writeIndex\n\n return this\n }\n\n _clearCamera(camera) {\n if (camera !== this.camera) {\n throw new Error('THREE.MMDAnimationHelper._clearCamera: ' + \"Camera '\" + camera.name + \"' has not been set yet.\")\n }\n\n this.camera.remove(this.cameraTarget)\n\n this.objects.delete(this.camera)\n this.camera = null\n\n return this\n }\n\n _clearAudio(audio) {\n if (audio !== this.audio) {\n throw new Error('THREE.MMDAnimationHelper._clearAudio: ' + \"Audio '\" + audio.name + \"' has not been set yet.\")\n }\n\n this.objects.delete(this.audioManager)\n\n this.audio = null\n this.audioManager = null\n\n return this\n }\n\n _setupMeshAnimation(mesh, animation) {\n const objects = this.objects.get(mesh)\n\n if (animation !== undefined) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n objects.mixer = new AnimationMixer(mesh)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n\n // TODO: find a workaround not to access ._clip looking like a private property\n objects.mixer.addEventListener('loop', function (event) {\n const tracks = event.action._clip.tracks\n\n if (tracks.length > 0 && tracks[0].name.slice(0, 6) !== '.bones') return\n\n objects.looped = true\n })\n }\n\n objects.ikSolver = this._createCCDIKSolver(mesh)\n objects.grantSolver = this.createGrantSolver(mesh)\n\n return this\n }\n\n _setupCameraAnimation(camera, animation) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n const objects = this.objects.get(camera)\n\n objects.mixer = new AnimationMixer(camera)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n }\n\n _setupMeshPhysics(mesh, params) {\n const objects = this.objects.get(mesh)\n\n // shared physics is experimental\n\n if (params.world === undefined && this.sharedPhysics) {\n const masterPhysics = this._getMasterPhysics()\n\n if (masterPhysics !== null) world = masterPhysics.world // eslint-disable-line no-undef\n }\n\n objects.physics = this._createMMDPhysics(mesh, params)\n\n if (objects.mixer && params.animationWarmup !== false) {\n this._animateMesh(mesh, 0)\n objects.physics.reset()\n }\n\n objects.physics.warmup(params.warmup !== undefined ? params.warmup : 60)\n\n this._optimizeIK(mesh, true)\n }\n\n _animateMesh(mesh, delta) {\n const objects = this.objects.get(mesh)\n\n const mixer = objects.mixer\n const ikSolver = objects.ikSolver\n const grantSolver = objects.grantSolver\n const physics = objects.physics\n const looped = objects.looped\n\n if (mixer && this.enabled.animation) {\n // alternate solution to save/restore bones but less performant?\n //mesh.pose();\n //this._updatePropertyMixersBuffer( mesh );\n\n this._restoreBones(mesh)\n\n mixer.update(delta)\n\n this._saveBones(mesh)\n\n // PMX animation system special path\n if (\n this.configuration.pmxAnimation &&\n mesh.geometry.userData.MMD &&\n mesh.geometry.userData.MMD.format === 'pmx'\n ) {\n if (!objects.sortedBonesData)\n objects.sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n\n this._animatePMXMesh(\n mesh,\n objects.sortedBonesData,\n ikSolver && this.enabled.ik ? ikSolver : null,\n grantSolver && this.enabled.grant ? grantSolver : null,\n )\n } else {\n if (ikSolver && this.enabled.ik) {\n mesh.updateMatrixWorld(true)\n ikSolver.update()\n }\n\n if (grantSolver && this.enabled.grant) {\n grantSolver.update()\n }\n }\n }\n\n if (looped === true && this.enabled.physics) {\n if (physics && this.configuration.resetPhysicsOnLoop) physics.reset()\n\n objects.looped = false\n }\n\n if (physics && this.enabled.physics && !this.sharedPhysics) {\n this.onBeforePhysics(mesh)\n physics.update(delta)\n }\n }\n\n // Sort bones in order by 1. transformationClass and 2. bone index.\n // In PMX animation system, bone transformations should be processed\n // in this order.\n _sortBoneDataArray(boneDataArray) {\n return boneDataArray.sort(function (a, b) {\n if (a.transformationClass !== b.transformationClass) {\n return a.transformationClass - b.transformationClass\n } else {\n return a.index - b.index\n }\n })\n }\n\n // PMX Animation system is a bit too complex and doesn't great match to\n // Three.js Animation system. This method attempts to simulate it as much as\n // possible but doesn't perfectly simulate.\n // This method is more costly than the regular one so\n // you are recommended to set constructor parameter \"pmxAnimation: true\"\n // only if your PMX model animation doesn't work well.\n // If you need better method you would be required to write your own.\n _animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver) {\n _quaternionIndex = 0\n _grantResultMap.clear()\n\n for (let i = 0, il = sortedBonesData.length; i < il; i++) {\n updateOne(mesh, sortedBonesData[i].index, ikSolver, grantSolver)\n }\n\n mesh.updateMatrixWorld(true)\n return this\n }\n\n _animateCamera(camera, delta) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer && this.enabled.cameraAnimation) {\n mixer.update(delta)\n\n camera.updateProjectionMatrix()\n\n camera.up.set(0, 1, 0)\n camera.up.applyQuaternion(camera.quaternion)\n camera.lookAt(this.cameraTarget.position)\n }\n }\n\n _optimizeIK(mesh, physicsEnabled) {\n const iks = mesh.geometry.userData.MMD.iks\n const bones = mesh.geometry.userData.MMD.bones\n\n for (let i = 0, il = iks.length; i < il; i++) {\n const ik = iks[i]\n const links = ik.links\n\n for (let j = 0, jl = links.length; j < jl; j++) {\n const link = links[j]\n\n if (physicsEnabled === true) {\n // disable IK of the bone the corresponding rigidBody type of which is 1 or 2\n // because its rotation will be overriden by physics\n link.enabled = bones[link.index].rigidBodyType > 0 ? false : true\n } else {\n link.enabled = true\n }\n }\n }\n }\n\n _createCCDIKSolver(mesh) {\n if (CCDIKSolver === undefined) {\n throw new Error('THREE.MMDAnimationHelper: Import CCDIKSolver.')\n }\n\n return new CCDIKSolver(mesh, mesh.geometry.userData.MMD.iks)\n }\n\n _createMMDPhysics(mesh, params) {\n if (MMDPhysics === undefined) {\n throw new Error('THREE.MMDPhysics: Import MMDPhysics.')\n }\n\n return new MMDPhysics(mesh, mesh.geometry.userData.MMD.rigidBodies, mesh.geometry.userData.MMD.constraints, params)\n }\n\n /*\n * Detects the longest duration and then sets it to them to sync.\n * TODO: Not to access private properties ( ._actions and ._clip )\n */\n _syncDuration() {\n let max = 0.0\n\n const objects = this.objects\n const meshes = this.meshes\n const camera = this.camera\n const audioManager = this.audioManager\n\n // get the longest duration\n\n for (let i = 0, il = meshes.length; i < il; i++) {\n const mixer = this.objects.get(meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0; j < mixer._actions.length; j++) {\n const clip = mixer._actions[j]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n const clip = mixer._actions[i]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n }\n\n if (audioManager !== null) {\n max = Math.max(max, objects.get(audioManager).duration)\n }\n\n max += this.configuration.afterglow\n\n // update the duration\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const mixer = this.objects.get(this.meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0, jl = mixer._actions.length; j < jl; j++) {\n mixer._actions[j]._clip.duration = max\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n mixer._actions[i]._clip.duration = max\n }\n }\n }\n\n if (audioManager !== null) {\n audioManager.duration = max\n }\n }\n\n // workaround\n\n _updatePropertyMixersBuffer(mesh) {\n const mixer = this.objects.get(mesh).mixer\n\n const propertyMixers = mixer._bindings\n const accuIndex = mixer._accuIndex\n\n for (let i = 0, il = propertyMixers.length; i < il; i++) {\n const propertyMixer = propertyMixers[i]\n const buffer = propertyMixer.buffer\n const stride = propertyMixer.valueSize\n const offset = (accuIndex + 1) * stride\n\n propertyMixer.binding.getValue(buffer, offset)\n }\n }\n\n /*\n * Avoiding these two issues by restore/save bones before/after mixer animation.\n *\n * 1. PropertyMixer used by AnimationMixer holds cache value in .buffer.\n * Calculating IK, Grant, and Physics after mixer animation can break\n * the cache coherency.\n *\n * 2. Applying Grant two or more times without reset the posing breaks model.\n */\n _saveBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const bones = mesh.skeleton.bones\n\n let backupBones = objects.backupBones\n\n if (backupBones === undefined) {\n backupBones = new Float32Array(bones.length * 7)\n objects.backupBones = backupBones\n }\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.toArray(backupBones, i * 7)\n bone.quaternion.toArray(backupBones, i * 7 + 3)\n }\n }\n\n _restoreBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const backupBones = objects.backupBones\n\n if (backupBones === undefined) return\n\n const bones = mesh.skeleton.bones\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.fromArray(backupBones, i * 7)\n bone.quaternion.fromArray(backupBones, i * 7 + 3)\n }\n }\n\n // experimental\n\n _getMasterPhysics() {\n if (this.masterPhysics !== null) return this.masterPhysics\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const physics = this.meshes[i].physics\n\n if (physics !== undefined && physics !== null) {\n this.masterPhysics = physics\n return this.masterPhysics\n }\n }\n\n return null\n }\n\n _updateSharedPhysics(delta) {\n if (this.meshes.length === 0 || !this.enabled.physics || !this.sharedPhysics) return\n\n const physics = this._getMasterPhysics()\n\n if (physics === null) return\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateRigidBodies()\n }\n }\n\n physics.stepSimulation(delta)\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateBones()\n }\n }\n }\n}\n\n// Keep working quaternions for less GC\nconst _quaternions = []\nlet _quaternionIndex = 0\n\nfunction getQuaternion() {\n if (_quaternionIndex >= _quaternions.length) {\n _quaternions.push(new Quaternion())\n }\n\n return _quaternions[_quaternionIndex++]\n}\n\n// Save rotation whose grant and IK are already applied\n// used by grant children\nconst _grantResultMap = new Map()\n\nfunction updateOne(mesh, boneIndex, ikSolver, grantSolver) {\n const bones = mesh.skeleton.bones\n const bonesData = mesh.geometry.userData.MMD.bones\n const boneData = bonesData[boneIndex]\n const bone = bones[boneIndex]\n\n // Return if already updated by being referred as a grant parent.\n if (_grantResultMap.has(boneIndex)) return\n\n const quaternion = getQuaternion()\n\n // Initialize grant result here to prevent infinite loop.\n // If it's referred before updating with actual result later\n // result without applyting IK or grant is gotten\n // but better than composing of infinite loop.\n _grantResultMap.set(boneIndex, quaternion.copy(bone.quaternion))\n\n // @TODO: Support global grant and grant position\n if (grantSolver && boneData.grant && !boneData.grant.isLocal && boneData.grant.affectRotation) {\n const parentIndex = boneData.grant.parentIndex\n const ratio = boneData.grant.ratio\n\n if (!_grantResultMap.has(parentIndex)) {\n updateOne(mesh, parentIndex, ikSolver, grantSolver)\n }\n\n grantSolver.addGrantRotation(bone, _grantResultMap.get(parentIndex), ratio)\n }\n\n if (ikSolver && boneData.ik) {\n // @TODO: Updating world matrices every time solving an IK bone is\n // costly. Optimize if possible.\n mesh.updateMatrixWorld(true)\n ikSolver.updateOne(boneData.ik)\n\n // No confident, but it seems the grant results with ik links should be updated?\n const links = boneData.ik.links\n\n for (let i = 0, il = links.length; i < il; i++) {\n const link = links[i]\n\n if (link.enabled === false) continue\n\n const linkIndex = link.index\n\n if (_grantResultMap.has(linkIndex)) {\n _grantResultMap.set(linkIndex, _grantResultMap.get(linkIndex).copy(bones[linkIndex].quaternion))\n }\n }\n }\n\n // Update with the actual result here\n quaternion.copy(bone.quaternion)\n}\n\n//\n\nclass AudioManager {\n /**\n * @param {THREE.Audio} audio\n * @param {Object} params - (optional)\n * @param {Nuumber} params.delayTime\n */\n constructor(audio, params = {}) {\n this.audio = audio\n\n this.elapsedTime = 0.0\n this.currentTime = 0.0\n this.delayTime = params.delayTime !== undefined ? params.delayTime : 0.0\n\n this.audioDuration = this.audio.buffer.duration\n this.duration = this.audioDuration + this.delayTime\n }\n\n /**\n * @param {Number} delta\n * @return {AudioManager}\n */\n control(delta) {\n this.elapsed += delta\n this.currentTime += delta\n\n if (this._shouldStopAudio()) this.audio.stop()\n if (this._shouldStartAudio()) this.audio.play()\n\n return this\n }\n\n // private methods\n\n _shouldStartAudio() {\n if (this.audio.isPlaying) return false\n\n while (this.currentTime >= this.duration) {\n this.currentTime -= this.duration\n }\n\n if (this.currentTime < this.delayTime) return false\n\n // 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration\n if (this.currentTime - this.delayTime > this.audioDuration) return false\n\n return true\n }\n\n _shouldStopAudio() {\n return this.audio.isPlaying && this.currentTime >= this.duration\n }\n}\n\nconst _q = new Quaternion()\n\n/**\n * Solver for Grant (Fuyo in Japanese. I just google translated because\n * Fuyo may be MMD specific term and may not be common word in 3D CG terms.)\n * Grant propagates a bone's transform to other bones transforms even if\n * they are not children.\n * @param {THREE.SkinnedMesh} mesh\n * @param {Array<Object>} grants\n */\nclass GrantSolver {\n constructor(mesh, grants = []) {\n this.mesh = mesh\n this.grants = grants\n }\n\n /**\n * Solve all the grant bones\n * @return {GrantSolver}\n */\n update() {\n const grants = this.grants\n\n for (let i = 0, il = grants.length; i < il; i++) {\n this.updateOne(grants[i])\n }\n\n return this\n }\n\n /**\n * Solve a grant bone\n * @param {Object} grant - grant parameter\n * @return {GrantSolver}\n */\n updateOne(grant) {\n const bones = this.mesh.skeleton.bones\n const bone = bones[grant.index]\n const parentBone = bones[grant.parentIndex]\n\n if (grant.isLocal) {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n // TODO: implement\n if (grant.affectRotation) {\n }\n } else {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n if (grant.affectRotation) {\n this.addGrantRotation(bone, parentBone.quaternion, grant.ratio)\n }\n }\n\n return this\n }\n\n addGrantRotation(bone, q, ratio) {\n _q.set(0, 0, 0, 1)\n _q.slerp(q, ratio)\n bone.quaternion.multiply(_q)\n\n return this\n }\n}\n\nexport { MMDAnimationHelper }\n"],"names":["Object3D","Vector3","Quaternion","AnimationMixer","CCDIKSolver","MMDPhysics"],"mappings":"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"}
1
+ {"version":3,"file":"MMDAnimationHelper.cjs","sources":["../../src/animation/MMDAnimationHelper.js"],"sourcesContent":["import { AnimationMixer, Object3D, Quaternion, Vector3 } from 'three'\nimport { CCDIKSolver } from '../animation/CCDIKSolver'\nimport { MMDPhysics } from '../animation/MMDPhysics'\n\n/**\n * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader\n * with MMD special features as IK, Grant, and Physics.\n *\n * Dependencies\n * - ammo.js https://github.com/kripken/ammo.js\n * - MMDPhysics\n * - CCDIKSolver\n *\n * TODO\n * - more precise grant skinning support.\n */\nclass MMDAnimationHelper {\n /**\n * @param {Object} params - (optional)\n * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.\n * @param {Number} params.afterglow - Default is 0.0.\n * @param {boolean} params.resetPhysicsOnLoop - Default is true.\n */\n constructor(params = {}) {\n this.meshes = []\n\n this.camera = null\n this.cameraTarget = new Object3D()\n this.cameraTarget.name = 'target'\n\n this.audio = null\n this.audioManager = null\n\n this.objects = new WeakMap()\n\n this.configuration = {\n sync: params.sync !== undefined ? params.sync : true,\n afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,\n resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,\n pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false,\n }\n\n this.enabled = {\n animation: true,\n ik: true,\n grant: true,\n physics: true,\n cameraAnimation: true,\n }\n\n this.onBeforePhysics = function (/* mesh */) {}\n\n // experimental\n this.sharedPhysics = false\n this.masterPhysics = null\n }\n\n /**\n * Adds an Three.js Object to helper and setups animation.\n * The anmation durations of added objects are synched\n * if this.configuration.sync is true.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @param {Object} params - (optional)\n * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.\n * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.\n * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.\n * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.\n * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.\n * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).\n * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.\n * @return {MMDAnimationHelper}\n */\n add(object, params = {}) {\n if (object.isSkinnedMesh) {\n this._addMesh(object, params)\n } else if (object.isCamera) {\n this._setupCamera(object, params)\n } else if (object.type === 'Audio') {\n this._setupAudio(object, params)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.add: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Removes an Three.js Object from helper.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @return {MMDAnimationHelper}\n */\n remove(object) {\n if (object.isSkinnedMesh) {\n this._removeMesh(object)\n } else if (object.isCamera) {\n this._clearCamera(object)\n } else if (object.type === 'Audio') {\n this._clearAudio(object)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.remove: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Updates the animation.\n *\n * @param {Number} delta\n * @return {MMDAnimationHelper}\n */\n update(delta) {\n if (this.audioManager !== null) this.audioManager.control(delta)\n\n for (let i = 0; i < this.meshes.length; i++) {\n this._animateMesh(this.meshes[i], delta)\n }\n\n if (this.sharedPhysics) this._updateSharedPhysics(delta)\n\n if (this.camera !== null) this._animateCamera(this.camera, delta)\n\n return this\n }\n\n /**\n * Changes the pose of SkinnedMesh as VPD specifies.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @param {Object} vpd - VPD content parsed MMDParser\n * @param {Object} params - (optional)\n * @param {boolean} params.resetPose - Default is true.\n * @param {boolean} params.ik - Default is true.\n * @param {boolean} params.grant - Default is true.\n * @return {MMDAnimationHelper}\n */\n pose(mesh, vpd, params = {}) {\n if (params.resetPose !== false) mesh.pose()\n\n const bones = mesh.skeleton.bones\n const boneParams = vpd.bones\n\n const boneNameDictionary = {}\n\n for (let i = 0, il = bones.length; i < il; i++) {\n boneNameDictionary[bones[i].name] = i\n }\n\n const vector = new Vector3()\n const quaternion = new Quaternion()\n\n for (let i = 0, il = boneParams.length; i < il; i++) {\n const boneParam = boneParams[i]\n const boneIndex = boneNameDictionary[boneParam.name]\n\n if (boneIndex === undefined) continue\n\n const bone = bones[boneIndex]\n bone.position.add(vector.fromArray(boneParam.translation))\n bone.quaternion.multiply(quaternion.fromArray(boneParam.quaternion))\n }\n\n mesh.updateMatrixWorld(true)\n\n // PMX animation system special path\n if (this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx') {\n const sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n const ikSolver = params.ik !== false ? this._createCCDIKSolver(mesh) : null\n const grantSolver = params.grant !== false ? this.createGrantSolver(mesh) : null\n this._animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver)\n } else {\n if (params.ik !== false) {\n this._createCCDIKSolver(mesh).update()\n }\n\n if (params.grant !== false) {\n this.createGrantSolver(mesh).update()\n }\n }\n\n return this\n }\n\n /**\n * Enabes/Disables an animation feature.\n *\n * @param {string} key\n * @param {boolean} enabled\n * @return {MMDAnimationHelper}\n */\n enable(key, enabled) {\n if (this.enabled[key] === undefined) {\n throw new Error('THREE.MMDAnimationHelper.enable: ' + 'unknown key ' + key)\n }\n\n this.enabled[key] = enabled\n\n if (key === 'physics') {\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n this._optimizeIK(this.meshes[i], enabled)\n }\n }\n\n return this\n }\n\n /**\n * Creates an GrantSolver instance.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @return {GrantSolver}\n */\n createGrantSolver(mesh) {\n return new GrantSolver(mesh, mesh.geometry.userData.MMD.grants)\n }\n\n // private methods\n\n _addMesh(mesh, params) {\n if (this.meshes.indexOf(mesh) >= 0) {\n throw new Error('THREE.MMDAnimationHelper._addMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has already been added.\")\n }\n\n this.meshes.push(mesh)\n this.objects.set(mesh, { looped: false })\n\n this._setupMeshAnimation(mesh, params.animation)\n\n if (params.physics !== false) {\n this._setupMeshPhysics(mesh, params)\n }\n\n return this\n }\n\n _setupCamera(camera, params) {\n if (this.camera === camera) {\n throw new Error('THREE.MMDAnimationHelper._setupCamera: ' + \"Camera '\" + camera.name + \"' has already been set.\")\n }\n\n if (this.camera) this.clearCamera(this.camera)\n\n this.camera = camera\n\n camera.add(this.cameraTarget)\n\n this.objects.set(camera, {})\n\n if (params.animation !== undefined) {\n this._setupCameraAnimation(camera, params.animation)\n }\n\n return this\n }\n\n _setupAudio(audio, params) {\n if (this.audio === audio) {\n throw new Error('THREE.MMDAnimationHelper._setupAudio: ' + \"Audio '\" + audio.name + \"' has already been set.\")\n }\n\n if (this.audio) this.clearAudio(this.audio)\n\n this.audio = audio\n this.audioManager = new AudioManager(audio, params)\n\n this.objects.set(this.audioManager, {\n duration: this.audioManager.duration,\n })\n\n return this\n }\n\n _removeMesh(mesh) {\n let found = false\n let writeIndex = 0\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n if (this.meshes[i] === mesh) {\n this.objects.delete(mesh)\n found = true\n\n continue\n }\n\n this.meshes[writeIndex++] = this.meshes[i]\n }\n\n if (!found) {\n throw new Error(\n 'THREE.MMDAnimationHelper._removeMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has not been added yet.\",\n )\n }\n\n this.meshes.length = writeIndex\n\n return this\n }\n\n _clearCamera(camera) {\n if (camera !== this.camera) {\n throw new Error('THREE.MMDAnimationHelper._clearCamera: ' + \"Camera '\" + camera.name + \"' has not been set yet.\")\n }\n\n this.camera.remove(this.cameraTarget)\n\n this.objects.delete(this.camera)\n this.camera = null\n\n return this\n }\n\n _clearAudio(audio) {\n if (audio !== this.audio) {\n throw new Error('THREE.MMDAnimationHelper._clearAudio: ' + \"Audio '\" + audio.name + \"' has not been set yet.\")\n }\n\n this.objects.delete(this.audioManager)\n\n this.audio = null\n this.audioManager = null\n\n return this\n }\n\n _setupMeshAnimation(mesh, animation) {\n const objects = this.objects.get(mesh)\n\n if (animation !== undefined) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n objects.mixer = new AnimationMixer(mesh)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n\n // TODO: find a workaround not to access ._clip looking like a private property\n objects.mixer.addEventListener('loop', function (event) {\n const tracks = event.action._clip.tracks\n\n if (tracks.length > 0 && tracks[0].name.slice(0, 6) !== '.bones') return\n\n objects.looped = true\n })\n }\n\n objects.ikSolver = this._createCCDIKSolver(mesh)\n objects.grantSolver = this.createGrantSolver(mesh)\n\n return this\n }\n\n _setupCameraAnimation(camera, animation) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n const objects = this.objects.get(camera)\n\n objects.mixer = new AnimationMixer(camera)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n }\n\n _setupMeshPhysics(mesh, params) {\n const objects = this.objects.get(mesh)\n\n // shared physics is experimental\n\n if (params.world === undefined && this.sharedPhysics) {\n const masterPhysics = this._getMasterPhysics()\n\n if (masterPhysics !== null) world = masterPhysics.world // eslint-disable-line no-undef\n }\n\n objects.physics = this._createMMDPhysics(mesh, params)\n\n if (objects.mixer && params.animationWarmup !== false) {\n this._animateMesh(mesh, 0)\n objects.physics.reset()\n }\n\n objects.physics.warmup(params.warmup !== undefined ? params.warmup : 60)\n\n this._optimizeIK(mesh, true)\n }\n\n _animateMesh(mesh, delta) {\n const objects = this.objects.get(mesh)\n\n const mixer = objects.mixer\n const ikSolver = objects.ikSolver\n const grantSolver = objects.grantSolver\n const physics = objects.physics\n const looped = objects.looped\n\n if (mixer && this.enabled.animation) {\n // alternate solution to save/restore bones but less performant?\n //mesh.pose();\n //this._updatePropertyMixersBuffer( mesh );\n\n this._restoreBones(mesh)\n\n mixer.update(delta)\n\n this._saveBones(mesh)\n\n // PMX animation system special path\n if (\n this.configuration.pmxAnimation &&\n mesh.geometry.userData.MMD &&\n mesh.geometry.userData.MMD.format === 'pmx'\n ) {\n if (!objects.sortedBonesData)\n objects.sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n\n this._animatePMXMesh(\n mesh,\n objects.sortedBonesData,\n ikSolver && this.enabled.ik ? ikSolver : null,\n grantSolver && this.enabled.grant ? grantSolver : null,\n )\n } else {\n if (ikSolver && this.enabled.ik) {\n mesh.updateMatrixWorld(true)\n ikSolver.update()\n }\n\n if (grantSolver && this.enabled.grant) {\n grantSolver.update()\n }\n }\n }\n\n if (looped === true && this.enabled.physics) {\n if (physics && this.configuration.resetPhysicsOnLoop) physics.reset()\n\n objects.looped = false\n }\n\n if (physics && this.enabled.physics && !this.sharedPhysics) {\n this.onBeforePhysics(mesh)\n physics.update(delta)\n }\n }\n\n // Sort bones in order by 1. transformationClass and 2. bone index.\n // In PMX animation system, bone transformations should be processed\n // in this order.\n _sortBoneDataArray(boneDataArray) {\n return boneDataArray.sort(function (a, b) {\n if (a.transformationClass !== b.transformationClass) {\n return a.transformationClass - b.transformationClass\n } else {\n return a.index - b.index\n }\n })\n }\n\n // PMX Animation system is a bit too complex and doesn't great match to\n // Three.js Animation system. This method attempts to simulate it as much as\n // possible but doesn't perfectly simulate.\n // This method is more costly than the regular one so\n // you are recommended to set constructor parameter \"pmxAnimation: true\"\n // only if your PMX model animation doesn't work well.\n // If you need better method you would be required to write your own.\n _animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver) {\n _quaternionIndex = 0\n _grantResultMap.clear()\n\n for (let i = 0, il = sortedBonesData.length; i < il; i++) {\n updateOne(mesh, sortedBonesData[i].index, ikSolver, grantSolver)\n }\n\n mesh.updateMatrixWorld(true)\n return this\n }\n\n _animateCamera(camera, delta) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer && this.enabled.cameraAnimation) {\n mixer.update(delta)\n\n camera.updateProjectionMatrix()\n\n camera.up.set(0, 1, 0)\n camera.up.applyQuaternion(camera.quaternion)\n camera.lookAt(this.cameraTarget.position)\n }\n }\n\n _optimizeIK(mesh, physicsEnabled) {\n const iks = mesh.geometry.userData.MMD.iks\n const bones = mesh.geometry.userData.MMD.bones\n\n for (let i = 0, il = iks.length; i < il; i++) {\n const ik = iks[i]\n const links = ik.links\n\n for (let j = 0, jl = links.length; j < jl; j++) {\n const link = links[j]\n\n if (physicsEnabled === true) {\n // disable IK of the bone the corresponding rigidBody type of which is 1 or 2\n // because its rotation will be overriden by physics\n link.enabled = bones[link.index].rigidBodyType > 0 ? false : true\n } else {\n link.enabled = true\n }\n }\n }\n }\n\n _createCCDIKSolver(mesh) {\n if (CCDIKSolver === undefined) {\n throw new Error('THREE.MMDAnimationHelper: Import CCDIKSolver.')\n }\n\n return new CCDIKSolver(mesh, mesh.geometry.userData.MMD.iks)\n }\n\n _createMMDPhysics(mesh, params) {\n if (MMDPhysics === undefined) {\n throw new Error('THREE.MMDPhysics: Import MMDPhysics.')\n }\n\n return new MMDPhysics(mesh, mesh.geometry.userData.MMD.rigidBodies, mesh.geometry.userData.MMD.constraints, params)\n }\n\n /*\n * Detects the longest duration and then sets it to them to sync.\n * TODO: Not to access private properties ( ._actions and ._clip )\n */\n _syncDuration() {\n let max = 0.0\n\n const objects = this.objects\n const meshes = this.meshes\n const camera = this.camera\n const audioManager = this.audioManager\n\n // get the longest duration\n\n for (let i = 0, il = meshes.length; i < il; i++) {\n const mixer = this.objects.get(meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0; j < mixer._actions.length; j++) {\n const clip = mixer._actions[j]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n const clip = mixer._actions[i]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n }\n\n if (audioManager !== null) {\n max = Math.max(max, objects.get(audioManager).duration)\n }\n\n max += this.configuration.afterglow\n\n // update the duration\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const mixer = this.objects.get(this.meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0, jl = mixer._actions.length; j < jl; j++) {\n mixer._actions[j]._clip.duration = max\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n mixer._actions[i]._clip.duration = max\n }\n }\n }\n\n if (audioManager !== null) {\n audioManager.duration = max\n }\n }\n\n // workaround\n\n _updatePropertyMixersBuffer(mesh) {\n const mixer = this.objects.get(mesh).mixer\n\n const propertyMixers = mixer._bindings\n const accuIndex = mixer._accuIndex\n\n for (let i = 0, il = propertyMixers.length; i < il; i++) {\n const propertyMixer = propertyMixers[i]\n const buffer = propertyMixer.buffer\n const stride = propertyMixer.valueSize\n const offset = (accuIndex + 1) * stride\n\n propertyMixer.binding.getValue(buffer, offset)\n }\n }\n\n /*\n * Avoiding these two issues by restore/save bones before/after mixer animation.\n *\n * 1. PropertyMixer used by AnimationMixer holds cache value in .buffer.\n * Calculating IK, Grant, and Physics after mixer animation can break\n * the cache coherency.\n *\n * 2. Applying Grant two or more times without reset the posing breaks model.\n */\n _saveBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const bones = mesh.skeleton.bones\n\n let backupBones = objects.backupBones\n\n if (backupBones === undefined) {\n backupBones = new Float32Array(bones.length * 7)\n objects.backupBones = backupBones\n }\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.toArray(backupBones, i * 7)\n bone.quaternion.toArray(backupBones, i * 7 + 3)\n }\n }\n\n _restoreBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const backupBones = objects.backupBones\n\n if (backupBones === undefined) return\n\n const bones = mesh.skeleton.bones\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.fromArray(backupBones, i * 7)\n bone.quaternion.fromArray(backupBones, i * 7 + 3)\n }\n }\n\n // experimental\n\n _getMasterPhysics() {\n if (this.masterPhysics !== null) return this.masterPhysics\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const physics = this.meshes[i].physics\n\n if (physics !== undefined && physics !== null) {\n this.masterPhysics = physics\n return this.masterPhysics\n }\n }\n\n return null\n }\n\n _updateSharedPhysics(delta) {\n if (this.meshes.length === 0 || !this.enabled.physics || !this.sharedPhysics) return\n\n const physics = this._getMasterPhysics()\n\n if (physics === null) return\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateRigidBodies()\n }\n }\n\n physics.stepSimulation(delta)\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateBones()\n }\n }\n }\n}\n\n// Keep working quaternions for less GC\nconst _quaternions = []\nlet _quaternionIndex = 0\n\nfunction getQuaternion() {\n if (_quaternionIndex >= _quaternions.length) {\n _quaternions.push(new Quaternion())\n }\n\n return _quaternions[_quaternionIndex++]\n}\n\n// Save rotation whose grant and IK are already applied\n// used by grant children\nconst _grantResultMap = new Map()\n\nfunction updateOne(mesh, boneIndex, ikSolver, grantSolver) {\n const bones = mesh.skeleton.bones\n const bonesData = mesh.geometry.userData.MMD.bones\n const boneData = bonesData[boneIndex]\n const bone = bones[boneIndex]\n\n // Return if already updated by being referred as a grant parent.\n if (_grantResultMap.has(boneIndex)) return\n\n const quaternion = getQuaternion()\n\n // Initialize grant result here to prevent infinite loop.\n // If it's referred before updating with actual result later\n // result without applyting IK or grant is gotten\n // but better than composing of infinite loop.\n _grantResultMap.set(boneIndex, quaternion.copy(bone.quaternion))\n\n // @TODO: Support global grant and grant position\n if (grantSolver && boneData.grant && !boneData.grant.isLocal && boneData.grant.affectRotation) {\n const parentIndex = boneData.grant.parentIndex\n const ratio = boneData.grant.ratio\n\n if (!_grantResultMap.has(parentIndex)) {\n updateOne(mesh, parentIndex, ikSolver, grantSolver)\n }\n\n grantSolver.addGrantRotation(bone, _grantResultMap.get(parentIndex), ratio)\n }\n\n if (ikSolver && boneData.ik) {\n // @TODO: Updating world matrices every time solving an IK bone is\n // costly. Optimize if possible.\n mesh.updateMatrixWorld(true)\n ikSolver.updateOne(boneData.ik)\n\n // No confident, but it seems the grant results with ik links should be updated?\n const links = boneData.ik.links\n\n for (let i = 0, il = links.length; i < il; i++) {\n const link = links[i]\n\n if (link.enabled === false) continue\n\n const linkIndex = link.index\n\n if (_grantResultMap.has(linkIndex)) {\n _grantResultMap.set(linkIndex, _grantResultMap.get(linkIndex).copy(bones[linkIndex].quaternion))\n }\n }\n }\n\n // Update with the actual result here\n quaternion.copy(bone.quaternion)\n}\n\n//\n\nclass AudioManager {\n /**\n * @param {THREE.Audio} audio\n * @param {Object} params - (optional)\n * @param {Nuumber} params.delayTime\n */\n constructor(audio, params = {}) {\n this.audio = audio\n\n this.elapsedTime = 0.0\n this.currentTime = 0.0\n this.delayTime = params.delayTime !== undefined ? params.delayTime : 0.0\n\n this.audioDuration = this.audio.buffer.duration\n this.duration = this.audioDuration + this.delayTime\n }\n\n /**\n * @param {Number} delta\n * @return {AudioManager}\n */\n control(delta) {\n this.elapsed += delta\n this.currentTime += delta\n\n if (this._shouldStopAudio()) this.audio.stop()\n if (this._shouldStartAudio()) this.audio.play()\n\n return this\n }\n\n // private methods\n\n _shouldStartAudio() {\n if (this.audio.isPlaying) return false\n\n while (this.currentTime >= this.duration) {\n this.currentTime -= this.duration\n }\n\n if (this.currentTime < this.delayTime) return false\n\n // 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration\n if (this.currentTime - this.delayTime > this.audioDuration) return false\n\n return true\n }\n\n _shouldStopAudio() {\n return this.audio.isPlaying && this.currentTime >= this.duration\n }\n}\n\nconst _q = /* @__PURE__ */ new Quaternion()\n\n/**\n * Solver for Grant (Fuyo in Japanese. I just google translated because\n * Fuyo may be MMD specific term and may not be common word in 3D CG terms.)\n * Grant propagates a bone's transform to other bones transforms even if\n * they are not children.\n * @param {THREE.SkinnedMesh} mesh\n * @param {Array<Object>} grants\n */\nclass GrantSolver {\n constructor(mesh, grants = []) {\n this.mesh = mesh\n this.grants = grants\n }\n\n /**\n * Solve all the grant bones\n * @return {GrantSolver}\n */\n update() {\n const grants = this.grants\n\n for (let i = 0, il = grants.length; i < il; i++) {\n this.updateOne(grants[i])\n }\n\n return this\n }\n\n /**\n * Solve a grant bone\n * @param {Object} grant - grant parameter\n * @return {GrantSolver}\n */\n updateOne(grant) {\n const bones = this.mesh.skeleton.bones\n const bone = bones[grant.index]\n const parentBone = bones[grant.parentIndex]\n\n if (grant.isLocal) {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n // TODO: implement\n if (grant.affectRotation) {\n }\n } else {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n if (grant.affectRotation) {\n this.addGrantRotation(bone, parentBone.quaternion, grant.ratio)\n }\n }\n\n return this\n }\n\n addGrantRotation(bone, q, ratio) {\n _q.set(0, 0, 0, 1)\n _q.slerp(q, ratio)\n bone.quaternion.multiply(_q)\n\n return this\n }\n}\n\nexport { MMDAnimationHelper }\n"],"names":["Object3D","Vector3","Quaternion","AnimationMixer","CCDIKSolver","MMDPhysics"],"mappings":"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"}
@@ -636,7 +636,7 @@ class AudioManager {
636
636
  return this.audio.isPlaying && this.currentTime >= this.duration;
637
637
  }
638
638
  }
639
- const _q = new Quaternion();
639
+ const _q = /* @__PURE__ */ new Quaternion();
640
640
  class GrantSolver {
641
641
  constructor(mesh, grants = []) {
642
642
  this.mesh = mesh;
@@ -1 +1 @@
1
- {"version":3,"file":"MMDAnimationHelper.js","sources":["../../src/animation/MMDAnimationHelper.js"],"sourcesContent":["import { AnimationMixer, Object3D, Quaternion, Vector3 } from 'three'\nimport { CCDIKSolver } from '../animation/CCDIKSolver'\nimport { MMDPhysics } from '../animation/MMDPhysics'\n\n/**\n * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader\n * with MMD special features as IK, Grant, and Physics.\n *\n * Dependencies\n * - ammo.js https://github.com/kripken/ammo.js\n * - MMDPhysics\n * - CCDIKSolver\n *\n * TODO\n * - more precise grant skinning support.\n */\nclass MMDAnimationHelper {\n /**\n * @param {Object} params - (optional)\n * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.\n * @param {Number} params.afterglow - Default is 0.0.\n * @param {boolean} params.resetPhysicsOnLoop - Default is true.\n */\n constructor(params = {}) {\n this.meshes = []\n\n this.camera = null\n this.cameraTarget = new Object3D()\n this.cameraTarget.name = 'target'\n\n this.audio = null\n this.audioManager = null\n\n this.objects = new WeakMap()\n\n this.configuration = {\n sync: params.sync !== undefined ? params.sync : true,\n afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,\n resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,\n pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false,\n }\n\n this.enabled = {\n animation: true,\n ik: true,\n grant: true,\n physics: true,\n cameraAnimation: true,\n }\n\n this.onBeforePhysics = function (/* mesh */) {}\n\n // experimental\n this.sharedPhysics = false\n this.masterPhysics = null\n }\n\n /**\n * Adds an Three.js Object to helper and setups animation.\n * The anmation durations of added objects are synched\n * if this.configuration.sync is true.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @param {Object} params - (optional)\n * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.\n * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.\n * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.\n * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.\n * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.\n * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).\n * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.\n * @return {MMDAnimationHelper}\n */\n add(object, params = {}) {\n if (object.isSkinnedMesh) {\n this._addMesh(object, params)\n } else if (object.isCamera) {\n this._setupCamera(object, params)\n } else if (object.type === 'Audio') {\n this._setupAudio(object, params)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.add: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Removes an Three.js Object from helper.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @return {MMDAnimationHelper}\n */\n remove(object) {\n if (object.isSkinnedMesh) {\n this._removeMesh(object)\n } else if (object.isCamera) {\n this._clearCamera(object)\n } else if (object.type === 'Audio') {\n this._clearAudio(object)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.remove: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Updates the animation.\n *\n * @param {Number} delta\n * @return {MMDAnimationHelper}\n */\n update(delta) {\n if (this.audioManager !== null) this.audioManager.control(delta)\n\n for (let i = 0; i < this.meshes.length; i++) {\n this._animateMesh(this.meshes[i], delta)\n }\n\n if (this.sharedPhysics) this._updateSharedPhysics(delta)\n\n if (this.camera !== null) this._animateCamera(this.camera, delta)\n\n return this\n }\n\n /**\n * Changes the pose of SkinnedMesh as VPD specifies.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @param {Object} vpd - VPD content parsed MMDParser\n * @param {Object} params - (optional)\n * @param {boolean} params.resetPose - Default is true.\n * @param {boolean} params.ik - Default is true.\n * @param {boolean} params.grant - Default is true.\n * @return {MMDAnimationHelper}\n */\n pose(mesh, vpd, params = {}) {\n if (params.resetPose !== false) mesh.pose()\n\n const bones = mesh.skeleton.bones\n const boneParams = vpd.bones\n\n const boneNameDictionary = {}\n\n for (let i = 0, il = bones.length; i < il; i++) {\n boneNameDictionary[bones[i].name] = i\n }\n\n const vector = new Vector3()\n const quaternion = new Quaternion()\n\n for (let i = 0, il = boneParams.length; i < il; i++) {\n const boneParam = boneParams[i]\n const boneIndex = boneNameDictionary[boneParam.name]\n\n if (boneIndex === undefined) continue\n\n const bone = bones[boneIndex]\n bone.position.add(vector.fromArray(boneParam.translation))\n bone.quaternion.multiply(quaternion.fromArray(boneParam.quaternion))\n }\n\n mesh.updateMatrixWorld(true)\n\n // PMX animation system special path\n if (this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx') {\n const sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n const ikSolver = params.ik !== false ? this._createCCDIKSolver(mesh) : null\n const grantSolver = params.grant !== false ? this.createGrantSolver(mesh) : null\n this._animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver)\n } else {\n if (params.ik !== false) {\n this._createCCDIKSolver(mesh).update()\n }\n\n if (params.grant !== false) {\n this.createGrantSolver(mesh).update()\n }\n }\n\n return this\n }\n\n /**\n * Enabes/Disables an animation feature.\n *\n * @param {string} key\n * @param {boolean} enabled\n * @return {MMDAnimationHelper}\n */\n enable(key, enabled) {\n if (this.enabled[key] === undefined) {\n throw new Error('THREE.MMDAnimationHelper.enable: ' + 'unknown key ' + key)\n }\n\n this.enabled[key] = enabled\n\n if (key === 'physics') {\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n this._optimizeIK(this.meshes[i], enabled)\n }\n }\n\n return this\n }\n\n /**\n * Creates an GrantSolver instance.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @return {GrantSolver}\n */\n createGrantSolver(mesh) {\n return new GrantSolver(mesh, mesh.geometry.userData.MMD.grants)\n }\n\n // private methods\n\n _addMesh(mesh, params) {\n if (this.meshes.indexOf(mesh) >= 0) {\n throw new Error('THREE.MMDAnimationHelper._addMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has already been added.\")\n }\n\n this.meshes.push(mesh)\n this.objects.set(mesh, { looped: false })\n\n this._setupMeshAnimation(mesh, params.animation)\n\n if (params.physics !== false) {\n this._setupMeshPhysics(mesh, params)\n }\n\n return this\n }\n\n _setupCamera(camera, params) {\n if (this.camera === camera) {\n throw new Error('THREE.MMDAnimationHelper._setupCamera: ' + \"Camera '\" + camera.name + \"' has already been set.\")\n }\n\n if (this.camera) this.clearCamera(this.camera)\n\n this.camera = camera\n\n camera.add(this.cameraTarget)\n\n this.objects.set(camera, {})\n\n if (params.animation !== undefined) {\n this._setupCameraAnimation(camera, params.animation)\n }\n\n return this\n }\n\n _setupAudio(audio, params) {\n if (this.audio === audio) {\n throw new Error('THREE.MMDAnimationHelper._setupAudio: ' + \"Audio '\" + audio.name + \"' has already been set.\")\n }\n\n if (this.audio) this.clearAudio(this.audio)\n\n this.audio = audio\n this.audioManager = new AudioManager(audio, params)\n\n this.objects.set(this.audioManager, {\n duration: this.audioManager.duration,\n })\n\n return this\n }\n\n _removeMesh(mesh) {\n let found = false\n let writeIndex = 0\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n if (this.meshes[i] === mesh) {\n this.objects.delete(mesh)\n found = true\n\n continue\n }\n\n this.meshes[writeIndex++] = this.meshes[i]\n }\n\n if (!found) {\n throw new Error(\n 'THREE.MMDAnimationHelper._removeMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has not been added yet.\",\n )\n }\n\n this.meshes.length = writeIndex\n\n return this\n }\n\n _clearCamera(camera) {\n if (camera !== this.camera) {\n throw new Error('THREE.MMDAnimationHelper._clearCamera: ' + \"Camera '\" + camera.name + \"' has not been set yet.\")\n }\n\n this.camera.remove(this.cameraTarget)\n\n this.objects.delete(this.camera)\n this.camera = null\n\n return this\n }\n\n _clearAudio(audio) {\n if (audio !== this.audio) {\n throw new Error('THREE.MMDAnimationHelper._clearAudio: ' + \"Audio '\" + audio.name + \"' has not been set yet.\")\n }\n\n this.objects.delete(this.audioManager)\n\n this.audio = null\n this.audioManager = null\n\n return this\n }\n\n _setupMeshAnimation(mesh, animation) {\n const objects = this.objects.get(mesh)\n\n if (animation !== undefined) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n objects.mixer = new AnimationMixer(mesh)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n\n // TODO: find a workaround not to access ._clip looking like a private property\n objects.mixer.addEventListener('loop', function (event) {\n const tracks = event.action._clip.tracks\n\n if (tracks.length > 0 && tracks[0].name.slice(0, 6) !== '.bones') return\n\n objects.looped = true\n })\n }\n\n objects.ikSolver = this._createCCDIKSolver(mesh)\n objects.grantSolver = this.createGrantSolver(mesh)\n\n return this\n }\n\n _setupCameraAnimation(camera, animation) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n const objects = this.objects.get(camera)\n\n objects.mixer = new AnimationMixer(camera)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n }\n\n _setupMeshPhysics(mesh, params) {\n const objects = this.objects.get(mesh)\n\n // shared physics is experimental\n\n if (params.world === undefined && this.sharedPhysics) {\n const masterPhysics = this._getMasterPhysics()\n\n if (masterPhysics !== null) world = masterPhysics.world // eslint-disable-line no-undef\n }\n\n objects.physics = this._createMMDPhysics(mesh, params)\n\n if (objects.mixer && params.animationWarmup !== false) {\n this._animateMesh(mesh, 0)\n objects.physics.reset()\n }\n\n objects.physics.warmup(params.warmup !== undefined ? params.warmup : 60)\n\n this._optimizeIK(mesh, true)\n }\n\n _animateMesh(mesh, delta) {\n const objects = this.objects.get(mesh)\n\n const mixer = objects.mixer\n const ikSolver = objects.ikSolver\n const grantSolver = objects.grantSolver\n const physics = objects.physics\n const looped = objects.looped\n\n if (mixer && this.enabled.animation) {\n // alternate solution to save/restore bones but less performant?\n //mesh.pose();\n //this._updatePropertyMixersBuffer( mesh );\n\n this._restoreBones(mesh)\n\n mixer.update(delta)\n\n this._saveBones(mesh)\n\n // PMX animation system special path\n if (\n this.configuration.pmxAnimation &&\n mesh.geometry.userData.MMD &&\n mesh.geometry.userData.MMD.format === 'pmx'\n ) {\n if (!objects.sortedBonesData)\n objects.sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n\n this._animatePMXMesh(\n mesh,\n objects.sortedBonesData,\n ikSolver && this.enabled.ik ? ikSolver : null,\n grantSolver && this.enabled.grant ? grantSolver : null,\n )\n } else {\n if (ikSolver && this.enabled.ik) {\n mesh.updateMatrixWorld(true)\n ikSolver.update()\n }\n\n if (grantSolver && this.enabled.grant) {\n grantSolver.update()\n }\n }\n }\n\n if (looped === true && this.enabled.physics) {\n if (physics && this.configuration.resetPhysicsOnLoop) physics.reset()\n\n objects.looped = false\n }\n\n if (physics && this.enabled.physics && !this.sharedPhysics) {\n this.onBeforePhysics(mesh)\n physics.update(delta)\n }\n }\n\n // Sort bones in order by 1. transformationClass and 2. bone index.\n // In PMX animation system, bone transformations should be processed\n // in this order.\n _sortBoneDataArray(boneDataArray) {\n return boneDataArray.sort(function (a, b) {\n if (a.transformationClass !== b.transformationClass) {\n return a.transformationClass - b.transformationClass\n } else {\n return a.index - b.index\n }\n })\n }\n\n // PMX Animation system is a bit too complex and doesn't great match to\n // Three.js Animation system. This method attempts to simulate it as much as\n // possible but doesn't perfectly simulate.\n // This method is more costly than the regular one so\n // you are recommended to set constructor parameter \"pmxAnimation: true\"\n // only if your PMX model animation doesn't work well.\n // If you need better method you would be required to write your own.\n _animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver) {\n _quaternionIndex = 0\n _grantResultMap.clear()\n\n for (let i = 0, il = sortedBonesData.length; i < il; i++) {\n updateOne(mesh, sortedBonesData[i].index, ikSolver, grantSolver)\n }\n\n mesh.updateMatrixWorld(true)\n return this\n }\n\n _animateCamera(camera, delta) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer && this.enabled.cameraAnimation) {\n mixer.update(delta)\n\n camera.updateProjectionMatrix()\n\n camera.up.set(0, 1, 0)\n camera.up.applyQuaternion(camera.quaternion)\n camera.lookAt(this.cameraTarget.position)\n }\n }\n\n _optimizeIK(mesh, physicsEnabled) {\n const iks = mesh.geometry.userData.MMD.iks\n const bones = mesh.geometry.userData.MMD.bones\n\n for (let i = 0, il = iks.length; i < il; i++) {\n const ik = iks[i]\n const links = ik.links\n\n for (let j = 0, jl = links.length; j < jl; j++) {\n const link = links[j]\n\n if (physicsEnabled === true) {\n // disable IK of the bone the corresponding rigidBody type of which is 1 or 2\n // because its rotation will be overriden by physics\n link.enabled = bones[link.index].rigidBodyType > 0 ? false : true\n } else {\n link.enabled = true\n }\n }\n }\n }\n\n _createCCDIKSolver(mesh) {\n if (CCDIKSolver === undefined) {\n throw new Error('THREE.MMDAnimationHelper: Import CCDIKSolver.')\n }\n\n return new CCDIKSolver(mesh, mesh.geometry.userData.MMD.iks)\n }\n\n _createMMDPhysics(mesh, params) {\n if (MMDPhysics === undefined) {\n throw new Error('THREE.MMDPhysics: Import MMDPhysics.')\n }\n\n return new MMDPhysics(mesh, mesh.geometry.userData.MMD.rigidBodies, mesh.geometry.userData.MMD.constraints, params)\n }\n\n /*\n * Detects the longest duration and then sets it to them to sync.\n * TODO: Not to access private properties ( ._actions and ._clip )\n */\n _syncDuration() {\n let max = 0.0\n\n const objects = this.objects\n const meshes = this.meshes\n const camera = this.camera\n const audioManager = this.audioManager\n\n // get the longest duration\n\n for (let i = 0, il = meshes.length; i < il; i++) {\n const mixer = this.objects.get(meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0; j < mixer._actions.length; j++) {\n const clip = mixer._actions[j]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n const clip = mixer._actions[i]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n }\n\n if (audioManager !== null) {\n max = Math.max(max, objects.get(audioManager).duration)\n }\n\n max += this.configuration.afterglow\n\n // update the duration\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const mixer = this.objects.get(this.meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0, jl = mixer._actions.length; j < jl; j++) {\n mixer._actions[j]._clip.duration = max\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n mixer._actions[i]._clip.duration = max\n }\n }\n }\n\n if (audioManager !== null) {\n audioManager.duration = max\n }\n }\n\n // workaround\n\n _updatePropertyMixersBuffer(mesh) {\n const mixer = this.objects.get(mesh).mixer\n\n const propertyMixers = mixer._bindings\n const accuIndex = mixer._accuIndex\n\n for (let i = 0, il = propertyMixers.length; i < il; i++) {\n const propertyMixer = propertyMixers[i]\n const buffer = propertyMixer.buffer\n const stride = propertyMixer.valueSize\n const offset = (accuIndex + 1) * stride\n\n propertyMixer.binding.getValue(buffer, offset)\n }\n }\n\n /*\n * Avoiding these two issues by restore/save bones before/after mixer animation.\n *\n * 1. PropertyMixer used by AnimationMixer holds cache value in .buffer.\n * Calculating IK, Grant, and Physics after mixer animation can break\n * the cache coherency.\n *\n * 2. Applying Grant two or more times without reset the posing breaks model.\n */\n _saveBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const bones = mesh.skeleton.bones\n\n let backupBones = objects.backupBones\n\n if (backupBones === undefined) {\n backupBones = new Float32Array(bones.length * 7)\n objects.backupBones = backupBones\n }\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.toArray(backupBones, i * 7)\n bone.quaternion.toArray(backupBones, i * 7 + 3)\n }\n }\n\n _restoreBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const backupBones = objects.backupBones\n\n if (backupBones === undefined) return\n\n const bones = mesh.skeleton.bones\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.fromArray(backupBones, i * 7)\n bone.quaternion.fromArray(backupBones, i * 7 + 3)\n }\n }\n\n // experimental\n\n _getMasterPhysics() {\n if (this.masterPhysics !== null) return this.masterPhysics\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const physics = this.meshes[i].physics\n\n if (physics !== undefined && physics !== null) {\n this.masterPhysics = physics\n return this.masterPhysics\n }\n }\n\n return null\n }\n\n _updateSharedPhysics(delta) {\n if (this.meshes.length === 0 || !this.enabled.physics || !this.sharedPhysics) return\n\n const physics = this._getMasterPhysics()\n\n if (physics === null) return\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateRigidBodies()\n }\n }\n\n physics.stepSimulation(delta)\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateBones()\n }\n }\n }\n}\n\n// Keep working quaternions for less GC\nconst _quaternions = []\nlet _quaternionIndex = 0\n\nfunction getQuaternion() {\n if (_quaternionIndex >= _quaternions.length) {\n _quaternions.push(new Quaternion())\n }\n\n return _quaternions[_quaternionIndex++]\n}\n\n// Save rotation whose grant and IK are already applied\n// used by grant children\nconst _grantResultMap = new Map()\n\nfunction updateOne(mesh, boneIndex, ikSolver, grantSolver) {\n const bones = mesh.skeleton.bones\n const bonesData = mesh.geometry.userData.MMD.bones\n const boneData = bonesData[boneIndex]\n const bone = bones[boneIndex]\n\n // Return if already updated by being referred as a grant parent.\n if (_grantResultMap.has(boneIndex)) return\n\n const quaternion = getQuaternion()\n\n // Initialize grant result here to prevent infinite loop.\n // If it's referred before updating with actual result later\n // result without applyting IK or grant is gotten\n // but better than composing of infinite loop.\n _grantResultMap.set(boneIndex, quaternion.copy(bone.quaternion))\n\n // @TODO: Support global grant and grant position\n if (grantSolver && boneData.grant && !boneData.grant.isLocal && boneData.grant.affectRotation) {\n const parentIndex = boneData.grant.parentIndex\n const ratio = boneData.grant.ratio\n\n if (!_grantResultMap.has(parentIndex)) {\n updateOne(mesh, parentIndex, ikSolver, grantSolver)\n }\n\n grantSolver.addGrantRotation(bone, _grantResultMap.get(parentIndex), ratio)\n }\n\n if (ikSolver && boneData.ik) {\n // @TODO: Updating world matrices every time solving an IK bone is\n // costly. Optimize if possible.\n mesh.updateMatrixWorld(true)\n ikSolver.updateOne(boneData.ik)\n\n // No confident, but it seems the grant results with ik links should be updated?\n const links = boneData.ik.links\n\n for (let i = 0, il = links.length; i < il; i++) {\n const link = links[i]\n\n if (link.enabled === false) continue\n\n const linkIndex = link.index\n\n if (_grantResultMap.has(linkIndex)) {\n _grantResultMap.set(linkIndex, _grantResultMap.get(linkIndex).copy(bones[linkIndex].quaternion))\n }\n }\n }\n\n // Update with the actual result here\n quaternion.copy(bone.quaternion)\n}\n\n//\n\nclass AudioManager {\n /**\n * @param {THREE.Audio} audio\n * @param {Object} params - (optional)\n * @param {Nuumber} params.delayTime\n */\n constructor(audio, params = {}) {\n this.audio = audio\n\n this.elapsedTime = 0.0\n this.currentTime = 0.0\n this.delayTime = params.delayTime !== undefined ? params.delayTime : 0.0\n\n this.audioDuration = this.audio.buffer.duration\n this.duration = this.audioDuration + this.delayTime\n }\n\n /**\n * @param {Number} delta\n * @return {AudioManager}\n */\n control(delta) {\n this.elapsed += delta\n this.currentTime += delta\n\n if (this._shouldStopAudio()) this.audio.stop()\n if (this._shouldStartAudio()) this.audio.play()\n\n return this\n }\n\n // private methods\n\n _shouldStartAudio() {\n if (this.audio.isPlaying) return false\n\n while (this.currentTime >= this.duration) {\n this.currentTime -= this.duration\n }\n\n if (this.currentTime < this.delayTime) return false\n\n // 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration\n if (this.currentTime - this.delayTime > this.audioDuration) return false\n\n return true\n }\n\n _shouldStopAudio() {\n return this.audio.isPlaying && this.currentTime >= this.duration\n }\n}\n\nconst _q = new Quaternion()\n\n/**\n * Solver for Grant (Fuyo in Japanese. I just google translated because\n * Fuyo may be MMD specific term and may not be common word in 3D CG terms.)\n * Grant propagates a bone's transform to other bones transforms even if\n * they are not children.\n * @param {THREE.SkinnedMesh} mesh\n * @param {Array<Object>} grants\n */\nclass GrantSolver {\n constructor(mesh, grants = []) {\n this.mesh = mesh\n this.grants = grants\n }\n\n /**\n * Solve all the grant bones\n * @return {GrantSolver}\n */\n update() {\n const grants = this.grants\n\n for (let i = 0, il = grants.length; i < il; i++) {\n this.updateOne(grants[i])\n }\n\n return this\n }\n\n /**\n * Solve a grant bone\n * @param {Object} grant - grant parameter\n * @return {GrantSolver}\n */\n updateOne(grant) {\n const bones = this.mesh.skeleton.bones\n const bone = bones[grant.index]\n const parentBone = bones[grant.parentIndex]\n\n if (grant.isLocal) {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n // TODO: implement\n if (grant.affectRotation) {\n }\n } else {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n if (grant.affectRotation) {\n this.addGrantRotation(bone, parentBone.quaternion, grant.ratio)\n }\n }\n\n return this\n }\n\n addGrantRotation(bone, q, ratio) {\n _q.set(0, 0, 0, 1)\n _q.slerp(q, ratio)\n bone.quaternion.multiply(_q)\n\n return this\n }\n}\n\nexport { MMDAnimationHelper }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MMDAnimationHelper.js","sources":["../../src/animation/MMDAnimationHelper.js"],"sourcesContent":["import { AnimationMixer, Object3D, Quaternion, Vector3 } from 'three'\nimport { CCDIKSolver } from '../animation/CCDIKSolver'\nimport { MMDPhysics } from '../animation/MMDPhysics'\n\n/**\n * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader\n * with MMD special features as IK, Grant, and Physics.\n *\n * Dependencies\n * - ammo.js https://github.com/kripken/ammo.js\n * - MMDPhysics\n * - CCDIKSolver\n *\n * TODO\n * - more precise grant skinning support.\n */\nclass MMDAnimationHelper {\n /**\n * @param {Object} params - (optional)\n * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.\n * @param {Number} params.afterglow - Default is 0.0.\n * @param {boolean} params.resetPhysicsOnLoop - Default is true.\n */\n constructor(params = {}) {\n this.meshes = []\n\n this.camera = null\n this.cameraTarget = new Object3D()\n this.cameraTarget.name = 'target'\n\n this.audio = null\n this.audioManager = null\n\n this.objects = new WeakMap()\n\n this.configuration = {\n sync: params.sync !== undefined ? params.sync : true,\n afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,\n resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,\n pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false,\n }\n\n this.enabled = {\n animation: true,\n ik: true,\n grant: true,\n physics: true,\n cameraAnimation: true,\n }\n\n this.onBeforePhysics = function (/* mesh */) {}\n\n // experimental\n this.sharedPhysics = false\n this.masterPhysics = null\n }\n\n /**\n * Adds an Three.js Object to helper and setups animation.\n * The anmation durations of added objects are synched\n * if this.configuration.sync is true.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @param {Object} params - (optional)\n * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.\n * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.\n * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.\n * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.\n * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.\n * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).\n * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.\n * @return {MMDAnimationHelper}\n */\n add(object, params = {}) {\n if (object.isSkinnedMesh) {\n this._addMesh(object, params)\n } else if (object.isCamera) {\n this._setupCamera(object, params)\n } else if (object.type === 'Audio') {\n this._setupAudio(object, params)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.add: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Removes an Three.js Object from helper.\n *\n * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object\n * @return {MMDAnimationHelper}\n */\n remove(object) {\n if (object.isSkinnedMesh) {\n this._removeMesh(object)\n } else if (object.isCamera) {\n this._clearCamera(object)\n } else if (object.type === 'Audio') {\n this._clearAudio(object)\n } else {\n throw new Error(\n 'THREE.MMDAnimationHelper.remove: ' +\n 'accepts only ' +\n 'THREE.SkinnedMesh or ' +\n 'THREE.Camera or ' +\n 'THREE.Audio instance.',\n )\n }\n\n if (this.configuration.sync) this._syncDuration()\n\n return this\n }\n\n /**\n * Updates the animation.\n *\n * @param {Number} delta\n * @return {MMDAnimationHelper}\n */\n update(delta) {\n if (this.audioManager !== null) this.audioManager.control(delta)\n\n for (let i = 0; i < this.meshes.length; i++) {\n this._animateMesh(this.meshes[i], delta)\n }\n\n if (this.sharedPhysics) this._updateSharedPhysics(delta)\n\n if (this.camera !== null) this._animateCamera(this.camera, delta)\n\n return this\n }\n\n /**\n * Changes the pose of SkinnedMesh as VPD specifies.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @param {Object} vpd - VPD content parsed MMDParser\n * @param {Object} params - (optional)\n * @param {boolean} params.resetPose - Default is true.\n * @param {boolean} params.ik - Default is true.\n * @param {boolean} params.grant - Default is true.\n * @return {MMDAnimationHelper}\n */\n pose(mesh, vpd, params = {}) {\n if (params.resetPose !== false) mesh.pose()\n\n const bones = mesh.skeleton.bones\n const boneParams = vpd.bones\n\n const boneNameDictionary = {}\n\n for (let i = 0, il = bones.length; i < il; i++) {\n boneNameDictionary[bones[i].name] = i\n }\n\n const vector = new Vector3()\n const quaternion = new Quaternion()\n\n for (let i = 0, il = boneParams.length; i < il; i++) {\n const boneParam = boneParams[i]\n const boneIndex = boneNameDictionary[boneParam.name]\n\n if (boneIndex === undefined) continue\n\n const bone = bones[boneIndex]\n bone.position.add(vector.fromArray(boneParam.translation))\n bone.quaternion.multiply(quaternion.fromArray(boneParam.quaternion))\n }\n\n mesh.updateMatrixWorld(true)\n\n // PMX animation system special path\n if (this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx') {\n const sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n const ikSolver = params.ik !== false ? this._createCCDIKSolver(mesh) : null\n const grantSolver = params.grant !== false ? this.createGrantSolver(mesh) : null\n this._animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver)\n } else {\n if (params.ik !== false) {\n this._createCCDIKSolver(mesh).update()\n }\n\n if (params.grant !== false) {\n this.createGrantSolver(mesh).update()\n }\n }\n\n return this\n }\n\n /**\n * Enabes/Disables an animation feature.\n *\n * @param {string} key\n * @param {boolean} enabled\n * @return {MMDAnimationHelper}\n */\n enable(key, enabled) {\n if (this.enabled[key] === undefined) {\n throw new Error('THREE.MMDAnimationHelper.enable: ' + 'unknown key ' + key)\n }\n\n this.enabled[key] = enabled\n\n if (key === 'physics') {\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n this._optimizeIK(this.meshes[i], enabled)\n }\n }\n\n return this\n }\n\n /**\n * Creates an GrantSolver instance.\n *\n * @param {THREE.SkinnedMesh} mesh\n * @return {GrantSolver}\n */\n createGrantSolver(mesh) {\n return new GrantSolver(mesh, mesh.geometry.userData.MMD.grants)\n }\n\n // private methods\n\n _addMesh(mesh, params) {\n if (this.meshes.indexOf(mesh) >= 0) {\n throw new Error('THREE.MMDAnimationHelper._addMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has already been added.\")\n }\n\n this.meshes.push(mesh)\n this.objects.set(mesh, { looped: false })\n\n this._setupMeshAnimation(mesh, params.animation)\n\n if (params.physics !== false) {\n this._setupMeshPhysics(mesh, params)\n }\n\n return this\n }\n\n _setupCamera(camera, params) {\n if (this.camera === camera) {\n throw new Error('THREE.MMDAnimationHelper._setupCamera: ' + \"Camera '\" + camera.name + \"' has already been set.\")\n }\n\n if (this.camera) this.clearCamera(this.camera)\n\n this.camera = camera\n\n camera.add(this.cameraTarget)\n\n this.objects.set(camera, {})\n\n if (params.animation !== undefined) {\n this._setupCameraAnimation(camera, params.animation)\n }\n\n return this\n }\n\n _setupAudio(audio, params) {\n if (this.audio === audio) {\n throw new Error('THREE.MMDAnimationHelper._setupAudio: ' + \"Audio '\" + audio.name + \"' has already been set.\")\n }\n\n if (this.audio) this.clearAudio(this.audio)\n\n this.audio = audio\n this.audioManager = new AudioManager(audio, params)\n\n this.objects.set(this.audioManager, {\n duration: this.audioManager.duration,\n })\n\n return this\n }\n\n _removeMesh(mesh) {\n let found = false\n let writeIndex = 0\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n if (this.meshes[i] === mesh) {\n this.objects.delete(mesh)\n found = true\n\n continue\n }\n\n this.meshes[writeIndex++] = this.meshes[i]\n }\n\n if (!found) {\n throw new Error(\n 'THREE.MMDAnimationHelper._removeMesh: ' + \"SkinnedMesh '\" + mesh.name + \"' has not been added yet.\",\n )\n }\n\n this.meshes.length = writeIndex\n\n return this\n }\n\n _clearCamera(camera) {\n if (camera !== this.camera) {\n throw new Error('THREE.MMDAnimationHelper._clearCamera: ' + \"Camera '\" + camera.name + \"' has not been set yet.\")\n }\n\n this.camera.remove(this.cameraTarget)\n\n this.objects.delete(this.camera)\n this.camera = null\n\n return this\n }\n\n _clearAudio(audio) {\n if (audio !== this.audio) {\n throw new Error('THREE.MMDAnimationHelper._clearAudio: ' + \"Audio '\" + audio.name + \"' has not been set yet.\")\n }\n\n this.objects.delete(this.audioManager)\n\n this.audio = null\n this.audioManager = null\n\n return this\n }\n\n _setupMeshAnimation(mesh, animation) {\n const objects = this.objects.get(mesh)\n\n if (animation !== undefined) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n objects.mixer = new AnimationMixer(mesh)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n\n // TODO: find a workaround not to access ._clip looking like a private property\n objects.mixer.addEventListener('loop', function (event) {\n const tracks = event.action._clip.tracks\n\n if (tracks.length > 0 && tracks[0].name.slice(0, 6) !== '.bones') return\n\n objects.looped = true\n })\n }\n\n objects.ikSolver = this._createCCDIKSolver(mesh)\n objects.grantSolver = this.createGrantSolver(mesh)\n\n return this\n }\n\n _setupCameraAnimation(camera, animation) {\n const animations = Array.isArray(animation) ? animation : [animation]\n\n const objects = this.objects.get(camera)\n\n objects.mixer = new AnimationMixer(camera)\n\n for (let i = 0, il = animations.length; i < il; i++) {\n objects.mixer.clipAction(animations[i]).play()\n }\n }\n\n _setupMeshPhysics(mesh, params) {\n const objects = this.objects.get(mesh)\n\n // shared physics is experimental\n\n if (params.world === undefined && this.sharedPhysics) {\n const masterPhysics = this._getMasterPhysics()\n\n if (masterPhysics !== null) world = masterPhysics.world // eslint-disable-line no-undef\n }\n\n objects.physics = this._createMMDPhysics(mesh, params)\n\n if (objects.mixer && params.animationWarmup !== false) {\n this._animateMesh(mesh, 0)\n objects.physics.reset()\n }\n\n objects.physics.warmup(params.warmup !== undefined ? params.warmup : 60)\n\n this._optimizeIK(mesh, true)\n }\n\n _animateMesh(mesh, delta) {\n const objects = this.objects.get(mesh)\n\n const mixer = objects.mixer\n const ikSolver = objects.ikSolver\n const grantSolver = objects.grantSolver\n const physics = objects.physics\n const looped = objects.looped\n\n if (mixer && this.enabled.animation) {\n // alternate solution to save/restore bones but less performant?\n //mesh.pose();\n //this._updatePropertyMixersBuffer( mesh );\n\n this._restoreBones(mesh)\n\n mixer.update(delta)\n\n this._saveBones(mesh)\n\n // PMX animation system special path\n if (\n this.configuration.pmxAnimation &&\n mesh.geometry.userData.MMD &&\n mesh.geometry.userData.MMD.format === 'pmx'\n ) {\n if (!objects.sortedBonesData)\n objects.sortedBonesData = this._sortBoneDataArray(mesh.geometry.userData.MMD.bones.slice())\n\n this._animatePMXMesh(\n mesh,\n objects.sortedBonesData,\n ikSolver && this.enabled.ik ? ikSolver : null,\n grantSolver && this.enabled.grant ? grantSolver : null,\n )\n } else {\n if (ikSolver && this.enabled.ik) {\n mesh.updateMatrixWorld(true)\n ikSolver.update()\n }\n\n if (grantSolver && this.enabled.grant) {\n grantSolver.update()\n }\n }\n }\n\n if (looped === true && this.enabled.physics) {\n if (physics && this.configuration.resetPhysicsOnLoop) physics.reset()\n\n objects.looped = false\n }\n\n if (physics && this.enabled.physics && !this.sharedPhysics) {\n this.onBeforePhysics(mesh)\n physics.update(delta)\n }\n }\n\n // Sort bones in order by 1. transformationClass and 2. bone index.\n // In PMX animation system, bone transformations should be processed\n // in this order.\n _sortBoneDataArray(boneDataArray) {\n return boneDataArray.sort(function (a, b) {\n if (a.transformationClass !== b.transformationClass) {\n return a.transformationClass - b.transformationClass\n } else {\n return a.index - b.index\n }\n })\n }\n\n // PMX Animation system is a bit too complex and doesn't great match to\n // Three.js Animation system. This method attempts to simulate it as much as\n // possible but doesn't perfectly simulate.\n // This method is more costly than the regular one so\n // you are recommended to set constructor parameter \"pmxAnimation: true\"\n // only if your PMX model animation doesn't work well.\n // If you need better method you would be required to write your own.\n _animatePMXMesh(mesh, sortedBonesData, ikSolver, grantSolver) {\n _quaternionIndex = 0\n _grantResultMap.clear()\n\n for (let i = 0, il = sortedBonesData.length; i < il; i++) {\n updateOne(mesh, sortedBonesData[i].index, ikSolver, grantSolver)\n }\n\n mesh.updateMatrixWorld(true)\n return this\n }\n\n _animateCamera(camera, delta) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer && this.enabled.cameraAnimation) {\n mixer.update(delta)\n\n camera.updateProjectionMatrix()\n\n camera.up.set(0, 1, 0)\n camera.up.applyQuaternion(camera.quaternion)\n camera.lookAt(this.cameraTarget.position)\n }\n }\n\n _optimizeIK(mesh, physicsEnabled) {\n const iks = mesh.geometry.userData.MMD.iks\n const bones = mesh.geometry.userData.MMD.bones\n\n for (let i = 0, il = iks.length; i < il; i++) {\n const ik = iks[i]\n const links = ik.links\n\n for (let j = 0, jl = links.length; j < jl; j++) {\n const link = links[j]\n\n if (physicsEnabled === true) {\n // disable IK of the bone the corresponding rigidBody type of which is 1 or 2\n // because its rotation will be overriden by physics\n link.enabled = bones[link.index].rigidBodyType > 0 ? false : true\n } else {\n link.enabled = true\n }\n }\n }\n }\n\n _createCCDIKSolver(mesh) {\n if (CCDIKSolver === undefined) {\n throw new Error('THREE.MMDAnimationHelper: Import CCDIKSolver.')\n }\n\n return new CCDIKSolver(mesh, mesh.geometry.userData.MMD.iks)\n }\n\n _createMMDPhysics(mesh, params) {\n if (MMDPhysics === undefined) {\n throw new Error('THREE.MMDPhysics: Import MMDPhysics.')\n }\n\n return new MMDPhysics(mesh, mesh.geometry.userData.MMD.rigidBodies, mesh.geometry.userData.MMD.constraints, params)\n }\n\n /*\n * Detects the longest duration and then sets it to them to sync.\n * TODO: Not to access private properties ( ._actions and ._clip )\n */\n _syncDuration() {\n let max = 0.0\n\n const objects = this.objects\n const meshes = this.meshes\n const camera = this.camera\n const audioManager = this.audioManager\n\n // get the longest duration\n\n for (let i = 0, il = meshes.length; i < il; i++) {\n const mixer = this.objects.get(meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0; j < mixer._actions.length; j++) {\n const clip = mixer._actions[j]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n const clip = mixer._actions[i]._clip\n\n if (!objects.has(clip)) {\n objects.set(clip, {\n duration: clip.duration,\n })\n }\n\n max = Math.max(max, objects.get(clip).duration)\n }\n }\n }\n\n if (audioManager !== null) {\n max = Math.max(max, objects.get(audioManager).duration)\n }\n\n max += this.configuration.afterglow\n\n // update the duration\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const mixer = this.objects.get(this.meshes[i]).mixer\n\n if (mixer === undefined) continue\n\n for (let j = 0, jl = mixer._actions.length; j < jl; j++) {\n mixer._actions[j]._clip.duration = max\n }\n }\n\n if (camera !== null) {\n const mixer = this.objects.get(camera).mixer\n\n if (mixer !== undefined) {\n for (let i = 0, il = mixer._actions.length; i < il; i++) {\n mixer._actions[i]._clip.duration = max\n }\n }\n }\n\n if (audioManager !== null) {\n audioManager.duration = max\n }\n }\n\n // workaround\n\n _updatePropertyMixersBuffer(mesh) {\n const mixer = this.objects.get(mesh).mixer\n\n const propertyMixers = mixer._bindings\n const accuIndex = mixer._accuIndex\n\n for (let i = 0, il = propertyMixers.length; i < il; i++) {\n const propertyMixer = propertyMixers[i]\n const buffer = propertyMixer.buffer\n const stride = propertyMixer.valueSize\n const offset = (accuIndex + 1) * stride\n\n propertyMixer.binding.getValue(buffer, offset)\n }\n }\n\n /*\n * Avoiding these two issues by restore/save bones before/after mixer animation.\n *\n * 1. PropertyMixer used by AnimationMixer holds cache value in .buffer.\n * Calculating IK, Grant, and Physics after mixer animation can break\n * the cache coherency.\n *\n * 2. Applying Grant two or more times without reset the posing breaks model.\n */\n _saveBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const bones = mesh.skeleton.bones\n\n let backupBones = objects.backupBones\n\n if (backupBones === undefined) {\n backupBones = new Float32Array(bones.length * 7)\n objects.backupBones = backupBones\n }\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.toArray(backupBones, i * 7)\n bone.quaternion.toArray(backupBones, i * 7 + 3)\n }\n }\n\n _restoreBones(mesh) {\n const objects = this.objects.get(mesh)\n\n const backupBones = objects.backupBones\n\n if (backupBones === undefined) return\n\n const bones = mesh.skeleton.bones\n\n for (let i = 0, il = bones.length; i < il; i++) {\n const bone = bones[i]\n bone.position.fromArray(backupBones, i * 7)\n bone.quaternion.fromArray(backupBones, i * 7 + 3)\n }\n }\n\n // experimental\n\n _getMasterPhysics() {\n if (this.masterPhysics !== null) return this.masterPhysics\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const physics = this.meshes[i].physics\n\n if (physics !== undefined && physics !== null) {\n this.masterPhysics = physics\n return this.masterPhysics\n }\n }\n\n return null\n }\n\n _updateSharedPhysics(delta) {\n if (this.meshes.length === 0 || !this.enabled.physics || !this.sharedPhysics) return\n\n const physics = this._getMasterPhysics()\n\n if (physics === null) return\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateRigidBodies()\n }\n }\n\n physics.stepSimulation(delta)\n\n for (let i = 0, il = this.meshes.length; i < il; i++) {\n const p = this.meshes[i].physics\n\n if (p !== null && p !== undefined) {\n p.updateBones()\n }\n }\n }\n}\n\n// Keep working quaternions for less GC\nconst _quaternions = []\nlet _quaternionIndex = 0\n\nfunction getQuaternion() {\n if (_quaternionIndex >= _quaternions.length) {\n _quaternions.push(new Quaternion())\n }\n\n return _quaternions[_quaternionIndex++]\n}\n\n// Save rotation whose grant and IK are already applied\n// used by grant children\nconst _grantResultMap = new Map()\n\nfunction updateOne(mesh, boneIndex, ikSolver, grantSolver) {\n const bones = mesh.skeleton.bones\n const bonesData = mesh.geometry.userData.MMD.bones\n const boneData = bonesData[boneIndex]\n const bone = bones[boneIndex]\n\n // Return if already updated by being referred as a grant parent.\n if (_grantResultMap.has(boneIndex)) return\n\n const quaternion = getQuaternion()\n\n // Initialize grant result here to prevent infinite loop.\n // If it's referred before updating with actual result later\n // result without applyting IK or grant is gotten\n // but better than composing of infinite loop.\n _grantResultMap.set(boneIndex, quaternion.copy(bone.quaternion))\n\n // @TODO: Support global grant and grant position\n if (grantSolver && boneData.grant && !boneData.grant.isLocal && boneData.grant.affectRotation) {\n const parentIndex = boneData.grant.parentIndex\n const ratio = boneData.grant.ratio\n\n if (!_grantResultMap.has(parentIndex)) {\n updateOne(mesh, parentIndex, ikSolver, grantSolver)\n }\n\n grantSolver.addGrantRotation(bone, _grantResultMap.get(parentIndex), ratio)\n }\n\n if (ikSolver && boneData.ik) {\n // @TODO: Updating world matrices every time solving an IK bone is\n // costly. Optimize if possible.\n mesh.updateMatrixWorld(true)\n ikSolver.updateOne(boneData.ik)\n\n // No confident, but it seems the grant results with ik links should be updated?\n const links = boneData.ik.links\n\n for (let i = 0, il = links.length; i < il; i++) {\n const link = links[i]\n\n if (link.enabled === false) continue\n\n const linkIndex = link.index\n\n if (_grantResultMap.has(linkIndex)) {\n _grantResultMap.set(linkIndex, _grantResultMap.get(linkIndex).copy(bones[linkIndex].quaternion))\n }\n }\n }\n\n // Update with the actual result here\n quaternion.copy(bone.quaternion)\n}\n\n//\n\nclass AudioManager {\n /**\n * @param {THREE.Audio} audio\n * @param {Object} params - (optional)\n * @param {Nuumber} params.delayTime\n */\n constructor(audio, params = {}) {\n this.audio = audio\n\n this.elapsedTime = 0.0\n this.currentTime = 0.0\n this.delayTime = params.delayTime !== undefined ? params.delayTime : 0.0\n\n this.audioDuration = this.audio.buffer.duration\n this.duration = this.audioDuration + this.delayTime\n }\n\n /**\n * @param {Number} delta\n * @return {AudioManager}\n */\n control(delta) {\n this.elapsed += delta\n this.currentTime += delta\n\n if (this._shouldStopAudio()) this.audio.stop()\n if (this._shouldStartAudio()) this.audio.play()\n\n return this\n }\n\n // private methods\n\n _shouldStartAudio() {\n if (this.audio.isPlaying) return false\n\n while (this.currentTime >= this.duration) {\n this.currentTime -= this.duration\n }\n\n if (this.currentTime < this.delayTime) return false\n\n // 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration\n if (this.currentTime - this.delayTime > this.audioDuration) return false\n\n return true\n }\n\n _shouldStopAudio() {\n return this.audio.isPlaying && this.currentTime >= this.duration\n }\n}\n\nconst _q = /* @__PURE__ */ new Quaternion()\n\n/**\n * Solver for Grant (Fuyo in Japanese. I just google translated because\n * Fuyo may be MMD specific term and may not be common word in 3D CG terms.)\n * Grant propagates a bone's transform to other bones transforms even if\n * they are not children.\n * @param {THREE.SkinnedMesh} mesh\n * @param {Array<Object>} grants\n */\nclass GrantSolver {\n constructor(mesh, grants = []) {\n this.mesh = mesh\n this.grants = grants\n }\n\n /**\n * Solve all the grant bones\n * @return {GrantSolver}\n */\n update() {\n const grants = this.grants\n\n for (let i = 0, il = grants.length; i < il; i++) {\n this.updateOne(grants[i])\n }\n\n return this\n }\n\n /**\n * Solve a grant bone\n * @param {Object} grant - grant parameter\n * @return {GrantSolver}\n */\n updateOne(grant) {\n const bones = this.mesh.skeleton.bones\n const bone = bones[grant.index]\n const parentBone = bones[grant.parentIndex]\n\n if (grant.isLocal) {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n // TODO: implement\n if (grant.affectRotation) {\n }\n } else {\n // TODO: implement\n if (grant.affectPosition) {\n }\n\n if (grant.affectRotation) {\n this.addGrantRotation(bone, parentBone.quaternion, grant.ratio)\n }\n }\n\n return this\n }\n\n addGrantRotation(bone, q, ratio) {\n _q.set(0, 0, 0, 1)\n _q.slerp(q, ratio)\n bone.quaternion.multiply(_q)\n\n return this\n }\n}\n\nexport { MMDAnimationHelper }\n"],"names":[],"mappings":"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"}
@@ -720,10 +720,10 @@ class Constraint {
720
720
  manager.freeVector3(aul);
721
721
  }
722
722
  }
723
- const _position = new THREE.Vector3();
724
- const _quaternion = new THREE.Quaternion();
725
- const _scale = new THREE.Vector3();
726
- const _matrixWorldInv = new THREE.Matrix4();
723
+ const _position = /* @__PURE__ */ new THREE.Vector3();
724
+ const _quaternion = /* @__PURE__ */ new THREE.Quaternion();
725
+ const _scale = /* @__PURE__ */ new THREE.Vector3();
726
+ const _matrixWorldInv = /* @__PURE__ */ new THREE.Matrix4();
727
727
  class MMDPhysicsHelper extends THREE.Object3D {
728
728
  /**
729
729
  * Visualize Rigid bodies