@anov/3d 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/README.md +142 -1
  2. package/dist/core/camera.d.ts +31 -4
  3. package/dist/core/camera.js +62 -52
  4. package/dist/core/control/transformControls.d.ts +12 -0
  5. package/dist/core/control/transformControls.js +72 -0
  6. package/dist/core/cssRenderer.d.ts +17 -0
  7. package/dist/core/cssRenderer.js +36 -0
  8. package/dist/core/global/global.d.ts +27 -0
  9. package/dist/core/global/global.js +72 -0
  10. package/dist/core/global/globalControl.d.ts +17 -0
  11. package/dist/core/global/globalControl.js +62 -0
  12. package/dist/core/group.d.ts +51 -6
  13. package/dist/core/group.js +124 -16
  14. package/dist/core/line.d.ts +13 -0
  15. package/dist/core/line.js +83 -0
  16. package/dist/core/mesh.d.ts +12 -7
  17. package/dist/core/mesh.js +57 -56
  18. package/dist/core/model.d.ts +11 -3
  19. package/dist/core/model.js +34 -7
  20. package/dist/core/scene.d.ts +84 -25
  21. package/dist/core/scene.js +207 -53
  22. package/dist/core/use/useScene.d.ts +10 -0
  23. package/dist/core/use/useScene.js +14 -0
  24. package/dist/core/use/useframe.d.ts +6 -0
  25. package/dist/core/use/useframe.js +11 -0
  26. package/dist/export.d.ts +41 -0
  27. package/dist/export.js +37 -0
  28. package/dist/index.d.ts +3 -6
  29. package/dist/index.js +5 -6
  30. package/dist/threeCell.d.ts +8 -0
  31. package/dist/threeCell.js +16 -0
  32. package/dist/type.d.ts +4 -3
  33. package/dist/utils/createElement.d.ts +103 -0
  34. package/dist/utils/createElement.js +145 -0
  35. package/dist/utils/createLabel.d.ts +2 -0
  36. package/dist/utils/createLabel.js +4 -0
  37. package/dist/utils/index.d.ts +36 -0
  38. package/dist/utils/index.js +76 -0
  39. package/dist/utils/line.d.ts +0 -0
  40. package/dist/utils/line.js +0 -0
  41. package/dist/utils/move.d.ts +48 -0
  42. package/dist/utils/move.js +149 -0
  43. package/examples/fonts/LICENSE +13 -0
  44. package/examples/fonts/README.md +11 -0
  45. package/examples/fonts/droid/NOTICE +190 -0
  46. package/examples/fonts/droid/README.txt +18 -0
  47. package/examples/fonts/droid/droid_sans_bold.typeface.json +1 -0
  48. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +1 -0
  49. package/examples/fonts/droid/droid_sans_regular.typeface.json +1 -0
  50. package/examples/fonts/droid/droid_serif_bold.typeface.json +1 -0
  51. package/examples/fonts/droid/droid_serif_regular.typeface.json +1 -0
  52. package/examples/fonts/gentilis_bold.typeface.json +1 -0
  53. package/examples/fonts/gentilis_regular.typeface.json +1 -0
  54. package/examples/fonts/helvetiker_bold.typeface.json +1 -0
  55. package/examples/fonts/helvetiker_regular.typeface.json +1 -0
  56. package/examples/fonts/optimer_bold.typeface.json +1 -0
  57. package/examples/fonts/optimer_regular.typeface.json +1 -0
  58. package/examples/fonts/ttf/README.md +9 -0
  59. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  60. package/examples/jsm/animation/AnimationClipCreator.js +116 -0
  61. package/examples/jsm/animation/CCDIKSolver.js +482 -0
  62. package/examples/jsm/animation/MMDAnimationHelper.js +1207 -0
  63. package/examples/jsm/animation/MMDPhysics.js +1406 -0
  64. package/examples/jsm/cameras/CinematicCamera.js +208 -0
  65. package/examples/jsm/capabilities/WebGL.js +91 -0
  66. package/examples/jsm/capabilities/WebGPU.js +53 -0
  67. package/examples/jsm/controls/ArcballControls.js +3224 -0
  68. package/examples/jsm/controls/DragControls.js +220 -0
  69. package/examples/jsm/controls/FirstPersonControls.js +325 -0
  70. package/examples/jsm/controls/FlyControls.js +300 -0
  71. package/examples/jsm/controls/MapControls.js +28 -0
  72. package/examples/jsm/controls/OrbitControls.js +1388 -0
  73. package/examples/jsm/controls/PointerLockControls.js +162 -0
  74. package/examples/jsm/controls/TrackballControls.js +828 -0
  75. package/examples/jsm/controls/TransformControls.js +1557 -0
  76. package/examples/jsm/csm/CSM.js +384 -0
  77. package/examples/jsm/csm/CSMFrustum.js +152 -0
  78. package/examples/jsm/csm/CSMHelper.js +193 -0
  79. package/examples/jsm/csm/CSMShader.js +252 -0
  80. package/examples/jsm/curves/CurveExtras.js +422 -0
  81. package/examples/jsm/curves/NURBSCurve.js +80 -0
  82. package/examples/jsm/curves/NURBSSurface.js +52 -0
  83. package/examples/jsm/curves/NURBSUtils.js +487 -0
  84. package/examples/jsm/effects/AnaglyphEffect.js +154 -0
  85. package/examples/jsm/effects/AsciiEffect.js +263 -0
  86. package/examples/jsm/effects/OutlineEffect.js +539 -0
  87. package/examples/jsm/effects/ParallaxBarrierEffect.js +119 -0
  88. package/examples/jsm/effects/PeppersGhostEffect.js +153 -0
  89. package/examples/jsm/effects/StereoEffect.js +55 -0
  90. package/examples/jsm/environments/DebugEnvironment.js +52 -0
  91. package/examples/jsm/environments/RoomEnvironment.js +148 -0
  92. package/examples/jsm/exporters/DRACOExporter.js +267 -0
  93. package/examples/jsm/exporters/EXRExporter.js +501 -0
  94. package/examples/jsm/exporters/GLTFExporter.js +3161 -0
  95. package/examples/jsm/exporters/KTX2Exporter.js +292 -0
  96. package/examples/jsm/exporters/MMDExporter.js +217 -0
  97. package/examples/jsm/exporters/OBJExporter.js +284 -0
  98. package/examples/jsm/exporters/PLYExporter.js +528 -0
  99. package/examples/jsm/exporters/STLExporter.js +199 -0
  100. package/examples/jsm/exporters/USDZExporter.js +711 -0
  101. package/examples/jsm/geometries/BoxLineGeometry.js +69 -0
  102. package/examples/jsm/geometries/ConvexGeometry.js +53 -0
  103. package/examples/jsm/geometries/DecalGeometry.js +356 -0
  104. package/examples/jsm/geometries/ParametricGeometries.js +254 -0
  105. package/examples/jsm/geometries/ParametricGeometry.js +139 -0
  106. package/examples/jsm/geometries/RoundedBoxGeometry.js +155 -0
  107. package/examples/jsm/geometries/TeapotGeometry.js +704 -0
  108. package/examples/jsm/geometries/TextGeometry.js +57 -0
  109. package/examples/jsm/helpers/LightProbeHelper.js +130 -0
  110. package/examples/jsm/helpers/OctreeHelper.js +73 -0
  111. package/examples/jsm/helpers/PositionalAudioHelper.js +109 -0
  112. package/examples/jsm/helpers/RectAreaLightHelper.js +85 -0
  113. package/examples/jsm/helpers/VertexNormalsHelper.js +96 -0
  114. package/examples/jsm/helpers/VertexTangentsHelper.js +88 -0
  115. package/examples/jsm/helpers/ViewHelper.js +333 -0
  116. package/examples/jsm/interactive/HTMLMesh.js +565 -0
  117. package/examples/jsm/interactive/InteractiveGroup.js +116 -0
  118. package/examples/jsm/interactive/SelectionBox.js +227 -0
  119. package/examples/jsm/interactive/SelectionHelper.js +104 -0
  120. package/examples/jsm/libs/ammo.wasm.js +822 -0
  121. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  122. package/examples/jsm/libs/basis/README.md +46 -0
  123. package/examples/jsm/libs/basis/basis_transcoder.js +21 -0
  124. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  125. package/examples/jsm/libs/chevrotain.module.min.js +141 -0
  126. package/examples/jsm/libs/draco/README.md +32 -0
  127. package/examples/jsm/libs/draco/draco_decoder.js +34 -0
  128. package/examples/jsm/libs/draco/draco_decoder.wasm +0 -0
  129. package/examples/jsm/libs/draco/draco_encoder.js +33 -0
  130. package/examples/jsm/libs/draco/draco_wasm_wrapper.js +117 -0
  131. package/examples/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  132. package/examples/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  133. package/examples/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  134. package/examples/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  135. package/examples/jsm/libs/ecsy.module.js +1792 -0
  136. package/examples/jsm/libs/fflate.module.js +2474 -0
  137. package/examples/jsm/libs/ktx-parse.module.js +1 -0
  138. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  139. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  140. package/examples/jsm/libs/meshopt_decoder.module.js +178 -0
  141. package/examples/jsm/libs/mikktspace.module.js +128 -0
  142. package/examples/jsm/libs/mmdparser.module.js +11530 -0
  143. package/examples/jsm/libs/motion-controllers.module.js +397 -0
  144. package/examples/jsm/libs/opentype.module.js +14568 -0
  145. package/examples/jsm/libs/potpack.module.js +125 -0
  146. package/examples/jsm/libs/rhino3dm/rhino3dm.js +21 -0
  147. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +16 -0
  148. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  149. package/examples/jsm/libs/stats.module.js +167 -0
  150. package/examples/jsm/libs/tween.module.js +803 -0
  151. package/examples/jsm/libs/utif.module.js +1579 -0
  152. package/examples/jsm/libs/zstddec.module.js +1 -0
  153. package/examples/jsm/lights/IESSpotLight.js +25 -0
  154. package/examples/jsm/lights/LightProbeGenerator.js +252 -0
  155. package/examples/jsm/lights/RectAreaLightUniformsLib.js +79 -0
  156. package/examples/jsm/lines/Line2.js +19 -0
  157. package/examples/jsm/lines/LineGeometry.js +79 -0
  158. package/examples/jsm/lines/LineMaterial.js +702 -0
  159. package/examples/jsm/lines/LineSegments2.js +361 -0
  160. package/examples/jsm/lines/LineSegmentsGeometry.js +241 -0
  161. package/examples/jsm/lines/Wireframe.js +56 -0
  162. package/examples/jsm/lines/WireframeGeometry2.js +24 -0
  163. package/examples/jsm/loaders/3DMLoader.js +1497 -0
  164. package/examples/jsm/loaders/3MFLoader.js +1478 -0
  165. package/examples/jsm/loaders/AMFLoader.js +521 -0
  166. package/examples/jsm/loaders/BVHLoader.js +437 -0
  167. package/examples/jsm/loaders/ColladaLoader.js +4122 -0
  168. package/examples/jsm/loaders/DDSLoader.js +274 -0
  169. package/examples/jsm/loaders/DRACOLoader.js +612 -0
  170. package/examples/jsm/loaders/EXRLoader.js +2309 -0
  171. package/examples/jsm/loaders/FBXLoader.js +4142 -0
  172. package/examples/jsm/loaders/FontLoader.js +183 -0
  173. package/examples/jsm/loaders/GCodeLoader.js +261 -0
  174. package/examples/jsm/loaders/GLTFLoader.js +4576 -0
  175. package/examples/jsm/loaders/HDRCubeTextureLoader.js +115 -0
  176. package/examples/jsm/loaders/IESLoader.js +337 -0
  177. package/examples/jsm/loaders/KMZLoader.js +130 -0
  178. package/examples/jsm/loaders/KTX2Loader.js +868 -0
  179. package/examples/jsm/loaders/KTXLoader.js +176 -0
  180. package/examples/jsm/loaders/LDrawLoader.js +2464 -0
  181. package/examples/jsm/loaders/LUT3dlLoader.js +151 -0
  182. package/examples/jsm/loaders/LUTCubeLoader.js +153 -0
  183. package/examples/jsm/loaders/LWOLoader.js +1052 -0
  184. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  185. package/examples/jsm/loaders/LottieLoader.js +77 -0
  186. package/examples/jsm/loaders/MD2Loader.js +399 -0
  187. package/examples/jsm/loaders/MDDLoader.js +102 -0
  188. package/examples/jsm/loaders/MMDLoader.js +2273 -0
  189. package/examples/jsm/loaders/MTLLoader.js +567 -0
  190. package/examples/jsm/loaders/MaterialXLoader.js +734 -0
  191. package/examples/jsm/loaders/NRRDLoader.js +699 -0
  192. package/examples/jsm/loaders/OBJLoader.js +905 -0
  193. package/examples/jsm/loaders/PCDLoader.js +467 -0
  194. package/examples/jsm/loaders/PDBLoader.js +232 -0
  195. package/examples/jsm/loaders/PLYLoader.js +771 -0
  196. package/examples/jsm/loaders/PVRLoader.js +251 -0
  197. package/examples/jsm/loaders/RGBELoader.js +468 -0
  198. package/examples/jsm/loaders/RGBMLoader.js +1065 -0
  199. package/examples/jsm/loaders/STLLoader.js +403 -0
  200. package/examples/jsm/loaders/SVGLoader.js +3172 -0
  201. package/examples/jsm/loaders/TDSLoader.js +1124 -0
  202. package/examples/jsm/loaders/TGALoader.js +517 -0
  203. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  204. package/examples/jsm/loaders/TTFLoader.js +214 -0
  205. package/examples/jsm/loaders/TiltLoader.js +520 -0
  206. package/examples/jsm/loaders/USDZLoader.js +633 -0
  207. package/examples/jsm/loaders/VOXLoader.js +311 -0
  208. package/examples/jsm/loaders/VRMLLoader.js +3533 -0
  209. package/examples/jsm/loaders/VTKLoader.js +1163 -0
  210. package/examples/jsm/loaders/XYZLoader.js +106 -0
  211. package/examples/jsm/loaders/lwo/IFFParser.js +1218 -0
  212. package/examples/jsm/loaders/lwo/LWO2Parser.js +414 -0
  213. package/examples/jsm/loaders/lwo/LWO3Parser.js +373 -0
  214. package/examples/jsm/materials/MeshGouraudMaterial.js +420 -0
  215. package/examples/jsm/math/Capsule.js +137 -0
  216. package/examples/jsm/math/ColorConverter.js +36 -0
  217. package/examples/jsm/math/ConvexHull.js +1271 -0
  218. package/examples/jsm/math/ImprovedNoise.js +71 -0
  219. package/examples/jsm/math/Lut.js +204 -0
  220. package/examples/jsm/math/MeshSurfaceSampler.js +250 -0
  221. package/examples/jsm/math/OBB.js +423 -0
  222. package/examples/jsm/math/Octree.js +462 -0
  223. package/examples/jsm/math/SimplexNoise.js +444 -0
  224. package/examples/jsm/misc/ConvexObjectBreaker.js +519 -0
  225. package/examples/jsm/misc/GPUComputationRenderer.js +446 -0
  226. package/examples/jsm/misc/Gyroscope.js +66 -0
  227. package/examples/jsm/misc/MD2Character.js +276 -0
  228. package/examples/jsm/misc/MD2CharacterComplex.js +576 -0
  229. package/examples/jsm/misc/MorphAnimMesh.js +75 -0
  230. package/examples/jsm/misc/MorphBlendMesh.js +322 -0
  231. package/examples/jsm/misc/ProgressiveLightMap.js +323 -0
  232. package/examples/jsm/misc/RollerCoaster.js +566 -0
  233. package/examples/jsm/misc/TubePainter.js +205 -0
  234. package/examples/jsm/misc/Volume.js +473 -0
  235. package/examples/jsm/misc/VolumeSlice.js +229 -0
  236. package/examples/jsm/modifiers/CurveModifier.js +326 -0
  237. package/examples/jsm/modifiers/EdgeSplitModifier.js +279 -0
  238. package/examples/jsm/modifiers/SimplifyModifier.js +525 -0
  239. package/examples/jsm/modifiers/TessellateModifier.js +307 -0
  240. package/examples/jsm/nodes/Nodes.js +171 -0
  241. package/examples/jsm/nodes/accessors/BitangentNode.js +89 -0
  242. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
  243. package/examples/jsm/nodes/accessors/BufferNode.js +30 -0
  244. package/examples/jsm/nodes/accessors/CameraNode.js +98 -0
  245. package/examples/jsm/nodes/accessors/CubeTextureNode.js +103 -0
  246. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +77 -0
  247. package/examples/jsm/nodes/accessors/InstanceNode.js +71 -0
  248. package/examples/jsm/nodes/accessors/MaterialNode.js +267 -0
  249. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +39 -0
  250. package/examples/jsm/nodes/accessors/ModelNode.js +34 -0
  251. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +29 -0
  252. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  253. package/examples/jsm/nodes/accessors/NormalNode.js +96 -0
  254. package/examples/jsm/nodes/accessors/Object3DNode.js +150 -0
  255. package/examples/jsm/nodes/accessors/PointUVNode.js +26 -0
  256. package/examples/jsm/nodes/accessors/PositionNode.js +104 -0
  257. package/examples/jsm/nodes/accessors/ReferenceNode.js +72 -0
  258. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +35 -0
  259. package/examples/jsm/nodes/accessors/SceneNode.js +52 -0
  260. package/examples/jsm/nodes/accessors/SkinningNode.js +93 -0
  261. package/examples/jsm/nodes/accessors/StorageBufferNode.js +27 -0
  262. package/examples/jsm/nodes/accessors/TangentNode.js +103 -0
  263. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  264. package/examples/jsm/nodes/accessors/TextureNode.js +271 -0
  265. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  266. package/examples/jsm/nodes/accessors/UVNode.js +47 -0
  267. package/examples/jsm/nodes/accessors/UserDataNode.js +29 -0
  268. package/examples/jsm/nodes/code/CodeNode.js +78 -0
  269. package/examples/jsm/nodes/code/ExpressionNode.js +37 -0
  270. package/examples/jsm/nodes/code/FunctionCallNode.js +96 -0
  271. package/examples/jsm/nodes/code/FunctionNode.js +127 -0
  272. package/examples/jsm/nodes/code/ScriptableNode.js +488 -0
  273. package/examples/jsm/nodes/code/ScriptableValueNode.js +167 -0
  274. package/examples/jsm/nodes/core/ArrayUniformNode.js +26 -0
  275. package/examples/jsm/nodes/core/AttributeNode.js +102 -0
  276. package/examples/jsm/nodes/core/BypassNode.js +45 -0
  277. package/examples/jsm/nodes/core/CacheNode.js +46 -0
  278. package/examples/jsm/nodes/core/ConstNode.js +32 -0
  279. package/examples/jsm/nodes/core/ContextNode.js +61 -0
  280. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  281. package/examples/jsm/nodes/core/InputNode.js +83 -0
  282. package/examples/jsm/nodes/core/LightingModel.js +15 -0
  283. package/examples/jsm/nodes/core/Node.js +454 -0
  284. package/examples/jsm/nodes/core/NodeAttribute.js +15 -0
  285. package/examples/jsm/nodes/core/NodeBuilder.js +1016 -0
  286. package/examples/jsm/nodes/core/NodeCache.js +26 -0
  287. package/examples/jsm/nodes/core/NodeCode.js +15 -0
  288. package/examples/jsm/nodes/core/NodeFrame.js +110 -0
  289. package/examples/jsm/nodes/core/NodeFunction.js +22 -0
  290. package/examples/jsm/nodes/core/NodeFunctionInput.js +17 -0
  291. package/examples/jsm/nodes/core/NodeKeywords.js +80 -0
  292. package/examples/jsm/nodes/core/NodeParser.js +11 -0
  293. package/examples/jsm/nodes/core/NodeUniform.js +28 -0
  294. package/examples/jsm/nodes/core/NodeUtils.js +212 -0
  295. package/examples/jsm/nodes/core/NodeVar.js +14 -0
  296. package/examples/jsm/nodes/core/NodeVarying.js +17 -0
  297. package/examples/jsm/nodes/core/PropertyNode.js +61 -0
  298. package/examples/jsm/nodes/core/StackNode.js +99 -0
  299. package/examples/jsm/nodes/core/TempNode.js +58 -0
  300. package/examples/jsm/nodes/core/UniformNode.js +61 -0
  301. package/examples/jsm/nodes/core/VarNode.js +87 -0
  302. package/examples/jsm/nodes/core/VaryingNode.js +69 -0
  303. package/examples/jsm/nodes/core/constants.js +27 -0
  304. package/examples/jsm/nodes/display/BlendModeNode.js +99 -0
  305. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  306. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +100 -0
  307. package/examples/jsm/nodes/display/ColorSpaceNode.js +108 -0
  308. package/examples/jsm/nodes/display/FrontFacingNode.js +27 -0
  309. package/examples/jsm/nodes/display/NormalMapNode.js +106 -0
  310. package/examples/jsm/nodes/display/PosterizeNode.js +32 -0
  311. package/examples/jsm/nodes/display/ToneMappingNode.js +141 -0
  312. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  313. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  314. package/examples/jsm/nodes/display/ViewportNode.js +115 -0
  315. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +31 -0
  316. package/examples/jsm/nodes/display/ViewportTextureNode.js +75 -0
  317. package/examples/jsm/nodes/fog/FogExp2Node.js +35 -0
  318. package/examples/jsm/nodes/fog/FogNode.js +37 -0
  319. package/examples/jsm/nodes/fog/FogRangeNode.js +34 -0
  320. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +40 -0
  321. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  322. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  323. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +29 -0
  324. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +18 -0
  325. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  326. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +16 -0
  327. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  328. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +20 -0
  329. package/examples/jsm/nodes/functions/PhongLightingModel.js +67 -0
  330. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +343 -0
  331. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +13 -0
  332. package/examples/jsm/nodes/functions/material/getRoughness.js +18 -0
  333. package/examples/jsm/nodes/geometry/RangeNode.js +104 -0
  334. package/examples/jsm/nodes/gpgpu/ComputeNode.js +85 -0
  335. package/examples/jsm/nodes/lighting/AONode.js +27 -0
  336. package/examples/jsm/nodes/lighting/AmbientLightNode.js +27 -0
  337. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +184 -0
  338. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +40 -0
  339. package/examples/jsm/nodes/lighting/EnvironmentNode.js +191 -0
  340. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +55 -0
  341. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +39 -0
  342. package/examples/jsm/nodes/lighting/LightNode.js +57 -0
  343. package/examples/jsm/nodes/lighting/LightUtils.js +17 -0
  344. package/examples/jsm/nodes/lighting/LightingContextNode.js +102 -0
  345. package/examples/jsm/nodes/lighting/LightingNode.js +21 -0
  346. package/examples/jsm/nodes/lighting/LightsNode.js +128 -0
  347. package/examples/jsm/nodes/lighting/PointLightNode.js +68 -0
  348. package/examples/jsm/nodes/lighting/SpotLightNode.js +89 -0
  349. package/examples/jsm/nodes/loaders/NodeLoader.js +108 -0
  350. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +59 -0
  351. package/examples/jsm/nodes/loaders/NodeObjectLoader.js +70 -0
  352. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +28 -0
  353. package/examples/jsm/nodes/materials/Materials.js +12 -0
  354. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +27 -0
  355. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  356. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +40 -0
  357. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +65 -0
  358. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +128 -0
  359. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +80 -0
  360. package/examples/jsm/nodes/materials/NodeMaterial.js +536 -0
  361. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +49 -0
  362. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +103 -0
  363. package/examples/jsm/nodes/materialx/DISCLAIMER.md +199 -0
  364. package/examples/jsm/nodes/materialx/MaterialXNodes.js +68 -0
  365. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +56 -0
  366. package/examples/jsm/nodes/materialx/lib/mx_noise.js +618 -0
  367. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +19 -0
  368. package/examples/jsm/nodes/math/CondNode.js +86 -0
  369. package/examples/jsm/nodes/math/MathNode.js +359 -0
  370. package/examples/jsm/nodes/math/OperatorNode.js +269 -0
  371. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +152 -0
  372. package/examples/jsm/nodes/parsers/GLSLNodeParser.js +14 -0
  373. package/examples/jsm/nodes/procedural/CheckerNode.js +42 -0
  374. package/examples/jsm/nodes/shadernode/ShaderNode.js +420 -0
  375. package/examples/jsm/nodes/utils/ArrayElementNode.js +33 -0
  376. package/examples/jsm/nodes/utils/ConvertNode.js +65 -0
  377. package/examples/jsm/nodes/utils/DiscardNode.js +26 -0
  378. package/examples/jsm/nodes/utils/EquirectUVNode.js +33 -0
  379. package/examples/jsm/nodes/utils/JoinNode.js +51 -0
  380. package/examples/jsm/nodes/utils/LoopNode.js +186 -0
  381. package/examples/jsm/nodes/utils/MatcapUVNode.js +30 -0
  382. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +46 -0
  383. package/examples/jsm/nodes/utils/OscNode.js +81 -0
  384. package/examples/jsm/nodes/utils/PackingNode.js +55 -0
  385. package/examples/jsm/nodes/utils/RemapNode.js +42 -0
  386. package/examples/jsm/nodes/utils/RotateUVNode.js +43 -0
  387. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +37 -0
  388. package/examples/jsm/nodes/utils/SplitNode.js +104 -0
  389. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +41 -0
  390. package/examples/jsm/nodes/utils/TimerNode.js +94 -0
  391. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +62 -0
  392. package/examples/jsm/objects/GroundProjectedSkybox.js +172 -0
  393. package/examples/jsm/objects/Lensflare.js +377 -0
  394. package/examples/jsm/objects/MarchingCubes.js +1176 -0
  395. package/examples/jsm/objects/Reflector.js +264 -0
  396. package/examples/jsm/objects/ReflectorForSSRPass.js +349 -0
  397. package/examples/jsm/objects/Refractor.js +324 -0
  398. package/examples/jsm/objects/ShadowMesh.js +80 -0
  399. package/examples/jsm/objects/Sky.js +219 -0
  400. package/examples/jsm/objects/Water.js +330 -0
  401. package/examples/jsm/objects/Water2.js +358 -0
  402. package/examples/jsm/offscreen/jank.js +45 -0
  403. package/examples/jsm/offscreen/offscreen.js +8 -0
  404. package/examples/jsm/offscreen/scene.js +86 -0
  405. package/examples/jsm/physics/AmmoPhysics.js +285 -0
  406. package/examples/jsm/physics/RapierPhysics.js +199 -0
  407. package/examples/jsm/postprocessing/AfterimagePass.js +104 -0
  408. package/examples/jsm/postprocessing/BloomPass.js +172 -0
  409. package/examples/jsm/postprocessing/BokehPass.js +140 -0
  410. package/examples/jsm/postprocessing/ClearPass.js +46 -0
  411. package/examples/jsm/postprocessing/CubeTexturePass.js +85 -0
  412. package/examples/jsm/postprocessing/DotScreenPass.js +65 -0
  413. package/examples/jsm/postprocessing/EffectComposer.js +231 -0
  414. package/examples/jsm/postprocessing/FilmPass.js +66 -0
  415. package/examples/jsm/postprocessing/GlitchPass.js +128 -0
  416. package/examples/jsm/postprocessing/HalftonePass.js +79 -0
  417. package/examples/jsm/postprocessing/LUTPass.js +173 -0
  418. package/examples/jsm/postprocessing/MaskPass.js +104 -0
  419. package/examples/jsm/postprocessing/OutlinePass.js +654 -0
  420. package/examples/jsm/postprocessing/OutputPass.js +91 -0
  421. package/examples/jsm/postprocessing/Pass.js +84 -0
  422. package/examples/jsm/postprocessing/RenderPass.js +81 -0
  423. package/examples/jsm/postprocessing/RenderPixelatedPass.js +235 -0
  424. package/examples/jsm/postprocessing/SAOPass.js +411 -0
  425. package/examples/jsm/postprocessing/SMAAPass.js +201 -0
  426. package/examples/jsm/postprocessing/SSAARenderPass.js +228 -0
  427. package/examples/jsm/postprocessing/SSAOPass.js +440 -0
  428. package/examples/jsm/postprocessing/SSRPass.js +641 -0
  429. package/examples/jsm/postprocessing/SavePass.js +79 -0
  430. package/examples/jsm/postprocessing/ShaderPass.js +77 -0
  431. package/examples/jsm/postprocessing/TAARenderPass.js +189 -0
  432. package/examples/jsm/postprocessing/TexturePass.js +67 -0
  433. package/examples/jsm/postprocessing/UnrealBloomPass.js +415 -0
  434. package/examples/jsm/renderers/CSS2DRenderer.js +215 -0
  435. package/examples/jsm/renderers/CSS3DRenderer.js +335 -0
  436. package/examples/jsm/renderers/Projector.js +918 -0
  437. package/examples/jsm/renderers/SVGRenderer.js +553 -0
  438. package/examples/jsm/renderers/common/Animation.js +58 -0
  439. package/examples/jsm/renderers/common/Attributes.js +75 -0
  440. package/examples/jsm/renderers/common/Backend.js +162 -0
  441. package/examples/jsm/renderers/common/Background.js +136 -0
  442. package/examples/jsm/renderers/common/Binding.js +19 -0
  443. package/examples/jsm/renderers/common/Bindings.js +165 -0
  444. package/examples/jsm/renderers/common/Buffer.js +38 -0
  445. package/examples/jsm/renderers/common/BufferUtils.js +33 -0
  446. package/examples/jsm/renderers/common/ChainMap.js +89 -0
  447. package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
  448. package/examples/jsm/renderers/common/Constants.js +14 -0
  449. package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
  450. package/examples/jsm/renderers/common/DataMap.js +54 -0
  451. package/examples/jsm/renderers/common/Geometries.js +215 -0
  452. package/examples/jsm/renderers/common/Info.js +73 -0
  453. package/examples/jsm/renderers/common/Pipeline.js +13 -0
  454. package/examples/jsm/renderers/common/Pipelines.js +370 -0
  455. package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
  456. package/examples/jsm/renderers/common/RenderContext.js +38 -0
  457. package/examples/jsm/renderers/common/RenderContexts.js +49 -0
  458. package/examples/jsm/renderers/common/RenderList.js +178 -0
  459. package/examples/jsm/renderers/common/RenderLists.js +38 -0
  460. package/examples/jsm/renderers/common/RenderObject.js +129 -0
  461. package/examples/jsm/renderers/common/RenderObjects.js +95 -0
  462. package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
  463. package/examples/jsm/renderers/common/Renderer.js +895 -0
  464. package/examples/jsm/renderers/common/SampledTexture.js +80 -0
  465. package/examples/jsm/renderers/common/Sampler.js +18 -0
  466. package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
  467. package/examples/jsm/renderers/common/Textures.js +218 -0
  468. package/examples/jsm/renderers/common/Uniform.js +140 -0
  469. package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
  470. package/examples/jsm/renderers/common/UniformsGroup.js +299 -0
  471. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +39 -0
  472. package/examples/jsm/renderers/common/nodes/NodeSampler.js +21 -0
  473. package/examples/jsm/renderers/common/nodes/NodeUniform.js +135 -0
  474. package/examples/jsm/renderers/common/nodes/Nodes.js +330 -0
  475. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  476. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +26 -0
  477. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +764 -0
  478. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +49 -0
  479. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +844 -0
  480. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +32 -0
  481. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +902 -0
  482. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +104 -0
  483. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeParser.js +14 -0
  484. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +274 -0
  485. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +223 -0
  486. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +324 -0
  487. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +533 -0
  488. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +163 -0
  489. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +964 -0
  490. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
  491. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +87 -0
  492. package/examples/jsm/shaders/AfterimageShader.js +56 -0
  493. package/examples/jsm/shaders/BasicShader.js +27 -0
  494. package/examples/jsm/shaders/BleachBypassShader.js +62 -0
  495. package/examples/jsm/shaders/BlendShader.js +47 -0
  496. package/examples/jsm/shaders/BokehShader.js +143 -0
  497. package/examples/jsm/shaders/BokehShader2.js +393 -0
  498. package/examples/jsm/shaders/BrightnessContrastShader.js +54 -0
  499. package/examples/jsm/shaders/ColorCorrectionShader.js +50 -0
  500. package/examples/jsm/shaders/ColorifyShader.js +51 -0
  501. package/examples/jsm/shaders/ConvolutionShader.js +103 -0
  502. package/examples/jsm/shaders/CopyShader.js +45 -0
  503. package/examples/jsm/shaders/DOFMipMapShader.js +54 -0
  504. package/examples/jsm/shaders/DepthLimitedBlurShader.js +166 -0
  505. package/examples/jsm/shaders/DigitalGlitch.js +101 -0
  506. package/examples/jsm/shaders/DotScreenShader.js +70 -0
  507. package/examples/jsm/shaders/ExposureShader.js +44 -0
  508. package/examples/jsm/shaders/FXAAShader.js +286 -0
  509. package/examples/jsm/shaders/FilmShader.js +102 -0
  510. package/examples/jsm/shaders/FocusShader.js +87 -0
  511. package/examples/jsm/shaders/FreiChenShader.js +94 -0
  512. package/examples/jsm/shaders/GammaCorrectionShader.js +43 -0
  513. package/examples/jsm/shaders/GodRaysShader.js +313 -0
  514. package/examples/jsm/shaders/HalftoneShader.js +310 -0
  515. package/examples/jsm/shaders/HorizontalBlurShader.js +59 -0
  516. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +61 -0
  517. package/examples/jsm/shaders/HueSaturationShader.js +65 -0
  518. package/examples/jsm/shaders/KaleidoShader.js +56 -0
  519. package/examples/jsm/shaders/LuminosityHighPassShader.js +64 -0
  520. package/examples/jsm/shaders/LuminosityShader.js +46 -0
  521. package/examples/jsm/shaders/MMDToonShader.js +132 -0
  522. package/examples/jsm/shaders/MirrorShader.js +54 -0
  523. package/examples/jsm/shaders/NormalMapShader.js +53 -0
  524. package/examples/jsm/shaders/OutputShader.js +78 -0
  525. package/examples/jsm/shaders/RGBShiftShader.js +54 -0
  526. package/examples/jsm/shaders/SAOShader.js +188 -0
  527. package/examples/jsm/shaders/SMAAShader.js +460 -0
  528. package/examples/jsm/shaders/SSAOShader.js +288 -0
  529. package/examples/jsm/shaders/SSRShader.js +364 -0
  530. package/examples/jsm/shaders/SepiaShader.js +52 -0
  531. package/examples/jsm/shaders/SobelOperatorShader.js +90 -0
  532. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +88 -0
  533. package/examples/jsm/shaders/TechnicolorShader.js +43 -0
  534. package/examples/jsm/shaders/ToonShader.js +326 -0
  535. package/examples/jsm/shaders/TriangleBlurShader.js +72 -0
  536. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +45 -0
  537. package/examples/jsm/shaders/VelocityShader.js +128 -0
  538. package/examples/jsm/shaders/VerticalBlurShader.js +59 -0
  539. package/examples/jsm/shaders/VerticalTiltShiftShader.js +61 -0
  540. package/examples/jsm/shaders/VignetteShader.js +51 -0
  541. package/examples/jsm/shaders/VolumeShader.js +289 -0
  542. package/examples/jsm/shaders/WaterRefractionShader.js +93 -0
  543. package/examples/jsm/textures/FlakesTexture.js +40 -0
  544. package/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  545. package/examples/jsm/utils/CameraUtils.js +73 -0
  546. package/examples/jsm/utils/GPUStatsPanel.js +128 -0
  547. package/examples/jsm/utils/GeometryCompressionUtils.js +639 -0
  548. package/examples/jsm/utils/GeometryUtils.js +221 -0
  549. package/examples/jsm/utils/LDrawUtils.js +202 -0
  550. package/examples/jsm/utils/PackedPhongMaterial.js +178 -0
  551. package/examples/jsm/utils/SceneUtils.js +254 -0
  552. package/examples/jsm/utils/ShadowMapViewer.js +210 -0
  553. package/examples/jsm/utils/SkeletonUtils.js +413 -0
  554. package/examples/jsm/utils/TextureUtils.js +86 -0
  555. package/examples/jsm/utils/UVsDebug.js +165 -0
  556. package/examples/jsm/utils/WorkerPool.js +102 -0
  557. package/examples/jsm/webxr/ARButton.js +208 -0
  558. package/examples/jsm/webxr/OculusHandModel.js +109 -0
  559. package/examples/jsm/webxr/OculusHandPointerModel.js +413 -0
  560. package/examples/jsm/webxr/Text2D.js +38 -0
  561. package/examples/jsm/webxr/VRButton.js +200 -0
  562. package/examples/jsm/webxr/XRButton.js +198 -0
  563. package/examples/jsm/webxr/XRControllerModelFactory.js +299 -0
  564. package/examples/jsm/webxr/XREstimatedLight.js +223 -0
  565. package/examples/jsm/webxr/XRHandMeshModel.js +112 -0
  566. package/examples/jsm/webxr/XRHandModelFactory.js +105 -0
  567. package/examples/jsm/webxr/XRHandPrimitiveModel.js +103 -0
  568. package/examples/jsm/webxr/XRPlanes.js +100 -0
  569. package/lib/3d.min.js +1 -0
  570. package/package.json +25 -12
@@ -0,0 +1,1207 @@
1
+ import {
2
+ AnimationMixer,
3
+ Object3D,
4
+ Quaternion,
5
+ Vector3
6
+ } from 'three';
7
+ import { CCDIKSolver } from '../animation/CCDIKSolver.js';
8
+ import { MMDPhysics } from '../animation/MMDPhysics.js';
9
+
10
+ /**
11
+ * MMDAnimationHelper handles animation of MMD assets loaded by MMDLoader
12
+ * with MMD special features as IK, Grant, and Physics.
13
+ *
14
+ * Dependencies
15
+ * - ammo.js https://github.com/kripken/ammo.js
16
+ * - MMDPhysics
17
+ * - CCDIKSolver
18
+ *
19
+ * TODO
20
+ * - more precise grant skinning support.
21
+ */
22
+ class MMDAnimationHelper {
23
+
24
+ /**
25
+ * @param {Object} params - (optional)
26
+ * @param {boolean} params.sync - Whether animation durations of added objects are synched. Default is true.
27
+ * @param {Number} params.afterglow - Default is 0.0.
28
+ * @param {boolean} params.resetPhysicsOnLoop - Default is true.
29
+ */
30
+ constructor( params = {} ) {
31
+
32
+ this.meshes = [];
33
+
34
+ this.camera = null;
35
+ this.cameraTarget = new Object3D();
36
+ this.cameraTarget.name = 'target';
37
+
38
+ this.audio = null;
39
+ this.audioManager = null;
40
+
41
+ this.objects = new WeakMap();
42
+
43
+ this.configuration = {
44
+ sync: params.sync !== undefined ? params.sync : true,
45
+ afterglow: params.afterglow !== undefined ? params.afterglow : 0.0,
46
+ resetPhysicsOnLoop: params.resetPhysicsOnLoop !== undefined ? params.resetPhysicsOnLoop : true,
47
+ pmxAnimation: params.pmxAnimation !== undefined ? params.pmxAnimation : false
48
+ };
49
+
50
+ this.enabled = {
51
+ animation: true,
52
+ ik: true,
53
+ grant: true,
54
+ physics: true,
55
+ cameraAnimation: true
56
+ };
57
+
58
+ this.onBeforePhysics = function ( /* mesh */ ) {};
59
+
60
+ // experimental
61
+ this.sharedPhysics = false;
62
+ this.masterPhysics = null;
63
+
64
+ }
65
+
66
+ /**
67
+ * Adds an Three.js Object to helper and setups animation.
68
+ * The anmation durations of added objects are synched
69
+ * if this.configuration.sync is true.
70
+ *
71
+ * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object
72
+ * @param {Object} params - (optional)
73
+ * @param {THREE.AnimationClip|Array<THREE.AnimationClip>} params.animation - Only for THREE.SkinnedMesh and THREE.Camera. Default is undefined.
74
+ * @param {boolean} params.physics - Only for THREE.SkinnedMesh. Default is true.
75
+ * @param {Integer} params.warmup - Only for THREE.SkinnedMesh and physics is true. Default is 60.
76
+ * @param {Number} params.unitStep - Only for THREE.SkinnedMesh and physics is true. Default is 1 / 65.
77
+ * @param {Integer} params.maxStepNum - Only for THREE.SkinnedMesh and physics is true. Default is 3.
78
+ * @param {Vector3} params.gravity - Only for THREE.SkinnedMesh and physics is true. Default ( 0, - 9.8 * 10, 0 ).
79
+ * @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.
80
+ * @return {MMDAnimationHelper}
81
+ */
82
+ add( object, params = {} ) {
83
+
84
+ if ( object.isSkinnedMesh ) {
85
+
86
+ this._addMesh( object, params );
87
+
88
+ } else if ( object.isCamera ) {
89
+
90
+ this._setupCamera( object, params );
91
+
92
+ } else if ( object.type === 'Audio' ) {
93
+
94
+ this._setupAudio( object, params );
95
+
96
+ } else {
97
+
98
+ throw new Error( 'THREE.MMDAnimationHelper.add: '
99
+ + 'accepts only '
100
+ + 'THREE.SkinnedMesh or '
101
+ + 'THREE.Camera or '
102
+ + 'THREE.Audio instance.' );
103
+
104
+ }
105
+
106
+ if ( this.configuration.sync ) this._syncDuration();
107
+
108
+ return this;
109
+
110
+ }
111
+
112
+ /**
113
+ * Removes an Three.js Object from helper.
114
+ *
115
+ * @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object
116
+ * @return {MMDAnimationHelper}
117
+ */
118
+ remove( object ) {
119
+
120
+ if ( object.isSkinnedMesh ) {
121
+
122
+ this._removeMesh( object );
123
+
124
+ } else if ( object.isCamera ) {
125
+
126
+ this._clearCamera( object );
127
+
128
+ } else if ( object.type === 'Audio' ) {
129
+
130
+ this._clearAudio( object );
131
+
132
+ } else {
133
+
134
+ throw new Error( 'THREE.MMDAnimationHelper.remove: '
135
+ + 'accepts only '
136
+ + 'THREE.SkinnedMesh or '
137
+ + 'THREE.Camera or '
138
+ + 'THREE.Audio instance.' );
139
+
140
+ }
141
+
142
+ if ( this.configuration.sync ) this._syncDuration();
143
+
144
+ return this;
145
+
146
+ }
147
+
148
+ /**
149
+ * Updates the animation.
150
+ *
151
+ * @param {Number} delta
152
+ * @return {MMDAnimationHelper}
153
+ */
154
+ update( delta ) {
155
+
156
+ if ( this.audioManager !== null ) this.audioManager.control( delta );
157
+
158
+ for ( let i = 0; i < this.meshes.length; i ++ ) {
159
+
160
+ this._animateMesh( this.meshes[ i ], delta );
161
+
162
+ }
163
+
164
+ if ( this.sharedPhysics ) this._updateSharedPhysics( delta );
165
+
166
+ if ( this.camera !== null ) this._animateCamera( this.camera, delta );
167
+
168
+ return this;
169
+
170
+ }
171
+
172
+ /**
173
+ * Changes the pose of SkinnedMesh as VPD specifies.
174
+ *
175
+ * @param {THREE.SkinnedMesh} mesh
176
+ * @param {Object} vpd - VPD content parsed MMDParser
177
+ * @param {Object} params - (optional)
178
+ * @param {boolean} params.resetPose - Default is true.
179
+ * @param {boolean} params.ik - Default is true.
180
+ * @param {boolean} params.grant - Default is true.
181
+ * @return {MMDAnimationHelper}
182
+ */
183
+ pose( mesh, vpd, params = {} ) {
184
+
185
+ if ( params.resetPose !== false ) mesh.pose();
186
+
187
+ const bones = mesh.skeleton.bones;
188
+ const boneParams = vpd.bones;
189
+
190
+ const boneNameDictionary = {};
191
+
192
+ for ( let i = 0, il = bones.length; i < il; i ++ ) {
193
+
194
+ boneNameDictionary[ bones[ i ].name ] = i;
195
+
196
+ }
197
+
198
+ const vector = new Vector3();
199
+ const quaternion = new Quaternion();
200
+
201
+ for ( let i = 0, il = boneParams.length; i < il; i ++ ) {
202
+
203
+ const boneParam = boneParams[ i ];
204
+ const boneIndex = boneNameDictionary[ boneParam.name ];
205
+
206
+ if ( boneIndex === undefined ) continue;
207
+
208
+ const bone = bones[ boneIndex ];
209
+ bone.position.add( vector.fromArray( boneParam.translation ) );
210
+ bone.quaternion.multiply( quaternion.fromArray( boneParam.quaternion ) );
211
+
212
+ }
213
+
214
+ mesh.updateMatrixWorld( true );
215
+
216
+ // PMX animation system special path
217
+ if ( this.configuration.pmxAnimation &&
218
+ mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx' ) {
219
+
220
+ const sortedBonesData = this._sortBoneDataArray( mesh.geometry.userData.MMD.bones.slice() );
221
+ const ikSolver = params.ik !== false ? this._createCCDIKSolver( mesh ) : null;
222
+ const grantSolver = params.grant !== false ? this.createGrantSolver( mesh ) : null;
223
+ this._animatePMXMesh( mesh, sortedBonesData, ikSolver, grantSolver );
224
+
225
+ } else {
226
+
227
+ if ( params.ik !== false ) {
228
+
229
+ this._createCCDIKSolver( mesh ).update();
230
+
231
+ }
232
+
233
+ if ( params.grant !== false ) {
234
+
235
+ this.createGrantSolver( mesh ).update();
236
+
237
+ }
238
+
239
+ }
240
+
241
+ return this;
242
+
243
+ }
244
+
245
+ /**
246
+ * Enabes/Disables an animation feature.
247
+ *
248
+ * @param {string} key
249
+ * @param {boolean} enabled
250
+ * @return {MMDAnimationHelper}
251
+ */
252
+ enable( key, enabled ) {
253
+
254
+ if ( this.enabled[ key ] === undefined ) {
255
+
256
+ throw new Error( 'THREE.MMDAnimationHelper.enable: '
257
+ + 'unknown key ' + key );
258
+
259
+ }
260
+
261
+ this.enabled[ key ] = enabled;
262
+
263
+ if ( key === 'physics' ) {
264
+
265
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
266
+
267
+ this._optimizeIK( this.meshes[ i ], enabled );
268
+
269
+ }
270
+
271
+ }
272
+
273
+ return this;
274
+
275
+ }
276
+
277
+ /**
278
+ * Creates an GrantSolver instance.
279
+ *
280
+ * @param {THREE.SkinnedMesh} mesh
281
+ * @return {GrantSolver}
282
+ */
283
+ createGrantSolver( mesh ) {
284
+
285
+ return new GrantSolver( mesh, mesh.geometry.userData.MMD.grants );
286
+
287
+ }
288
+
289
+ // private methods
290
+
291
+ _addMesh( mesh, params ) {
292
+
293
+ if ( this.meshes.indexOf( mesh ) >= 0 ) {
294
+
295
+ throw new Error( 'THREE.MMDAnimationHelper._addMesh: '
296
+ + 'SkinnedMesh \'' + mesh.name + '\' has already been added.' );
297
+
298
+ }
299
+
300
+ this.meshes.push( mesh );
301
+ this.objects.set( mesh, { looped: false } );
302
+
303
+ this._setupMeshAnimation( mesh, params.animation );
304
+
305
+ if ( params.physics !== false ) {
306
+
307
+ this._setupMeshPhysics( mesh, params );
308
+
309
+ }
310
+
311
+ return this;
312
+
313
+ }
314
+
315
+ _setupCamera( camera, params ) {
316
+
317
+ if ( this.camera === camera ) {
318
+
319
+ throw new Error( 'THREE.MMDAnimationHelper._setupCamera: '
320
+ + 'Camera \'' + camera.name + '\' has already been set.' );
321
+
322
+ }
323
+
324
+ if ( this.camera ) this.clearCamera( this.camera );
325
+
326
+ this.camera = camera;
327
+
328
+ camera.add( this.cameraTarget );
329
+
330
+ this.objects.set( camera, {} );
331
+
332
+ if ( params.animation !== undefined ) {
333
+
334
+ this._setupCameraAnimation( camera, params.animation );
335
+
336
+ }
337
+
338
+ return this;
339
+
340
+ }
341
+
342
+ _setupAudio( audio, params ) {
343
+
344
+ if ( this.audio === audio ) {
345
+
346
+ throw new Error( 'THREE.MMDAnimationHelper._setupAudio: '
347
+ + 'Audio \'' + audio.name + '\' has already been set.' );
348
+
349
+ }
350
+
351
+ if ( this.audio ) this.clearAudio( this.audio );
352
+
353
+ this.audio = audio;
354
+ this.audioManager = new AudioManager( audio, params );
355
+
356
+ this.objects.set( this.audioManager, {
357
+ duration: this.audioManager.duration
358
+ } );
359
+
360
+ return this;
361
+
362
+ }
363
+
364
+ _removeMesh( mesh ) {
365
+
366
+ let found = false;
367
+ let writeIndex = 0;
368
+
369
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
370
+
371
+ if ( this.meshes[ i ] === mesh ) {
372
+
373
+ this.objects.delete( mesh );
374
+ found = true;
375
+
376
+ continue;
377
+
378
+ }
379
+
380
+ this.meshes[ writeIndex ++ ] = this.meshes[ i ];
381
+
382
+ }
383
+
384
+ if ( ! found ) {
385
+
386
+ throw new Error( 'THREE.MMDAnimationHelper._removeMesh: '
387
+ + 'SkinnedMesh \'' + mesh.name + '\' has not been added yet.' );
388
+
389
+ }
390
+
391
+ this.meshes.length = writeIndex;
392
+
393
+ return this;
394
+
395
+ }
396
+
397
+ _clearCamera( camera ) {
398
+
399
+ if ( camera !== this.camera ) {
400
+
401
+ throw new Error( 'THREE.MMDAnimationHelper._clearCamera: '
402
+ + 'Camera \'' + camera.name + '\' has not been set yet.' );
403
+
404
+ }
405
+
406
+ this.camera.remove( this.cameraTarget );
407
+
408
+ this.objects.delete( this.camera );
409
+ this.camera = null;
410
+
411
+ return this;
412
+
413
+ }
414
+
415
+ _clearAudio( audio ) {
416
+
417
+ if ( audio !== this.audio ) {
418
+
419
+ throw new Error( 'THREE.MMDAnimationHelper._clearAudio: '
420
+ + 'Audio \'' + audio.name + '\' has not been set yet.' );
421
+
422
+ }
423
+
424
+ this.objects.delete( this.audioManager );
425
+
426
+ this.audio = null;
427
+ this.audioManager = null;
428
+
429
+ return this;
430
+
431
+ }
432
+
433
+ _setupMeshAnimation( mesh, animation ) {
434
+
435
+ const objects = this.objects.get( mesh );
436
+
437
+ if ( animation !== undefined ) {
438
+
439
+ const animations = Array.isArray( animation )
440
+ ? animation : [ animation ];
441
+
442
+ objects.mixer = new AnimationMixer( mesh );
443
+
444
+ for ( let i = 0, il = animations.length; i < il; i ++ ) {
445
+
446
+ objects.mixer.clipAction( animations[ i ] ).play();
447
+
448
+ }
449
+
450
+ // TODO: find a workaround not to access ._clip looking like a private property
451
+ objects.mixer.addEventListener( 'loop', function ( event ) {
452
+
453
+ const tracks = event.action._clip.tracks;
454
+
455
+ if ( tracks.length > 0 && tracks[ 0 ].name.slice( 0, 6 ) !== '.bones' ) return;
456
+
457
+ objects.looped = true;
458
+
459
+ } );
460
+
461
+ }
462
+
463
+ objects.ikSolver = this._createCCDIKSolver( mesh );
464
+ objects.grantSolver = this.createGrantSolver( mesh );
465
+
466
+ return this;
467
+
468
+ }
469
+
470
+ _setupCameraAnimation( camera, animation ) {
471
+
472
+ const animations = Array.isArray( animation )
473
+ ? animation : [ animation ];
474
+
475
+ const objects = this.objects.get( camera );
476
+
477
+ objects.mixer = new AnimationMixer( camera );
478
+
479
+ for ( let i = 0, il = animations.length; i < il; i ++ ) {
480
+
481
+ objects.mixer.clipAction( animations[ i ] ).play();
482
+
483
+ }
484
+
485
+ }
486
+
487
+ _setupMeshPhysics( mesh, params ) {
488
+
489
+ const objects = this.objects.get( mesh );
490
+
491
+ // shared physics is experimental
492
+
493
+ if ( params.world === undefined && this.sharedPhysics ) {
494
+
495
+ const masterPhysics = this._getMasterPhysics();
496
+
497
+ if ( masterPhysics !== null ) world = masterPhysics.world; // eslint-disable-line no-undef
498
+
499
+ }
500
+
501
+ objects.physics = this._createMMDPhysics( mesh, params );
502
+
503
+ if ( objects.mixer && params.animationWarmup !== false ) {
504
+
505
+ this._animateMesh( mesh, 0 );
506
+ objects.physics.reset();
507
+
508
+ }
509
+
510
+ objects.physics.warmup( params.warmup !== undefined ? params.warmup : 60 );
511
+
512
+ this._optimizeIK( mesh, true );
513
+
514
+ }
515
+
516
+ _animateMesh( mesh, delta ) {
517
+
518
+ const objects = this.objects.get( mesh );
519
+
520
+ const mixer = objects.mixer;
521
+ const ikSolver = objects.ikSolver;
522
+ const grantSolver = objects.grantSolver;
523
+ const physics = objects.physics;
524
+ const looped = objects.looped;
525
+
526
+ if ( mixer && this.enabled.animation ) {
527
+
528
+ // alternate solution to save/restore bones but less performant?
529
+ //mesh.pose();
530
+ //this._updatePropertyMixersBuffer( mesh );
531
+
532
+ this._restoreBones( mesh );
533
+
534
+ mixer.update( delta );
535
+
536
+ this._saveBones( mesh );
537
+
538
+ // PMX animation system special path
539
+ if ( this.configuration.pmxAnimation &&
540
+ mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx' ) {
541
+
542
+ if ( ! objects.sortedBonesData ) objects.sortedBonesData = this._sortBoneDataArray( mesh.geometry.userData.MMD.bones.slice() );
543
+
544
+ this._animatePMXMesh(
545
+ mesh,
546
+ objects.sortedBonesData,
547
+ ikSolver && this.enabled.ik ? ikSolver : null,
548
+ grantSolver && this.enabled.grant ? grantSolver : null
549
+ );
550
+
551
+ } else {
552
+
553
+ if ( ikSolver && this.enabled.ik ) {
554
+
555
+ mesh.updateMatrixWorld( true );
556
+ ikSolver.update();
557
+
558
+ }
559
+
560
+ if ( grantSolver && this.enabled.grant ) {
561
+
562
+ grantSolver.update();
563
+
564
+ }
565
+
566
+ }
567
+
568
+ }
569
+
570
+ if ( looped === true && this.enabled.physics ) {
571
+
572
+ if ( physics && this.configuration.resetPhysicsOnLoop ) physics.reset();
573
+
574
+ objects.looped = false;
575
+
576
+ }
577
+
578
+ if ( physics && this.enabled.physics && ! this.sharedPhysics ) {
579
+
580
+ this.onBeforePhysics( mesh );
581
+ physics.update( delta );
582
+
583
+ }
584
+
585
+ }
586
+
587
+ // Sort bones in order by 1. transformationClass and 2. bone index.
588
+ // In PMX animation system, bone transformations should be processed
589
+ // in this order.
590
+ _sortBoneDataArray( boneDataArray ) {
591
+
592
+ return boneDataArray.sort( function ( a, b ) {
593
+
594
+ if ( a.transformationClass !== b.transformationClass ) {
595
+
596
+ return a.transformationClass - b.transformationClass;
597
+
598
+ } else {
599
+
600
+ return a.index - b.index;
601
+
602
+ }
603
+
604
+ } );
605
+
606
+ }
607
+
608
+ // PMX Animation system is a bit too complex and doesn't great match to
609
+ // Three.js Animation system. This method attempts to simulate it as much as
610
+ // possible but doesn't perfectly simulate.
611
+ // This method is more costly than the regular one so
612
+ // you are recommended to set constructor parameter "pmxAnimation: true"
613
+ // only if your PMX model animation doesn't work well.
614
+ // If you need better method you would be required to write your own.
615
+ _animatePMXMesh( mesh, sortedBonesData, ikSolver, grantSolver ) {
616
+
617
+ _quaternionIndex = 0;
618
+ _grantResultMap.clear();
619
+
620
+ for ( let i = 0, il = sortedBonesData.length; i < il; i ++ ) {
621
+
622
+ updateOne( mesh, sortedBonesData[ i ].index, ikSolver, grantSolver );
623
+
624
+ }
625
+
626
+ mesh.updateMatrixWorld( true );
627
+ return this;
628
+
629
+ }
630
+
631
+ _animateCamera( camera, delta ) {
632
+
633
+ const mixer = this.objects.get( camera ).mixer;
634
+
635
+ if ( mixer && this.enabled.cameraAnimation ) {
636
+
637
+ mixer.update( delta );
638
+
639
+ camera.updateProjectionMatrix();
640
+
641
+ camera.up.set( 0, 1, 0 );
642
+ camera.up.applyQuaternion( camera.quaternion );
643
+ camera.lookAt( this.cameraTarget.position );
644
+
645
+ }
646
+
647
+ }
648
+
649
+ _optimizeIK( mesh, physicsEnabled ) {
650
+
651
+ const iks = mesh.geometry.userData.MMD.iks;
652
+ const bones = mesh.geometry.userData.MMD.bones;
653
+
654
+ for ( let i = 0, il = iks.length; i < il; i ++ ) {
655
+
656
+ const ik = iks[ i ];
657
+ const links = ik.links;
658
+
659
+ for ( let j = 0, jl = links.length; j < jl; j ++ ) {
660
+
661
+ const link = links[ j ];
662
+
663
+ if ( physicsEnabled === true ) {
664
+
665
+ // disable IK of the bone the corresponding rigidBody type of which is 1 or 2
666
+ // because its rotation will be overriden by physics
667
+ link.enabled = bones[ link.index ].rigidBodyType > 0 ? false : true;
668
+
669
+ } else {
670
+
671
+ link.enabled = true;
672
+
673
+ }
674
+
675
+ }
676
+
677
+ }
678
+
679
+ }
680
+
681
+ _createCCDIKSolver( mesh ) {
682
+
683
+ if ( CCDIKSolver === undefined ) {
684
+
685
+ throw new Error( 'THREE.MMDAnimationHelper: Import CCDIKSolver.' );
686
+
687
+ }
688
+
689
+ return new CCDIKSolver( mesh, mesh.geometry.userData.MMD.iks );
690
+
691
+ }
692
+
693
+ _createMMDPhysics( mesh, params ) {
694
+
695
+ if ( MMDPhysics === undefined ) {
696
+
697
+ throw new Error( 'THREE.MMDPhysics: Import MMDPhysics.' );
698
+
699
+ }
700
+
701
+ return new MMDPhysics(
702
+ mesh,
703
+ mesh.geometry.userData.MMD.rigidBodies,
704
+ mesh.geometry.userData.MMD.constraints,
705
+ params );
706
+
707
+ }
708
+
709
+ /*
710
+ * Detects the longest duration and then sets it to them to sync.
711
+ * TODO: Not to access private properties ( ._actions and ._clip )
712
+ */
713
+ _syncDuration() {
714
+
715
+ let max = 0.0;
716
+
717
+ const objects = this.objects;
718
+ const meshes = this.meshes;
719
+ const camera = this.camera;
720
+ const audioManager = this.audioManager;
721
+
722
+ // get the longest duration
723
+
724
+ for ( let i = 0, il = meshes.length; i < il; i ++ ) {
725
+
726
+ const mixer = this.objects.get( meshes[ i ] ).mixer;
727
+
728
+ if ( mixer === undefined ) continue;
729
+
730
+ for ( let j = 0; j < mixer._actions.length; j ++ ) {
731
+
732
+ const clip = mixer._actions[ j ]._clip;
733
+
734
+ if ( ! objects.has( clip ) ) {
735
+
736
+ objects.set( clip, {
737
+ duration: clip.duration
738
+ } );
739
+
740
+ }
741
+
742
+ max = Math.max( max, objects.get( clip ).duration );
743
+
744
+ }
745
+
746
+ }
747
+
748
+ if ( camera !== null ) {
749
+
750
+ const mixer = this.objects.get( camera ).mixer;
751
+
752
+ if ( mixer !== undefined ) {
753
+
754
+ for ( let i = 0, il = mixer._actions.length; i < il; i ++ ) {
755
+
756
+ const clip = mixer._actions[ i ]._clip;
757
+
758
+ if ( ! objects.has( clip ) ) {
759
+
760
+ objects.set( clip, {
761
+ duration: clip.duration
762
+ } );
763
+
764
+ }
765
+
766
+ max = Math.max( max, objects.get( clip ).duration );
767
+
768
+ }
769
+
770
+ }
771
+
772
+ }
773
+
774
+ if ( audioManager !== null ) {
775
+
776
+ max = Math.max( max, objects.get( audioManager ).duration );
777
+
778
+ }
779
+
780
+ max += this.configuration.afterglow;
781
+
782
+ // update the duration
783
+
784
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
785
+
786
+ const mixer = this.objects.get( this.meshes[ i ] ).mixer;
787
+
788
+ if ( mixer === undefined ) continue;
789
+
790
+ for ( let j = 0, jl = mixer._actions.length; j < jl; j ++ ) {
791
+
792
+ mixer._actions[ j ]._clip.duration = max;
793
+
794
+ }
795
+
796
+ }
797
+
798
+ if ( camera !== null ) {
799
+
800
+ const mixer = this.objects.get( camera ).mixer;
801
+
802
+ if ( mixer !== undefined ) {
803
+
804
+ for ( let i = 0, il = mixer._actions.length; i < il; i ++ ) {
805
+
806
+ mixer._actions[ i ]._clip.duration = max;
807
+
808
+ }
809
+
810
+ }
811
+
812
+ }
813
+
814
+ if ( audioManager !== null ) {
815
+
816
+ audioManager.duration = max;
817
+
818
+ }
819
+
820
+ }
821
+
822
+ // workaround
823
+
824
+ _updatePropertyMixersBuffer( mesh ) {
825
+
826
+ const mixer = this.objects.get( mesh ).mixer;
827
+
828
+ const propertyMixers = mixer._bindings;
829
+ const accuIndex = mixer._accuIndex;
830
+
831
+ for ( let i = 0, il = propertyMixers.length; i < il; i ++ ) {
832
+
833
+ const propertyMixer = propertyMixers[ i ];
834
+ const buffer = propertyMixer.buffer;
835
+ const stride = propertyMixer.valueSize;
836
+ const offset = ( accuIndex + 1 ) * stride;
837
+
838
+ propertyMixer.binding.getValue( buffer, offset );
839
+
840
+ }
841
+
842
+ }
843
+
844
+ /*
845
+ * Avoiding these two issues by restore/save bones before/after mixer animation.
846
+ *
847
+ * 1. PropertyMixer used by AnimationMixer holds cache value in .buffer.
848
+ * Calculating IK, Grant, and Physics after mixer animation can break
849
+ * the cache coherency.
850
+ *
851
+ * 2. Applying Grant two or more times without reset the posing breaks model.
852
+ */
853
+ _saveBones( mesh ) {
854
+
855
+ const objects = this.objects.get( mesh );
856
+
857
+ const bones = mesh.skeleton.bones;
858
+
859
+ let backupBones = objects.backupBones;
860
+
861
+ if ( backupBones === undefined ) {
862
+
863
+ backupBones = new Float32Array( bones.length * 7 );
864
+ objects.backupBones = backupBones;
865
+
866
+ }
867
+
868
+ for ( let i = 0, il = bones.length; i < il; i ++ ) {
869
+
870
+ const bone = bones[ i ];
871
+ bone.position.toArray( backupBones, i * 7 );
872
+ bone.quaternion.toArray( backupBones, i * 7 + 3 );
873
+
874
+ }
875
+
876
+ }
877
+
878
+ _restoreBones( mesh ) {
879
+
880
+ const objects = this.objects.get( mesh );
881
+
882
+ const backupBones = objects.backupBones;
883
+
884
+ if ( backupBones === undefined ) return;
885
+
886
+ const bones = mesh.skeleton.bones;
887
+
888
+ for ( let i = 0, il = bones.length; i < il; i ++ ) {
889
+
890
+ const bone = bones[ i ];
891
+ bone.position.fromArray( backupBones, i * 7 );
892
+ bone.quaternion.fromArray( backupBones, i * 7 + 3 );
893
+
894
+ }
895
+
896
+ }
897
+
898
+ // experimental
899
+
900
+ _getMasterPhysics() {
901
+
902
+ if ( this.masterPhysics !== null ) return this.masterPhysics;
903
+
904
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
905
+
906
+ const physics = this.meshes[ i ].physics;
907
+
908
+ if ( physics !== undefined && physics !== null ) {
909
+
910
+ this.masterPhysics = physics;
911
+ return this.masterPhysics;
912
+
913
+ }
914
+
915
+ }
916
+
917
+ return null;
918
+
919
+ }
920
+
921
+ _updateSharedPhysics( delta ) {
922
+
923
+ if ( this.meshes.length === 0 || ! this.enabled.physics || ! this.sharedPhysics ) return;
924
+
925
+ const physics = this._getMasterPhysics();
926
+
927
+ if ( physics === null ) return;
928
+
929
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
930
+
931
+ const p = this.meshes[ i ].physics;
932
+
933
+ if ( p !== null && p !== undefined ) {
934
+
935
+ p.updateRigidBodies();
936
+
937
+ }
938
+
939
+ }
940
+
941
+ physics.stepSimulation( delta );
942
+
943
+ for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
944
+
945
+ const p = this.meshes[ i ].physics;
946
+
947
+ if ( p !== null && p !== undefined ) {
948
+
949
+ p.updateBones();
950
+
951
+ }
952
+
953
+ }
954
+
955
+ }
956
+
957
+ }
958
+
959
+ // Keep working quaternions for less GC
960
+ const _quaternions = [];
961
+ let _quaternionIndex = 0;
962
+
963
+ function getQuaternion() {
964
+
965
+ if ( _quaternionIndex >= _quaternions.length ) {
966
+
967
+ _quaternions.push( new Quaternion() );
968
+
969
+ }
970
+
971
+ return _quaternions[ _quaternionIndex ++ ];
972
+
973
+ }
974
+
975
+ // Save rotation whose grant and IK are already applied
976
+ // used by grant children
977
+ const _grantResultMap = new Map();
978
+
979
+ function updateOne( mesh, boneIndex, ikSolver, grantSolver ) {
980
+
981
+ const bones = mesh.skeleton.bones;
982
+ const bonesData = mesh.geometry.userData.MMD.bones;
983
+ const boneData = bonesData[ boneIndex ];
984
+ const bone = bones[ boneIndex ];
985
+
986
+ // Return if already updated by being referred as a grant parent.
987
+ if ( _grantResultMap.has( boneIndex ) ) return;
988
+
989
+ const quaternion = getQuaternion();
990
+
991
+ // Initialize grant result here to prevent infinite loop.
992
+ // If it's referred before updating with actual result later
993
+ // result without applyting IK or grant is gotten
994
+ // but better than composing of infinite loop.
995
+ _grantResultMap.set( boneIndex, quaternion.copy( bone.quaternion ) );
996
+
997
+ // @TODO: Support global grant and grant position
998
+ if ( grantSolver && boneData.grant &&
999
+ ! boneData.grant.isLocal && boneData.grant.affectRotation ) {
1000
+
1001
+ const parentIndex = boneData.grant.parentIndex;
1002
+ const ratio = boneData.grant.ratio;
1003
+
1004
+ if ( ! _grantResultMap.has( parentIndex ) ) {
1005
+
1006
+ updateOne( mesh, parentIndex, ikSolver, grantSolver );
1007
+
1008
+ }
1009
+
1010
+ grantSolver.addGrantRotation( bone, _grantResultMap.get( parentIndex ), ratio );
1011
+
1012
+ }
1013
+
1014
+ if ( ikSolver && boneData.ik ) {
1015
+
1016
+ // @TODO: Updating world matrices every time solving an IK bone is
1017
+ // costly. Optimize if possible.
1018
+ mesh.updateMatrixWorld( true );
1019
+ ikSolver.updateOne( boneData.ik );
1020
+
1021
+ // No confident, but it seems the grant results with ik links should be updated?
1022
+ const links = boneData.ik.links;
1023
+
1024
+ for ( let i = 0, il = links.length; i < il; i ++ ) {
1025
+
1026
+ const link = links[ i ];
1027
+
1028
+ if ( link.enabled === false ) continue;
1029
+
1030
+ const linkIndex = link.index;
1031
+
1032
+ if ( _grantResultMap.has( linkIndex ) ) {
1033
+
1034
+ _grantResultMap.set( linkIndex, _grantResultMap.get( linkIndex ).copy( bones[ linkIndex ].quaternion ) );
1035
+
1036
+ }
1037
+
1038
+ }
1039
+
1040
+ }
1041
+
1042
+ // Update with the actual result here
1043
+ quaternion.copy( bone.quaternion );
1044
+
1045
+ }
1046
+
1047
+ //
1048
+
1049
+ class AudioManager {
1050
+
1051
+ /**
1052
+ * @param {THREE.Audio} audio
1053
+ * @param {Object} params - (optional)
1054
+ * @param {Nuumber} params.delayTime
1055
+ */
1056
+ constructor( audio, params = {} ) {
1057
+
1058
+ this.audio = audio;
1059
+
1060
+ this.elapsedTime = 0.0;
1061
+ this.currentTime = 0.0;
1062
+ this.delayTime = params.delayTime !== undefined
1063
+ ? params.delayTime : 0.0;
1064
+
1065
+ this.audioDuration = this.audio.buffer.duration;
1066
+ this.duration = this.audioDuration + this.delayTime;
1067
+
1068
+ }
1069
+
1070
+ /**
1071
+ * @param {Number} delta
1072
+ * @return {AudioManager}
1073
+ */
1074
+ control( delta ) {
1075
+
1076
+ this.elapsed += delta;
1077
+ this.currentTime += delta;
1078
+
1079
+ if ( this._shouldStopAudio() ) this.audio.stop();
1080
+ if ( this._shouldStartAudio() ) this.audio.play();
1081
+
1082
+ return this;
1083
+
1084
+ }
1085
+
1086
+ // private methods
1087
+
1088
+ _shouldStartAudio() {
1089
+
1090
+ if ( this.audio.isPlaying ) return false;
1091
+
1092
+ while ( this.currentTime >= this.duration ) {
1093
+
1094
+ this.currentTime -= this.duration;
1095
+
1096
+ }
1097
+
1098
+ if ( this.currentTime < this.delayTime ) return false;
1099
+
1100
+ // 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration
1101
+ if ( ( this.currentTime - this.delayTime ) > this.audioDuration ) return false;
1102
+
1103
+ return true;
1104
+
1105
+ }
1106
+
1107
+ _shouldStopAudio() {
1108
+
1109
+ return this.audio.isPlaying &&
1110
+ this.currentTime >= this.duration;
1111
+
1112
+ }
1113
+
1114
+ }
1115
+
1116
+ const _q = new Quaternion();
1117
+
1118
+ /**
1119
+ * Solver for Grant (Fuyo in Japanese. I just google translated because
1120
+ * Fuyo may be MMD specific term and may not be common word in 3D CG terms.)
1121
+ * Grant propagates a bone's transform to other bones transforms even if
1122
+ * they are not children.
1123
+ * @param {THREE.SkinnedMesh} mesh
1124
+ * @param {Array<Object>} grants
1125
+ */
1126
+ class GrantSolver {
1127
+
1128
+ constructor( mesh, grants = [] ) {
1129
+
1130
+ this.mesh = mesh;
1131
+ this.grants = grants;
1132
+
1133
+ }
1134
+
1135
+ /**
1136
+ * Solve all the grant bones
1137
+ * @return {GrantSolver}
1138
+ */
1139
+ update() {
1140
+
1141
+ const grants = this.grants;
1142
+
1143
+ for ( let i = 0, il = grants.length; i < il; i ++ ) {
1144
+
1145
+ this.updateOne( grants[ i ] );
1146
+
1147
+ }
1148
+
1149
+ return this;
1150
+
1151
+ }
1152
+
1153
+ /**
1154
+ * Solve a grant bone
1155
+ * @param {Object} grant - grant parameter
1156
+ * @return {GrantSolver}
1157
+ */
1158
+ updateOne( grant ) {
1159
+
1160
+ const bones = this.mesh.skeleton.bones;
1161
+ const bone = bones[ grant.index ];
1162
+ const parentBone = bones[ grant.parentIndex ];
1163
+
1164
+ if ( grant.isLocal ) {
1165
+
1166
+ // TODO: implement
1167
+ if ( grant.affectPosition ) {
1168
+
1169
+ }
1170
+
1171
+ // TODO: implement
1172
+ if ( grant.affectRotation ) {
1173
+
1174
+ }
1175
+
1176
+ } else {
1177
+
1178
+ // TODO: implement
1179
+ if ( grant.affectPosition ) {
1180
+
1181
+ }
1182
+
1183
+ if ( grant.affectRotation ) {
1184
+
1185
+ this.addGrantRotation( bone, parentBone.quaternion, grant.ratio );
1186
+
1187
+ }
1188
+
1189
+ }
1190
+
1191
+ return this;
1192
+
1193
+ }
1194
+
1195
+ addGrantRotation( bone, q, ratio ) {
1196
+
1197
+ _q.set( 0, 0, 0, 1 );
1198
+ _q.slerp( q, ratio );
1199
+ bone.quaternion.multiply( _q );
1200
+
1201
+ return this;
1202
+
1203
+ }
1204
+
1205
+ }
1206
+
1207
+ export { MMDAnimationHelper };