@babylonjs/core 5.16.0 → 5.18.0

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 (175) hide show
  1. package/Animations/animatable.js +1 -1
  2. package/Animations/animatable.js.map +1 -1
  3. package/Animations/animation.d.ts +8 -1
  4. package/Animations/animation.js +8 -1
  5. package/Animations/animation.js.map +1 -1
  6. package/Animations/animationGroup.js +5 -4
  7. package/Animations/animationGroup.js.map +1 -1
  8. package/Bones/skeleton.js +1 -1
  9. package/Bones/skeleton.js.map +1 -1
  10. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js +2 -2
  11. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
  12. package/Cameras/Inputs/flyCameraKeyboardInput.js +3 -3
  13. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  14. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  15. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  16. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +3 -3
  17. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  18. package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
  19. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  20. package/Cameras/VR/vrExperienceHelper.js +1 -1
  21. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  22. package/Cameras/VR/webVRCamera.js +1 -1
  23. package/Cameras/VR/webVRCamera.js.map +1 -1
  24. package/Cameras/camera.js +3 -3
  25. package/Cameras/camera.js.map +1 -1
  26. package/Engines/Extensions/engine.views.d.ts +13 -0
  27. package/Engines/Extensions/engine.views.js +16 -1
  28. package/Engines/Extensions/engine.views.js.map +1 -1
  29. package/Engines/Processors/shaderCodeCursor.js +2 -1
  30. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  31. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  32. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  33. package/Engines/engine.d.ts +2 -10
  34. package/Engines/engine.js +0 -14
  35. package/Engines/engine.js.map +1 -1
  36. package/Engines/engineFeatures.d.ts +2 -0
  37. package/Engines/engineFeatures.js.map +1 -1
  38. package/Engines/nativeEngine.d.ts +6 -2
  39. package/Engines/nativeEngine.js +13 -6
  40. package/Engines/nativeEngine.js.map +1 -1
  41. package/Engines/nullEngine.js +1 -0
  42. package/Engines/nullEngine.js.map +1 -1
  43. package/Engines/thinEngine.d.ts +10 -0
  44. package/Engines/thinEngine.js +26 -6
  45. package/Engines/thinEngine.js.map +1 -1
  46. package/Engines/webgpuEngine.js +1 -0
  47. package/Engines/webgpuEngine.js.map +1 -1
  48. package/Gizmos/axisDragGizmo.d.ts +11 -8
  49. package/Gizmos/axisDragGizmo.js.map +1 -1
  50. package/Gizmos/axisScaleGizmo.d.ts +20 -13
  51. package/Gizmos/axisScaleGizmo.js.map +1 -1
  52. package/Gizmos/boundingBoxGizmo.d.ts +27 -18
  53. package/Gizmos/boundingBoxGizmo.js +6 -0
  54. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  55. package/Gizmos/cameraGizmo.d.ts +8 -5
  56. package/Gizmos/cameraGizmo.js.map +1 -1
  57. package/Gizmos/gizmo.d.ts +48 -6
  58. package/Gizmos/gizmo.js.map +1 -1
  59. package/Gizmos/gizmoManager.d.ts +17 -9
  60. package/Gizmos/gizmoManager.js.map +1 -1
  61. package/Gizmos/lightGizmo.d.ts +12 -7
  62. package/Gizmos/lightGizmo.js.map +1 -1
  63. package/Gizmos/planeDragGizmo.d.ts +10 -8
  64. package/Gizmos/planeDragGizmo.js.map +1 -1
  65. package/Gizmos/planeRotationGizmo.d.ts +23 -14
  66. package/Gizmos/planeRotationGizmo.js.map +1 -1
  67. package/Gizmos/positionGizmo.d.ts +9 -7
  68. package/Gizmos/positionGizmo.js +1 -1
  69. package/Gizmos/positionGizmo.js.map +1 -1
  70. package/Gizmos/rotationGizmo.d.ts +6 -4
  71. package/Gizmos/rotationGizmo.js.map +1 -1
  72. package/Gizmos/scaleGizmo.d.ts +15 -12
  73. package/Gizmos/scaleGizmo.js.map +1 -1
  74. package/Inputs/scene.inputManager.js +0 -3
  75. package/Inputs/scene.inputManager.js.map +1 -1
  76. package/Loading/sceneLoader.js +5 -5
  77. package/Loading/sceneLoader.js.map +1 -1
  78. package/Materials/Node/Blocks/Fragment/TBNBlock.d.ts +12 -0
  79. package/Materials/Node/Blocks/Fragment/TBNBlock.js +50 -0
  80. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  81. package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +18 -0
  82. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +85 -1
  83. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  84. package/Materials/Node/Blocks/gradientBlock.js +1 -1
  85. package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
  86. package/Materials/Node/nodeMaterial.d.ts +18 -2
  87. package/Materials/Node/nodeMaterial.js +56 -27
  88. package/Materials/Node/nodeMaterial.js.map +1 -1
  89. package/Materials/Textures/baseTexture.d.ts +2 -1
  90. package/Materials/Textures/baseTexture.js +4 -1
  91. package/Materials/Textures/baseTexture.js.map +1 -1
  92. package/Materials/Textures/prePassRenderTarget.js +1 -1
  93. package/Materials/Textures/prePassRenderTarget.js.map +1 -1
  94. package/Materials/Textures/renderTargetTexture.js +11 -3
  95. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  96. package/Materials/materialDefines.js +3 -1
  97. package/Materials/materialDefines.js.map +1 -1
  98. package/Materials/shaderMaterial.d.ts +10 -1
  99. package/Materials/shaderMaterial.js +10 -1
  100. package/Materials/shaderMaterial.js.map +1 -1
  101. package/Maths/math.color.d.ts +9 -1
  102. package/Maths/math.color.js +13 -1
  103. package/Maths/math.color.js.map +1 -1
  104. package/Maths/math.vector.d.ts +2 -2
  105. package/Maths/math.vector.js +18 -30
  106. package/Maths/math.vector.js.map +1 -1
  107. package/Meshes/Builders/icoSphereBuilder.js +2 -2
  108. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  109. package/Meshes/Compression/dracoCompression.js +1 -1
  110. package/Meshes/Compression/dracoCompression.js.map +1 -1
  111. package/Meshes/abstractMesh.js +1 -1
  112. package/Meshes/abstractMesh.js.map +1 -1
  113. package/Meshes/geometry.js +1 -2
  114. package/Meshes/geometry.js.map +1 -1
  115. package/Meshes/thinInstanceMesh.js +5 -0
  116. package/Meshes/thinInstanceMesh.js.map +1 -1
  117. package/Misc/basis.js +3 -0
  118. package/Misc/basis.js.map +1 -1
  119. package/Misc/fileTools.js +2 -2
  120. package/Misc/fileTools.js.map +1 -1
  121. package/Misc/khronosTextureContainer2.js +1 -1
  122. package/Misc/khronosTextureContainer2.js.map +1 -1
  123. package/Misc/smartArray.js +0 -1
  124. package/Misc/smartArray.js.map +1 -1
  125. package/Misc/tools.d.ts +2 -2
  126. package/Misc/tools.js +4 -1
  127. package/Misc/tools.js.map +1 -1
  128. package/Offline/database.js +6 -8
  129. package/Offline/database.js.map +1 -1
  130. package/Particles/computeShaderParticleSystem.js +2 -2
  131. package/Particles/computeShaderParticleSystem.js.map +1 -1
  132. package/Particles/particleHelper.d.ts +12 -1
  133. package/Particles/particleHelper.js +12 -1
  134. package/Particles/particleHelper.js.map +1 -1
  135. package/Particles/particleSystem.js +2 -2
  136. package/Particles/particleSystem.js.map +1 -1
  137. package/Particles/particleSystemSet.js +1 -1
  138. package/Particles/particleSystemSet.js.map +1 -1
  139. package/Particles/solidParticleSystem.d.ts +3 -0
  140. package/Particles/solidParticleSystem.js +3 -0
  141. package/Particles/solidParticleSystem.js.map +1 -1
  142. package/Particles/webgl2ParticleSystem.js +2 -2
  143. package/Particles/webgl2ParticleSystem.js.map +1 -1
  144. package/Physics/Plugins/ammoJSPlugin.d.ts +2 -2
  145. package/Physics/Plugins/ammoJSPlugin.js +29 -29
  146. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  147. package/Physics/Plugins/cannonJSPlugin.d.ts +2 -2
  148. package/Physics/Plugins/cannonJSPlugin.js +26 -26
  149. package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
  150. package/Physics/Plugins/oimoJSPlugin.js +9 -11
  151. package/Physics/Plugins/oimoJSPlugin.js.map +1 -1
  152. package/Physics/physicsImpostor.d.ts +6 -6
  153. package/Physics/physicsImpostor.js +7 -6
  154. package/Physics/physicsImpostor.js.map +1 -1
  155. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -3
  156. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  157. package/Rendering/utilityLayerRenderer.js +1 -1
  158. package/Rendering/utilityLayerRenderer.js.map +1 -1
  159. package/Shaders/sprites.fragment.js +1 -1
  160. package/Shaders/sprites.fragment.js.map +1 -1
  161. package/Sprites/spriteManager.d.ts +10 -1
  162. package/Sprites/spriteManager.js +10 -1
  163. package/Sprites/spriteManager.js.map +1 -1
  164. package/Sprites/spriteRenderer.js +1 -1
  165. package/Sprites/spriteRenderer.js.map +1 -1
  166. package/XR/features/WebXRLayers.js +1 -1
  167. package/XR/features/WebXRLayers.js.map +1 -1
  168. package/assetContainer.js +12 -12
  169. package/assetContainer.js.map +1 -1
  170. package/node.js +1 -1
  171. package/node.js.map +1 -1
  172. package/package.json +1 -1
  173. package/scene.d.ts +2 -0
  174. package/scene.js +15 -8
  175. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"animationGroup.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Animations/animationGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC;;GAEG;AACH;IAAA;IA6BA,CAAC;IAnBG;;;OAGG;IACI,wCAAY,GAAnB;QACI,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,qCAAS,GAAhB;QACI,IAAM,mBAAmB,GAAQ,EAAE,CAAC;QACpC,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3D,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAE9C,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IACL,wBAAC;AAAD,CAAC,AA7BD,IA6BC;;AAED;;GAEG;AACH;IAwKI;;;;;;OAMG;IACH;IACI,sCAAsC;IAC/B,IAAY,EACnB,KAA6B;QAA7B,sBAAA,EAAA,YAA6B;QADtB,SAAI,GAAJ,IAAI,CAAQ;QA9Kf,wBAAmB,GAAG,IAAI,KAAK,EAAqB,CAAC;QACrD,iBAAY,GAAG,IAAI,KAAK,EAAc,CAAC;QACvC,UAAK,GAAG,MAAM,CAAC,SAAS,CAAC;QACzB,QAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QAGxB,gBAAW,GAAG,CAAC,CAAC;QAChB,mBAAc,GAAG,KAAK,CAAC;QACvB,gBAAW,GAAG,KAAK,CAAC;QAE5B,cAAc;QACP,qBAAgB,GAA4B,IAAI,CAAC;QAOxD;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAEtE;;WAEG;QACI,8BAAyB,GAAG,IAAI,UAAU,EAAqB,CAAC;QAEvE;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAEzE;;WAEG;QACI,kCAA6B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAExE;;WAEG;QACI,oCAA+B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAE1E;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAkB,CAAC;QAEzE;;WAEG;QACI,aAAQ,GAAQ,IAAI,CAAC;QA8HxB,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC,gBAAiB,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IA7HD,sBAAW,gCAAI;QAHf;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;;;OAAA;IAKD,sBAAW,8BAAE;QAHb;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,GAAG,CAAC;QACpB,CAAC;;;OAAA;IAKD,sBAAW,qCAAS;QAHpB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;;;OAAA;IAKD,sBAAW,qCAAS;QAHpB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,CAAC;;;OAAA;IAKD,sBAAW,sCAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED;;WAEG;aACH,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aAC5C;QACL,CAAC;;;OAhBA;IAqBD,sBAAW,yCAAa;QAHxB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,cAAc,CAAC;QAC/B,CAAC;aAED,UAAyB,KAAc;YACnC,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,EAAE;gBAC/B,OAAO;aACV;YAED,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;YAE5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5C,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;aAClD;QACL,CAAC;;;OAbA;IAkBD,sBAAW,sCAAU;QAHrB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAED,UAAsB,KAAc;YAChC,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE;gBAC5B,OAAO;aACV;YAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC5C,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aAC5C;QACL,CAAC;;;OAbA;IAkBD,sBAAW,8CAAkB;QAH7B;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;;;OAAA;IAKD,sBAAW,uCAAW;QAHtB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;;;OAAA;IAKD,sBAAW,oCAAQ;QAHnB;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,mBAAmB,CAAC;QACpC,CAAC;;;OAAA;IAoBD;;;;;OAKG;IACI,6CAAoB,GAA3B,UAA4B,SAAoB,EAAE,MAAW;QACzD,IAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAClD,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;QACxC,iBAAiB,CAAC,MAAM,GAAG,MAAM,CAAC;QAElC,IAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAC9B;QAED,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;YACxC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SAC1C;QAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEjD,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACI,kCAAS,GAAhB,UAAiB,UAAmC,EAAE,QAAiC;QAAtE,2BAAA,EAAA,iBAAmC;QAAE,yBAAA,EAAA,eAAiC;QACnF,IAAI,UAAU,IAAI,IAAI,EAAE;YACpB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;SAC3B;QACD,IAAI,QAAQ,IAAI,IAAI,EAAE;YAClB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;SACvB;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAClE,IAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1D,IAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACnD,IAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAErC,IAAI,QAAQ,CAAC,KAAK,GAAG,UAAU,EAAE;gBAC7B,IAAM,MAAM,GAAkB;oBAC1B,KAAK,EAAE,UAAU;oBACjB,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,aAAa,EAAE,QAAQ,CAAC,aAAa;iBACxC,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;aAC7B;YAED,IAAI,MAAM,CAAC,KAAK,GAAG,QAAQ,EAAE;gBACzB,IAAM,MAAM,GAAkB;oBAC1B,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;iBACtC,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrB;SACJ;QAED,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QAEpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAKO,qCAAY,GAApB,UAAqB,UAAsB,EAAE,iBAAoC,EAAE,KAAa;QAAhG,iBAiBC;QAhBG,UAAU,CAAC,eAAe,GAAG;YACzB,KAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAElE,IAAI,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBACjC,OAAO;aACV;YAED,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAEvC,KAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,KAAI,CAAC,mBAAmB,KAAK,KAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;gBAC9D,KAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,KAAI,CAAC,CAAC;gBAC1D,KAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAC7B,KAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;aACjC;QACL,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACI,8BAAK,GAAZ,UAAa,IAAY,EAAE,UAAc,EAAE,IAAa,EAAE,EAAW,EAAE,UAAoB;QAA3F,iBAwCC;QAxCY,qBAAA,EAAA,YAAY;QAAE,2BAAA,EAAA,cAAc;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1D,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;gCAErB,KAAK;YACV,IAAM,iBAAiB,GAAG,OAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1D,IAAM,UAAU,GAAG,OAAK,MAAM,CAAC,oBAAoB,CAC/C,iBAAiB,CAAC,MAAM,EACxB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAC7B,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAK,KAAK,EACtC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAK,GAAG,EAChC,IAAI,EACJ,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAK,WAAW,CAC3D,CAAC;YACF,UAAU,CAAC,cAAc,GAAG;gBACxB,KAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;gBACjE,KAAI,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC,CAAC;YAEF,OAAK,YAAY,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACxD,OAAK,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;QAnBvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE;oBAA3D,KAAK;SAoBb;QAED,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,8BAAK,GAAZ;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,+BAA+B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE3D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,6BAAI,GAAX,UAAY,IAAc;QACtB,8CAA8C;QAC9C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YAChF,IAAI,IAAI,KAAK,SAAS,EAAE;gBACpB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;aAC7B;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;SAClB;aAAM;YACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACtC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,8BAAK,GAAZ;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,KAAK,EAAE,CAAC;SACtB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,gCAAO,GAAd;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,OAAO,EAAE,CAAC;SACxB;QAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1D,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;OAGG;IACI,6BAAI,GAAX;QACI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,IAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;SACtB;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,mDAA0B,GAAjC,UAAkC,MAAc;QAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;SAC9B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,8CAAqB,GAA5B,UAA6B,IAA0B;QACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC7B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,kCAAS,GAAhB,UAAiB,KAAa;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAClB,OAAO,IAAI,CAAC;SACf;QAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC3D,IAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5C,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,gCAAO,GAAd;QACI,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,oBAAoB;QACpB,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAChD;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAM,OAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,OAAK,GAAG,CAAC,CAAC,EAAE;gBACZ,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,OAAK,EAAE,CAAC,CAAC,CAAC;aAC1D;YACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAChC;QAED,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,CAAC;QAC7C,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;IAChD,CAAC;IAEO,kDAAyB,GAAjC,UAAkC,UAAsB;QACpD,8CAA8C;QAC9C,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;YACV,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;SACpC;QAED,uDAAuD;QACvD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC5D;IACL,CAAC;IAED;;;;;;OAMG;IACI,8BAAK,GAAZ,UAAa,OAAe,EAAE,eAAyC,EAAE,eAAuB;QAAvB,gCAAA,EAAA,uBAAuB;QAC5F,IAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvE,KAA8B,UAAwB,EAAxB,KAAA,IAAI,CAAC,mBAAmB,EAAxB,cAAwB,EAAxB,IAAwB,EAAE;YAAnD,IAAM,eAAe,SAAA;YACtB,QAAQ,CAAC,oBAAoB,CACzB,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,SAAS,EAC/E,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CACrF,CAAC;SACL;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACI,kCAAS,GAAhB;QACI,IAAM,mBAAmB,GAAQ,EAAE,CAAC;QAEpC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,mBAAmB,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjC,mBAAmB,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC5C,KAAK,IAAI,sBAAsB,GAAG,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE;YACpH,IAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC;YAC1E,mBAAmB,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,GAAG,iBAAiB,CAAC,SAAS,EAAE,CAAC;SAClG;QAED,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC5B,mBAAmB,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACjD;QAED,WAAW;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SAChD;QAED,OAAO,mBAAmB,CAAC;IAC/B,CAAC;IAED,UAAU;IACV;;;;;OAKG;IACW,oBAAK,GAAnB,UAAoB,oBAAyB,EAAE,KAAY;QACvD,IAAM,cAAc,GAAG,IAAI,cAAc,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrE,IAAM,iBAAiB,GAAG,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACrE,IAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC/D,IAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YACtC,IAAI,iBAAiB,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE;gBACtD,yBAAyB;gBACzB,IAAM,WAAW,GAAG,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,WAAW,EAAE;oBACb,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;iBAC/D;aACJ;iBAAM;gBACH,IAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAEzC,IAAI,UAAU,IAAI,IAAI,EAAE;oBACpB,cAAc,CAAC,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;iBAC9D;aACJ;SACJ;QAED,IAAI,oBAAoB,CAAC,IAAI,KAAK,IAAI,IAAI,oBAAoB,CAAC,EAAE,KAAK,IAAI,EAAE;YACxE,cAAc,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAChF;QAED,IAAI,IAAI,EAAE;YACN,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;SAC7D;QAED,IAAI,oBAAoB,CAAC,QAAQ,KAAK,SAAS,EAAE;YAC7C,cAAc,CAAC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC;SAC3D;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;;;;;OAQG;IACW,oCAAqB,GAAnC,UAAoC,oBAAoC,EAAE,cAAkB,EAAE,KAAc,EAAE,aAAqB,EAAE,UAAmB;QAA9E,+BAAA,EAAA,kBAAkB;QAAkB,8BAAA,EAAA,qBAAqB;QAC/H,IAAI,cAAc,GAAG,oBAAoB,CAAC;QAC1C,IAAI,aAAa,EAAE;YACf,cAAc,GAAG,oBAAoB,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;SAClF;QAED,IAAM,kBAAkB,GAAG,cAAc,CAAC,kBAAkB,CAAC;QAC7D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC5D,IAAM,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACpD,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;SACvF;QAED,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC;QAEjC,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,qCAAY,GAAnB;QACI,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACI,iCAAQ,GAAf,UAAgB,WAAqB;QACjC,IAAI,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,IAAI,WAAW,EAAE;YACb,GAAG,IAAI,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,GAAG,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;YAC3B,GAAG,IAAI,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC;YACzC,GAAG,IAAI,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC;YAC3C,GAAG,IAAI,+BAA+B,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;YACzE,GAAG,IAAI,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC;SACvD;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IACL,qBAAC;AAAD,CAAC,AA/pBD,IA+pBC","sourcesContent":["import type { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { Tags } from \"../Misc/tags\";\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array<TargetedAnimation>();\r\n private _animatables = new Array<Animatable>();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * Gets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n /**\r\n * Gets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array<TargetedAnimation> {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array<Animatable> {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/divingDeeper/animation/groupAnimations\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable<Scene> = null\r\n ) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n const targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n const keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable<number> = null, endFrame: Nullable<number> = null): AnimationGroup {\r\n if (beginFrame == null) {\r\n beginFrame = this._from;\r\n }\r\n if (endFrame == null) {\r\n endFrame = this._to;\r\n }\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const keys = targetedAnimation.animation.getKeys();\r\n const startKey = keys[0];\r\n const endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation,\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation,\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._targetedAnimations.length) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags = [];\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n const list = this._animatables.slice();\r\n for (let index = 0; index < list.length; index++) {\r\n list[index].stop();\r\n }\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n * @param weight defines the weight to use\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable<Animatable>): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @return the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations = [];\r\n this._animatables = [];\r\n\r\n // Remove from scene\r\n const index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n const idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n const newGroup = new AnimationGroup(newName || this.name, this._scene);\r\n\r\n for (const targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(\r\n cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target\r\n );\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.targetedAnimations = [];\r\n for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n const targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n const animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene);\r\n for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n const targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n const animation = Animation.Parse(targetedAnimation.animation);\r\n const id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") {\r\n // morph target animation\r\n const morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n } else {\r\n const targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);\r\n }\r\n\r\n if (parsedAnimationGroup.metadata !== undefined) {\r\n animationGroup.metadata = parsedAnimationGroup.metadata;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame = 0, range?: string, cloneOriginal = false, clonedName?: string): AnimationGroup {\r\n let animationGroup = sourceAnimationGroup;\r\n if (cloneOriginal) {\r\n animationGroup = sourceAnimationGroup.clone(clonedName || animationGroup.name);\r\n }\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n Animation.MakeAnimationAdditive(targetedAnimation.animation, referenceFrame, range);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"animationGroup.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Animations/animationGroup.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Animatable } from \"./animatable\";\r\nimport { Animation } from \"./animation\";\r\nimport type { IAnimationKey } from \"./animationKey\";\r\n\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\n\r\nimport type { AbstractScene } from \"../abstractScene\";\r\nimport { Tags } from \"../Misc/tags\";\r\n\r\n/**\r\n * This class defines the direct association between an animation and a target\r\n */\r\nexport class TargetedAnimation {\r\n /**\r\n * Animation to perform\r\n */\r\n public animation: Animation;\r\n /**\r\n * Target to animate\r\n */\r\n public target: any;\r\n\r\n /**\r\n * Returns the string \"TargetedAnimation\"\r\n * @returns \"TargetedAnimation\"\r\n */\r\n public getClassName(): string {\r\n return \"TargetedAnimation\";\r\n }\r\n\r\n /**\r\n * Serialize the object\r\n * @returns the JSON object representing the current entity\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.animation = this.animation.serialize();\r\n serializationObject.targetId = this.target.id;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\n/**\r\n * Use this class to create coordinated animations on multiple targets\r\n */\r\nexport class AnimationGroup implements IDisposable {\r\n private _scene: Scene;\r\n\r\n private _targetedAnimations = new Array<TargetedAnimation>();\r\n private _animatables = new Array<Animatable>();\r\n private _from = Number.MAX_VALUE;\r\n private _to = -Number.MAX_VALUE;\r\n private _isStarted: boolean;\r\n private _isPaused: boolean;\r\n private _speedRatio = 1;\r\n private _loopAnimation = false;\r\n private _isAdditive = false;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * This observable will notify when one animation have ended\r\n */\r\n public onAnimationEndObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when one animation loops\r\n */\r\n public onAnimationLoopObservable = new Observable<TargetedAnimation>();\r\n\r\n /**\r\n * Observer raised when all animations have looped\r\n */\r\n public onAnimationGroupLoopObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have ended.\r\n */\r\n public onAnimationGroupEndObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations have paused.\r\n */\r\n public onAnimationGroupPauseObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * This observable will notify when all animations are playing.\r\n */\r\n public onAnimationGroupPlayObservable = new Observable<AnimationGroup>();\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n public metadata: any = null;\r\n\r\n /**\r\n * Gets the first frame\r\n */\r\n public get from(): number {\r\n return this._from;\r\n }\r\n\r\n /**\r\n * Gets the last frame\r\n */\r\n public get to(): number {\r\n return this._to;\r\n }\r\n\r\n /**\r\n * Define if the animations are started\r\n */\r\n public get isStarted(): boolean {\r\n return this._isStarted;\r\n }\r\n\r\n /**\r\n * Gets a value indicating that the current group is playing\r\n */\r\n public get isPlaying(): boolean {\r\n return this._isStarted && !this._isPaused;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public get speedRatio(): number {\r\n return this._speedRatio;\r\n }\r\n\r\n /**\r\n * Gets or sets the speed ratio to use for all animations\r\n */\r\n public set speedRatio(value: number) {\r\n if (this._speedRatio === value) {\r\n return;\r\n }\r\n\r\n this._speedRatio = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.speedRatio = this._speedRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should loop or not\r\n */\r\n public get loopAnimation(): boolean {\r\n return this._loopAnimation;\r\n }\r\n\r\n public set loopAnimation(value: boolean) {\r\n if (this._loopAnimation === value) {\r\n return;\r\n }\r\n\r\n this._loopAnimation = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.loopAnimation = this._loopAnimation;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets if all animations should be evaluated additively\r\n */\r\n public get isAdditive(): boolean {\r\n return this._isAdditive;\r\n }\r\n\r\n public set isAdditive(value: boolean) {\r\n if (this._isAdditive === value) {\r\n return;\r\n }\r\n\r\n this._isAdditive = value;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.isAdditive = this._isAdditive;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the targeted animations for this animation group\r\n */\r\n public get targetedAnimations(): Array<TargetedAnimation> {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * returning the list of animatables controlled by this animation group.\r\n */\r\n public get animatables(): Array<Animatable> {\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Gets the list of target animations\r\n */\r\n public get children() {\r\n return this._targetedAnimations;\r\n }\r\n\r\n /**\r\n * Instantiates a new Animation Group.\r\n * This helps managing several animations at once.\r\n * @see https://doc.babylonjs.com/divingDeeper/animation/groupAnimations\r\n * @param name Defines the name of the group\r\n * @param scene Defines the scene the group belongs to\r\n */\r\n public constructor(\r\n /** The name of the animation group */\r\n public name: string,\r\n scene: Nullable<Scene> = null\r\n ) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this.uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addAnimationGroup(this);\r\n }\r\n\r\n /**\r\n * Add an animation (with its target) in the group\r\n * @param animation defines the animation we want to add\r\n * @param target defines the target of the animation\r\n * @returns the TargetedAnimation object\r\n */\r\n public addTargetedAnimation(animation: Animation, target: any): TargetedAnimation {\r\n const targetedAnimation = new TargetedAnimation();\r\n targetedAnimation.animation = animation;\r\n targetedAnimation.target = target;\r\n\r\n const keys = animation.getKeys();\r\n if (this._from > keys[0].frame) {\r\n this._from = keys[0].frame;\r\n }\r\n\r\n if (this._to < keys[keys.length - 1].frame) {\r\n this._to = keys[keys.length - 1].frame;\r\n }\r\n\r\n this._targetedAnimations.push(targetedAnimation);\r\n\r\n return targetedAnimation;\r\n }\r\n\r\n /**\r\n * This function will normalize every animation in the group to make sure they all go from beginFrame to endFrame\r\n * It can add constant keys at begin or end\r\n * @param beginFrame defines the new begin frame for all animations or the smallest begin frame of all animations if null (defaults to null)\r\n * @param endFrame defines the new end frame for all animations or the largest end frame of all animations if null (defaults to null)\r\n * @returns the animation group\r\n */\r\n public normalize(beginFrame: Nullable<number> = null, endFrame: Nullable<number> = null): AnimationGroup {\r\n if (beginFrame == null) {\r\n beginFrame = this._from;\r\n }\r\n if (endFrame == null) {\r\n endFrame = this._to;\r\n }\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const keys = targetedAnimation.animation.getKeys();\r\n const startKey = keys[0];\r\n const endKey = keys[keys.length - 1];\r\n\r\n if (startKey.frame > beginFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: beginFrame,\r\n value: startKey.value,\r\n inTangent: startKey.inTangent,\r\n outTangent: startKey.outTangent,\r\n interpolation: startKey.interpolation,\r\n };\r\n keys.splice(0, 0, newKey);\r\n }\r\n\r\n if (endKey.frame < endFrame) {\r\n const newKey: IAnimationKey = {\r\n frame: endFrame,\r\n value: endKey.value,\r\n inTangent: endKey.inTangent,\r\n outTangent: endKey.outTangent,\r\n interpolation: endKey.interpolation,\r\n };\r\n keys.push(newKey);\r\n }\r\n }\r\n\r\n this._from = beginFrame;\r\n this._to = endFrame;\r\n\r\n return this;\r\n }\r\n\r\n private _animationLoopCount: number;\r\n private _animationLoopFlags: boolean[] = [];\r\n\r\n private _processLoop(animatable: Animatable, targetedAnimation: TargetedAnimation, index: number) {\r\n animatable.onAnimationLoop = () => {\r\n this.onAnimationLoopObservable.notifyObservers(targetedAnimation);\r\n\r\n if (this._animationLoopFlags[index]) {\r\n return;\r\n }\r\n\r\n this._animationLoopFlags[index] = true;\r\n\r\n this._animationLoopCount++;\r\n if (this._animationLoopCount === this._targetedAnimations.length) {\r\n this.onAnimationGroupLoopObservable.notifyObservers(this);\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Start all animations on given targets\r\n * @param loop defines if animations must loop\r\n * @param speedRatio defines the ratio to apply to animation speed (1 by default)\r\n * @param from defines the from key (optional)\r\n * @param to defines the to key (optional)\r\n * @param isAdditive defines the additive state for the resulting animatables (optional)\r\n * @returns the current animation group\r\n */\r\n public start(loop = false, speedRatio = 1, from?: number, to?: number, isAdditive?: boolean): AnimationGroup {\r\n if (this._isStarted || this._targetedAnimations.length === 0) {\r\n return this;\r\n }\r\n\r\n this._loopAnimation = loop;\r\n\r\n this._animationLoopCount = 0;\r\n this._animationLoopFlags.length = 0;\r\n\r\n for (let index = 0; index < this._targetedAnimations.length; index++) {\r\n const targetedAnimation = this._targetedAnimations[index];\r\n const animatable = this._scene.beginDirectAnimation(\r\n targetedAnimation.target,\r\n [targetedAnimation.animation],\r\n from !== undefined ? from : this._from,\r\n to !== undefined ? to : this._to,\r\n loop,\r\n speedRatio,\r\n undefined,\r\n undefined,\r\n isAdditive !== undefined ? isAdditive : this._isAdditive\r\n );\r\n animatable.onAnimationEnd = () => {\r\n this.onAnimationEndObservable.notifyObservers(targetedAnimation);\r\n this._checkAnimationGroupEnded(animatable);\r\n };\r\n\r\n this._processLoop(animatable, targetedAnimation, index);\r\n this._animatables.push(animatable);\r\n }\r\n\r\n this._speedRatio = speedRatio;\r\n\r\n this._isStarted = true;\r\n this._isPaused = false;\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Pause all animations\r\n * @returns the animation group\r\n */\r\n public pause(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n this._isPaused = true;\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.pause();\r\n }\r\n\r\n this.onAnimationGroupPauseObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Play all animations to initial state\r\n * This function will start() the animations if they were not started or will restart() them if they were paused\r\n * @param loop defines if animations must loop\r\n * @returns the animation group\r\n */\r\n public play(loop?: boolean): AnimationGroup {\r\n // only if all animatables are ready and exist\r\n if (this.isStarted && this._animatables.length === this._targetedAnimations.length) {\r\n if (loop !== undefined) {\r\n this.loopAnimation = loop;\r\n }\r\n this.restart();\r\n } else {\r\n this.stop();\r\n this.start(loop, this._speedRatio);\r\n }\r\n\r\n this._isPaused = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset all animations to initial state\r\n * @returns the animation group\r\n */\r\n public reset(): AnimationGroup {\r\n if (!this._isStarted) {\r\n this.play();\r\n this.goToFrame(0);\r\n this.stop();\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.reset();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Restart animations from key 0\r\n * @returns the animation group\r\n */\r\n public restart(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.restart();\r\n }\r\n\r\n this.onAnimationGroupPlayObservable.notifyObservers(this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Stop all animations\r\n * @returns the animation group\r\n */\r\n public stop(): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n const list = this._animatables.slice();\r\n for (let index = 0; index < list.length; index++) {\r\n list[index].stop();\r\n }\r\n\r\n this._isStarted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set animation weight for all animatables\r\n * @param weight defines the weight to use\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public setWeightForAllAnimatables(weight: number): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.weight = weight;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Synchronize and normalize all animatables with a source animatable\r\n * @param root defines the root animatable to synchronize with (null to stop synchronizing)\r\n * @return the animationGroup\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-weights\r\n */\r\n public syncAllAnimationsWith(root: Nullable<Animatable>): AnimationGroup {\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.syncWith(root);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Goes to a specific frame in this animation group\r\n * @param frame the frame number to go to\r\n * @return the animationGroup\r\n */\r\n public goToFrame(frame: number): AnimationGroup {\r\n if (!this._isStarted) {\r\n return this;\r\n }\r\n\r\n for (let index = 0; index < this._animatables.length; index++) {\r\n const animatable = this._animatables[index];\r\n animatable.goToFrame(frame);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Dispose all associated resources\r\n */\r\n public dispose(): void {\r\n this._targetedAnimations.length = 0;\r\n this._animatables.length = 0;\r\n\r\n // Remove from scene\r\n const index = this._scene.animationGroups.indexOf(this);\r\n\r\n if (index > -1) {\r\n this._scene.animationGroups.splice(index, 1);\r\n }\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.animationGroups.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.animationGroups.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n this.onAnimationEndObservable.clear();\r\n this.onAnimationGroupEndObservable.clear();\r\n this.onAnimationGroupPauseObservable.clear();\r\n this.onAnimationGroupPlayObservable.clear();\r\n this.onAnimationLoopObservable.clear();\r\n this.onAnimationGroupLoopObservable.clear();\r\n }\r\n\r\n private _checkAnimationGroupEnded(animatable: Animatable) {\r\n // animatable should be taken out of the array\r\n const idx = this._animatables.indexOf(animatable);\r\n if (idx > -1) {\r\n this._animatables.splice(idx, 1);\r\n }\r\n\r\n // all animatables were removed? animation group ended!\r\n if (this._animatables.length === 0) {\r\n this._isStarted = false;\r\n this.onAnimationGroupEndObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Clone the current animation group and returns a copy\r\n * @param newName defines the name of the new group\r\n * @param targetConverter defines an optional function used to convert current animation targets to new ones\r\n * @param cloneAnimations defines if the animations should be cloned or referenced\r\n * @returns the new animation group\r\n */\r\n public clone(newName: string, targetConverter?: (oldTarget: any) => any, cloneAnimations = false): AnimationGroup {\r\n const newGroup = new AnimationGroup(newName || this.name, this._scene);\r\n\r\n for (const targetAnimation of this._targetedAnimations) {\r\n newGroup.addTargetedAnimation(\r\n cloneAnimations ? targetAnimation.animation.clone() : targetAnimation.animation,\r\n targetConverter ? targetConverter(targetAnimation.target) : targetAnimation.target\r\n );\r\n }\r\n\r\n return newGroup;\r\n }\r\n\r\n /**\r\n * Serializes the animationGroup to an object\r\n * @returns Serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.from = this.from;\r\n serializationObject.to = this.to;\r\n serializationObject.targetedAnimations = [];\r\n for (let targetedAnimationIndex = 0; targetedAnimationIndex < this.targetedAnimations.length; targetedAnimationIndex++) {\r\n const targetedAnimation = this.targetedAnimations[targetedAnimationIndex];\r\n serializationObject.targetedAnimations[targetedAnimationIndex] = targetedAnimation.serialize();\r\n }\r\n\r\n if (Tags && Tags.HasTags(this)) {\r\n serializationObject.tags = Tags.GetTags(this);\r\n }\r\n\r\n // Metadata\r\n if (this.metadata) {\r\n serializationObject.metadata = this.metadata;\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Returns a new AnimationGroup object parsed from the source provided.\r\n * @param parsedAnimationGroup defines the source\r\n * @param scene defines the scene that will receive the animationGroup\r\n * @returns a new AnimationGroup\r\n */\r\n public static Parse(parsedAnimationGroup: any, scene: Scene): AnimationGroup {\r\n const animationGroup = new AnimationGroup(parsedAnimationGroup.name, scene);\r\n for (let i = 0; i < parsedAnimationGroup.targetedAnimations.length; i++) {\r\n const targetedAnimation = parsedAnimationGroup.targetedAnimations[i];\r\n const animation = Animation.Parse(targetedAnimation.animation);\r\n const id = targetedAnimation.targetId;\r\n if (targetedAnimation.animation.property === \"influence\") {\r\n // morph target animation\r\n const morphTarget = scene.getMorphTargetById(id);\r\n if (morphTarget) {\r\n animationGroup.addTargetedAnimation(animation, morphTarget);\r\n }\r\n } else {\r\n const targetNode = scene.getNodeById(id);\r\n\r\n if (targetNode != null) {\r\n animationGroup.addTargetedAnimation(animation, targetNode);\r\n }\r\n }\r\n }\r\n\r\n if (parsedAnimationGroup.from !== null && parsedAnimationGroup.to !== null) {\r\n animationGroup.normalize(parsedAnimationGroup.from, parsedAnimationGroup.to);\r\n }\r\n\r\n if (Tags) {\r\n Tags.AddTagsTo(animationGroup, parsedAnimationGroup.tags);\r\n }\r\n\r\n if (parsedAnimationGroup.metadata !== undefined) {\r\n animationGroup.metadata = parsedAnimationGroup.metadata;\r\n }\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Convert the keyframes for all animations belonging to the group to be relative to a given reference frame.\r\n * @param sourceAnimationGroup defines the AnimationGroup containing animations to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the animations in the group to convert\r\n * @param cloneOriginal defines whether or not to clone the group and convert the clone or convert the original group (default is false)\r\n * @param clonedName defines the name of the resulting cloned AnimationGroup if cloneOriginal is true\r\n * @returns a new AnimationGroup if cloneOriginal is true or the original AnimationGroup if cloneOriginal is false\r\n */\r\n public static MakeAnimationAdditive(sourceAnimationGroup: AnimationGroup, referenceFrame = 0, range?: string, cloneOriginal = false, clonedName?: string): AnimationGroup {\r\n let animationGroup = sourceAnimationGroup;\r\n if (cloneOriginal) {\r\n animationGroup = sourceAnimationGroup.clone(clonedName || animationGroup.name);\r\n }\r\n\r\n const targetedAnimations = animationGroup.targetedAnimations;\r\n for (let index = 0; index < targetedAnimations.length; index++) {\r\n const targetedAnimation = targetedAnimations[index];\r\n Animation.MakeAnimationAdditive(targetedAnimation.animation, referenceFrame, range);\r\n }\r\n\r\n animationGroup.isAdditive = true;\r\n\r\n return animationGroup;\r\n }\r\n\r\n /**\r\n * Returns the string \"AnimationGroup\"\r\n * @returns \"AnimationGroup\"\r\n */\r\n public getClassName(): string {\r\n return \"AnimationGroup\";\r\n }\r\n\r\n /**\r\n * Creates a detailed string about the object\r\n * @param fullDetails defines if the output string will support multiple levels of logging within scene loading\r\n * @returns a string representing the object\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = \"Name: \" + this.name;\r\n ret += \", type: \" + this.getClassName();\r\n if (fullDetails) {\r\n ret += \", from: \" + this._from;\r\n ret += \", to: \" + this._to;\r\n ret += \", isStarted: \" + this._isStarted;\r\n ret += \", speedRatio: \" + this._speedRatio;\r\n ret += \", targetedAnimations length: \" + this._targetedAnimations.length;\r\n ret += \", animatables length: \" + this._animatables;\r\n }\r\n return ret;\r\n }\r\n}\r\n"]}
package/Bones/skeleton.js CHANGED
@@ -568,7 +568,7 @@ var Skeleton = /** @class */ (function () {
568
568
  * Releases all resources associated with the current skeleton
569
569
  */
570
570
  Skeleton.prototype.dispose = function () {
571
- this._meshesWithPoseMatrix = [];
571
+ this._meshesWithPoseMatrix.length = 0;
572
572
  // Animations
573
573
  this.getScene().stopAnimation(this);
574
574
  // Remove from scene
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Bones/skeleton.ts"],"names":[],"mappings":"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","sourcesContent":["import { Bone } from \"./bone\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { Animatable } from \"../Animations/animatable\";\r\nimport type { AnimationPropertiesOverride } from \"../Animations/animationPropertiesOverride\";\r\nimport { Animation } from \"../Animations/animation\";\r\nimport { AnimationRange } from \"../Animations/animationRange\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\n\r\n/**\r\n * Class used to handle skinning animations\r\n * @see https://doc.babylonjs.com/how_to/how_to_use_bones_and_skeletons\r\n */\r\nexport class Skeleton implements IAnimatable {\r\n /**\r\n * Defines the list of child bones\r\n */\r\n public bones = new Array<Bone>();\r\n /**\r\n * Defines an estimate of the dimension of the skeleton at rest\r\n */\r\n public dimensionsAtRest: Vector3;\r\n /**\r\n * Defines a boolean indicating if the root matrix is provided by meshes or by the current skeleton (this is the default value)\r\n */\r\n public needInitialSkinMatrix = false;\r\n\r\n /**\r\n * Gets the list of animations attached to this skeleton\r\n */\r\n public animations: Array<Animation>;\r\n\r\n private _scene: Scene;\r\n private _isDirty = true;\r\n private _transformMatrices: Float32Array;\r\n private _transformMatrixTexture: Nullable<RawTexture>;\r\n private _meshesWithPoseMatrix = new Array<AbstractMesh>();\r\n private _animatables: IAnimatable[];\r\n private _identity = Matrix.Identity();\r\n private _synchronizedWithMesh: AbstractMesh;\r\n\r\n private _ranges: { [name: string]: Nullable<AnimationRange> } = {};\r\n\r\n private _absoluteTransformIsDirty = true;\r\n\r\n private _canUseTextureForBones = false;\r\n private _uniqueId = 0;\r\n\r\n /** @hidden */\r\n public _numBonesWithLinkedTransformNode = 0;\r\n\r\n /** @hidden */\r\n public _hasWaitingData: Nullable<boolean> = null;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Specifies if the skeleton should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n private _useTextureToStoreBoneMatrices = true;\r\n /**\r\n * Gets or sets a boolean indicating that bone matrices should be stored as a texture instead of using shader uniforms (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreBoneMatrices(): boolean {\r\n return this._useTextureToStoreBoneMatrices;\r\n }\r\n\r\n public set useTextureToStoreBoneMatrices(value: boolean) {\r\n this._useTextureToStoreBoneMatrices = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _animationPropertiesOverride: Nullable<AnimationPropertiesOverride> = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable<AnimationPropertiesOverride> {\r\n if (!this._animationPropertiesOverride) {\r\n return this._scene.animationPropertiesOverride;\r\n }\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable<AnimationPropertiesOverride>) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/how_to/debug_layer#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n // Events\r\n\r\n /**\r\n * An observable triggered before computing the skeleton's matrices\r\n */\r\n public onBeforeComputeObservable = new Observable<Skeleton>();\r\n\r\n /**\r\n * Gets a boolean indicating that the skeleton effectively stores matrices into a texture\r\n */\r\n public get isUsingTextureForMatrices() {\r\n return this.useTextureToStoreBoneMatrices && this._canUseTextureForBones;\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this skeleton\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Creates a new skeleton\r\n * @param name defines the skeleton name\r\n * @param id defines the skeleton Id\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(\r\n /** defines the skeleton name */\r\n public name: string,\r\n /** defines the skeleton Id */\r\n public id: string,\r\n scene: Scene\r\n ) {\r\n this.bones = [];\r\n\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addSkeleton(this);\r\n\r\n //make sure it will recalculate the matrix next time prepare is called.\r\n this._isDirty = true;\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForBones = engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0;\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @return the class name\r\n */\r\n public getClassName(): string {\r\n return \"Skeleton\";\r\n }\r\n\r\n /**\r\n * Returns an array containing the root bones\r\n * @returns an array containing the root bones\r\n */\r\n public getChildren(): Array<Bone> {\r\n return this.bones.filter((b) => !b.getParent());\r\n }\r\n\r\n // Members\r\n /**\r\n * Gets the list of transform matrices to send to shaders (one matrix per bone)\r\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\r\n * @returns a Float32Array containing matrices data\r\n */\r\n public getTransformMatrices(mesh: AbstractMesh): Float32Array {\r\n if (this.needInitialSkinMatrix) {\r\n if (!mesh._bonesTransformMatrices) {\r\n this.prepare();\r\n }\r\n\r\n return mesh._bonesTransformMatrices!;\r\n }\r\n\r\n if (!this._transformMatrices) {\r\n this.prepare();\r\n }\r\n\r\n return this._transformMatrices;\r\n }\r\n\r\n /**\r\n * Gets the list of transform matrices to send to shaders inside a texture (one matrix per bone)\r\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\r\n * @returns a raw texture containing the data\r\n */\r\n public getTransformMatrixTexture(mesh: AbstractMesh): Nullable<RawTexture> {\r\n if (this.needInitialSkinMatrix && mesh._transformMatrixTexture) {\r\n return mesh._transformMatrixTexture;\r\n }\r\n\r\n return this._transformMatrixTexture;\r\n }\r\n\r\n /**\r\n * Gets the current hosting scene\r\n * @returns a scene object\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Gets a string representing the current skeleton data\r\n * @param fullDetails defines a boolean indicating if we want a verbose version\r\n * @returns a string representing the current skeleton data\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = `Name: ${this.name}, nBones: ${this.bones.length}`;\r\n ret += `, nAnimationRanges: ${this._ranges ? Object.keys(this._ranges).length : \"none\"}`;\r\n if (fullDetails) {\r\n ret += \", Ranges: {\";\r\n let first = true;\r\n for (const name in this._ranges) {\r\n if (first) {\r\n ret += \", \";\r\n first = false;\r\n }\r\n ret += name;\r\n }\r\n ret += \"}\";\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Get bone's index searching by name\r\n * @param name defines bone's name to search for\r\n * @return the indice of the bone. Returns -1 if not found\r\n */\r\n public getBoneIndexByName(name: string): number {\r\n for (let boneIndex = 0, cache = this.bones.length; boneIndex < cache; boneIndex++) {\r\n if (this.bones[boneIndex].name === name) {\r\n return boneIndex;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Create a new animation range\r\n * @param name defines the name of the range\r\n * @param from defines the start key\r\n * @param to defines the end key\r\n */\r\n public createAnimationRange(name: string, from: number, to: number): void {\r\n // check name not already in use\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = new AnimationRange(name, from, to);\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n this.bones[i].animations[0].createRange(name, from, to);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Delete a specific animation range\r\n * @param name defines the name of the range\r\n * @param deleteFrames defines if frames must be removed as well\r\n */\r\n public deleteAnimationRange(name: string, deleteFrames = true): void {\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n this.bones[i].animations[0].deleteRange(name, deleteFrames);\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Gets a specific animation range\r\n * @param name defines the name of the range to look for\r\n * @returns the requested animation range or null if not found\r\n */\r\n public getAnimationRange(name: string): Nullable<AnimationRange> {\r\n return this._ranges[name] || null;\r\n }\r\n\r\n /**\r\n * Gets the list of all animation ranges defined on this skeleton\r\n * @returns an array\r\n */\r\n public getAnimationRanges(): Nullable<AnimationRange>[] {\r\n const animationRanges: Nullable<AnimationRange>[] = [];\r\n let name: string;\r\n for (name in this._ranges) {\r\n animationRanges.push(this._ranges[name]);\r\n }\r\n return animationRanges;\r\n }\r\n\r\n /**\r\n * Copy animation range from a source skeleton.\r\n * This is not for a complete retargeting, only between very similar skeleton's with only possible bone length differences\r\n * @param source defines the source skeleton\r\n * @param name defines the name of the range to copy\r\n * @param rescaleAsRequired defines if rescaling must be applied if required\r\n * @returns true if operation was successful\r\n */\r\n public copyAnimationRange(source: Skeleton, name: string, rescaleAsRequired = false): boolean {\r\n if (this._ranges[name] || !source.getAnimationRange(name)) {\r\n return false;\r\n }\r\n let ret = true;\r\n const frameOffset = this._getHighestAnimationFrame() + 1;\r\n\r\n // make a dictionary of source skeleton's bones, so exact same order or doubly nested loop is not required\r\n const boneDict: { [key: string]: Bone } = {};\r\n const sourceBones = source.bones;\r\n let nBones: number;\r\n let i: number;\r\n for (i = 0, nBones = sourceBones.length; i < nBones; i++) {\r\n boneDict[sourceBones[i].name] = sourceBones[i];\r\n }\r\n\r\n if (this.bones.length !== sourceBones.length) {\r\n Logger.Warn(`copyAnimationRange: this rig has ${this.bones.length} bones, while source as ${sourceBones.length}`);\r\n ret = false;\r\n }\r\n\r\n const skelDimensionsRatio = rescaleAsRequired && this.dimensionsAtRest && source.dimensionsAtRest ? this.dimensionsAtRest.divide(source.dimensionsAtRest) : null;\r\n\r\n for (i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n const boneName = this.bones[i].name;\r\n const sourceBone = boneDict[boneName];\r\n if (sourceBone) {\r\n ret = ret && this.bones[i].copyAnimationRange(sourceBone, name, frameOffset, rescaleAsRequired, skelDimensionsRatio);\r\n } else {\r\n Logger.Warn(\"copyAnimationRange: not same rig, missing source bone \" + boneName);\r\n ret = false;\r\n }\r\n }\r\n // do not call createAnimationRange(), since it also is done to bones, which was already done\r\n const range = source.getAnimationRange(name);\r\n if (range) {\r\n this._ranges[name] = new AnimationRange(name, range.from + frameOffset, range.to + frameOffset);\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Forces the skeleton to go to rest pose\r\n */\r\n public returnToRest(): void {\r\n for (const bone of this.bones) {\r\n if (bone._index !== -1) {\r\n bone.returnToRest();\r\n }\r\n }\r\n }\r\n\r\n private _getHighestAnimationFrame(): number {\r\n let ret = 0;\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n const highest = this.bones[i].animations[0].getHighestFrame();\r\n if (ret < highest) {\r\n ret = highest;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Begin a specific animation range\r\n * @param name defines the name of the range to start\r\n * @param loop defines if looping must be turned on (false by default)\r\n * @param speedRatio defines the speed ratio to apply (1 by default)\r\n * @param onAnimationEnd defines a callback which will be called when animation will end\r\n * @returns a new animatable\r\n */\r\n public beginAnimation(name: string, loop?: boolean, speedRatio?: number, onAnimationEnd?: () => void): Nullable<Animatable> {\r\n const range = this.getAnimationRange(name);\r\n\r\n if (!range) {\r\n return null;\r\n }\r\n\r\n return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Convert the keyframes for a range of animation on a skeleton to be relative to a given reference frame.\r\n * @param skeleton defines the Skeleton containing the animation range to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the Skeleton to convert\r\n * @returns the original skeleton\r\n */\r\n public static MakeAnimationAdditive(skeleton: Skeleton, referenceFrame = 0, range: string): Nullable<Skeleton> {\r\n const rangeValue = skeleton.getAnimationRange(range);\r\n\r\n // We can't make a range additive if it doesn't exist\r\n if (!rangeValue) {\r\n return null;\r\n }\r\n\r\n // Find any current scene-level animatable belonging to the target that matches the range\r\n const sceneAnimatables = skeleton._scene.getAllAnimatablesByTarget(skeleton);\r\n let rangeAnimatable: Nullable<Animatable> = null;\r\n\r\n for (let index = 0; index < sceneAnimatables.length; index++) {\r\n const sceneAnimatable = sceneAnimatables[index];\r\n\r\n if (sceneAnimatable.fromFrame === rangeValue?.from && sceneAnimatable.toFrame === rangeValue?.to) {\r\n rangeAnimatable = sceneAnimatable;\r\n break;\r\n }\r\n }\r\n\r\n // Convert the animations belonging to the skeleton to additive keyframes\r\n const animatables = skeleton.getAnimatables();\r\n\r\n for (let index = 0; index < animatables.length; index++) {\r\n const animatable = animatables[index];\r\n const animations = animatable.animations;\r\n\r\n if (!animations) {\r\n continue;\r\n }\r\n\r\n for (let animIndex = 0; animIndex < animations.length; animIndex++) {\r\n Animation.MakeAnimationAdditive(animations[animIndex], referenceFrame, range);\r\n }\r\n }\r\n\r\n // Mark the scene-level animatable as additive\r\n if (rangeAnimatable) {\r\n rangeAnimatable.isAdditive = true;\r\n }\r\n\r\n return skeleton;\r\n }\r\n\r\n /** @hidden */\r\n public _markAsDirty(): void {\r\n this._isDirty = true;\r\n this._absoluteTransformIsDirty = true;\r\n }\r\n\r\n /**\r\n * @param mesh\r\n * @hidden\r\n */\r\n public _registerMeshWithPoseMatrix(mesh: AbstractMesh): void {\r\n this._meshesWithPoseMatrix.push(mesh);\r\n }\r\n\r\n /**\r\n * @param mesh\r\n * @hidden\r\n */\r\n public _unregisterMeshWithPoseMatrix(mesh: AbstractMesh): void {\r\n const index = this._meshesWithPoseMatrix.indexOf(mesh);\r\n\r\n if (index > -1) {\r\n this._meshesWithPoseMatrix.splice(index, 1);\r\n }\r\n }\r\n\r\n private _computeTransformMatrices(targetMatrix: Float32Array, initialSkinMatrix: Nullable<Matrix>): void {\r\n this.onBeforeComputeObservable.notifyObservers(this);\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const bone = this.bones[index];\r\n bone._childUpdateId++;\r\n const parentBone = bone.getParent();\r\n\r\n if (parentBone) {\r\n bone.getLocalMatrix().multiplyToRef(parentBone.getWorldMatrix(), bone.getWorldMatrix());\r\n } else {\r\n if (initialSkinMatrix) {\r\n bone.getLocalMatrix().multiplyToRef(initialSkinMatrix, bone.getWorldMatrix());\r\n } else {\r\n bone.getWorldMatrix().copyFrom(bone.getLocalMatrix());\r\n }\r\n }\r\n\r\n if (bone._index !== -1) {\r\n const mappedIndex = bone._index === null ? index : bone._index;\r\n bone.getInvertedAbsoluteTransform().multiplyToArray(bone.getWorldMatrix(), targetMatrix, mappedIndex * 16);\r\n }\r\n }\r\n\r\n this._identity.copyToArray(targetMatrix, this.bones.length * 16);\r\n }\r\n\r\n /**\r\n * Build all resources required to render a skeleton\r\n */\r\n public prepare(): void {\r\n // Update the local matrix of bones with linked transform nodes.\r\n if (this._numBonesWithLinkedTransformNode > 0) {\r\n for (const bone of this.bones) {\r\n if (bone._linkedTransformNode) {\r\n // Computing the world matrix also computes the local matrix.\r\n bone._linkedTransformNode.computeWorldMatrix();\r\n bone._matrix = bone._linkedTransformNode._localMatrix;\r\n }\r\n }\r\n }\r\n\r\n if (this.needInitialSkinMatrix) {\r\n for (const mesh of this._meshesWithPoseMatrix) {\r\n const poseMatrix = mesh.getPoseMatrix();\r\n\r\n let needsUpdate = this._isDirty;\r\n if (!mesh._bonesTransformMatrices || mesh._bonesTransformMatrices.length !== 16 * (this.bones.length + 1)) {\r\n mesh._bonesTransformMatrices = new Float32Array(16 * (this.bones.length + 1));\r\n needsUpdate = true;\r\n }\r\n\r\n if (!needsUpdate) {\r\n continue;\r\n }\r\n\r\n if (this._synchronizedWithMesh !== mesh) {\r\n this._synchronizedWithMesh = mesh;\r\n\r\n // Prepare bones\r\n for (const bone of this.bones) {\r\n if (!bone.getParent()) {\r\n const matrix = bone.getBaseMatrix();\r\n matrix.multiplyToRef(poseMatrix, TmpVectors.Matrix[1]);\r\n bone._updateDifferenceMatrix(TmpVectors.Matrix[1]);\r\n }\r\n }\r\n\r\n if (this.isUsingTextureForMatrices) {\r\n const textureWidth = (this.bones.length + 1) * 4;\r\n if (!mesh._transformMatrixTexture || mesh._transformMatrixTexture.getSize().width !== textureWidth) {\r\n if (mesh._transformMatrixTexture) {\r\n mesh._transformMatrixTexture.dispose();\r\n }\r\n\r\n mesh._transformMatrixTexture = RawTexture.CreateRGBATexture(\r\n mesh._bonesTransformMatrices,\r\n (this.bones.length + 1) * 4,\r\n 1,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n }\r\n\r\n this._computeTransformMatrices(mesh._bonesTransformMatrices, poseMatrix);\r\n\r\n if (this.isUsingTextureForMatrices && mesh._transformMatrixTexture) {\r\n mesh._transformMatrixTexture.update(mesh._bonesTransformMatrices);\r\n }\r\n }\r\n } else {\r\n if (!this._isDirty) {\r\n return;\r\n }\r\n\r\n if (!this._transformMatrices || this._transformMatrices.length !== 16 * (this.bones.length + 1)) {\r\n this._transformMatrices = new Float32Array(16 * (this.bones.length + 1));\r\n\r\n if (this.isUsingTextureForMatrices) {\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n }\r\n\r\n this._transformMatrixTexture = RawTexture.CreateRGBATexture(\r\n this._transformMatrices,\r\n (this.bones.length + 1) * 4,\r\n 1,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n\r\n this._computeTransformMatrices(this._transformMatrices, null);\r\n\r\n if (this.isUsingTextureForMatrices && this._transformMatrixTexture) {\r\n this._transformMatrixTexture.update(this._transformMatrices);\r\n }\r\n }\r\n\r\n this._isDirty = false;\r\n }\r\n\r\n /**\r\n * Gets the list of animatables currently running for this skeleton\r\n * @returns an array of animatables\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n if (!this._animatables || this._animatables.length !== this.bones.length) {\r\n this._animatables = [];\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n this._animatables.push(this.bones[index]);\r\n }\r\n }\r\n\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Clone the current skeleton\r\n * @param name defines the name of the new skeleton\r\n * @param id defines the id of the new skeleton\r\n * @returns the new skeleton\r\n */\r\n public clone(name: string, id?: string): Skeleton {\r\n const result = new Skeleton(name, id || name, this._scene);\r\n\r\n result.needInitialSkinMatrix = this.needInitialSkinMatrix;\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const source = this.bones[index];\r\n let parentBone = null;\r\n\r\n const parent = source.getParent();\r\n if (parent) {\r\n const parentIndex = this.bones.indexOf(parent);\r\n parentBone = result.bones[parentIndex];\r\n }\r\n\r\n const bone = new Bone(source.name, result, parentBone, source.getBaseMatrix().clone(), source.getRestPose().clone());\r\n bone._index = source._index;\r\n\r\n if (source._linkedTransformNode) {\r\n bone.linkTransformNode(source._linkedTransformNode);\r\n }\r\n\r\n DeepCopier.DeepCopy(source.animations, bone.animations);\r\n }\r\n\r\n if (this._ranges) {\r\n result._ranges = {};\r\n for (const rangeName in this._ranges) {\r\n const range = this._ranges[rangeName];\r\n\r\n if (range) {\r\n result._ranges[rangeName] = range.clone();\r\n }\r\n }\r\n }\r\n\r\n this._isDirty = true;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Enable animation blending for this skeleton\r\n * @param blendingSpeed defines the blending speed to apply\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-blending\r\n */\r\n public enableBlending(blendingSpeed = 0.01) {\r\n this.bones.forEach((bone) => {\r\n bone.animations.forEach((animation: Animation) => {\r\n animation.enableBlending = true;\r\n animation.blendingSpeed = blendingSpeed;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Releases all resources associated with the current skeleton\r\n */\r\n public dispose() {\r\n this._meshesWithPoseMatrix = [];\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeSkeleton(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.skeletons.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.skeletons.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serialize the skeleton in a JSON object\r\n * @returns a JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n\r\n if (this.dimensionsAtRest) {\r\n serializationObject.dimensionsAtRest = this.dimensionsAtRest.asArray();\r\n }\r\n\r\n serializationObject.bones = [];\r\n\r\n serializationObject.needInitialSkinMatrix = this.needInitialSkinMatrix;\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const bone = this.bones[index];\r\n const parent = bone.getParent();\r\n\r\n const serializedBone: any = {\r\n parentBoneIndex: parent ? this.bones.indexOf(parent) : -1,\r\n index: bone.getIndex(),\r\n name: bone.name,\r\n id: bone.id,\r\n matrix: bone.getBaseMatrix().toArray(),\r\n rest: bone.getRestPose().toArray(),\r\n linkedTransformNodeId: bone.getTransformNode()?.id,\r\n };\r\n\r\n serializationObject.bones.push(serializedBone);\r\n\r\n if (bone.length) {\r\n serializedBone.length = bone.length;\r\n }\r\n\r\n if (bone.metadata) {\r\n serializedBone.metadata = bone.metadata;\r\n }\r\n\r\n if (bone.animations && bone.animations.length > 0) {\r\n serializedBone.animation = bone.animations[0].serialize();\r\n }\r\n\r\n serializationObject.ranges = [];\r\n for (const name in this._ranges) {\r\n const source = this._ranges[name];\r\n\r\n if (!source) {\r\n continue;\r\n }\r\n\r\n const range: any = {};\r\n range.name = name;\r\n range.from = source.from;\r\n range.to = source.to;\r\n serializationObject.ranges.push(range);\r\n }\r\n }\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a new skeleton from serialized data\r\n * @param parsedSkeleton defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns a new skeleton\r\n */\r\n public static Parse(parsedSkeleton: any, scene: Scene): Skeleton {\r\n const skeleton = new Skeleton(parsedSkeleton.name, parsedSkeleton.id, scene);\r\n if (parsedSkeleton.dimensionsAtRest) {\r\n skeleton.dimensionsAtRest = Vector3.FromArray(parsedSkeleton.dimensionsAtRest);\r\n }\r\n\r\n skeleton.needInitialSkinMatrix = parsedSkeleton.needInitialSkinMatrix;\r\n\r\n let index: number;\r\n for (index = 0; index < parsedSkeleton.bones.length; index++) {\r\n const parsedBone = parsedSkeleton.bones[index];\r\n const parsedBoneIndex = parsedSkeleton.bones[index].index;\r\n let parentBone = null;\r\n if (parsedBone.parentBoneIndex > -1) {\r\n parentBone = skeleton.bones[parsedBone.parentBoneIndex];\r\n }\r\n\r\n const rest: Nullable<Matrix> = parsedBone.rest ? Matrix.FromArray(parsedBone.rest) : null;\r\n const bone = new Bone(parsedBone.name, skeleton, parentBone, Matrix.FromArray(parsedBone.matrix), rest, null, parsedBoneIndex);\r\n\r\n if (parsedBone.id !== undefined && parsedBone.id !== null) {\r\n bone.id = parsedBone.id;\r\n }\r\n\r\n if (parsedBone.length) {\r\n bone.length = parsedBone.length;\r\n }\r\n\r\n if (parsedBone.metadata) {\r\n bone.metadata = parsedBone.metadata;\r\n }\r\n\r\n if (parsedBone.animation) {\r\n bone.animations.push(Animation.Parse(parsedBone.animation));\r\n }\r\n\r\n if (parsedBone.linkedTransformNodeId !== undefined && parsedBone.linkedTransformNodeId !== null) {\r\n skeleton._hasWaitingData = true;\r\n bone._waitingTransformNodeId = parsedBone.linkedTransformNodeId;\r\n }\r\n }\r\n\r\n // placed after bones, so createAnimationRange can cascade down\r\n if (parsedSkeleton.ranges) {\r\n for (index = 0; index < parsedSkeleton.ranges.length; index++) {\r\n const data = parsedSkeleton.ranges[index];\r\n skeleton.createAnimationRange(data.name, data.from, data.to);\r\n }\r\n }\r\n return skeleton;\r\n }\r\n\r\n /**\r\n * Compute all node absolute transforms\r\n * @param forceUpdate defines if computation must be done even if cache is up to date\r\n */\r\n public computeAbsoluteTransforms(forceUpdate = false): void {\r\n if (this._absoluteTransformIsDirty || forceUpdate) {\r\n this.bones[0].computeAbsoluteTransforms();\r\n this._absoluteTransformIsDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the root pose matrix\r\n * @returns a matrix\r\n */\r\n public getPoseMatrix(): Nullable<Matrix> {\r\n let poseMatrix: Nullable<Matrix> = null;\r\n\r\n if (this._meshesWithPoseMatrix.length > 0) {\r\n poseMatrix = this._meshesWithPoseMatrix[0].getPoseMatrix();\r\n }\r\n\r\n return poseMatrix;\r\n }\r\n\r\n /**\r\n * Sorts bones per internal index\r\n */\r\n public sortBones(): void {\r\n const bones = new Array<Bone>();\r\n const visited = new Array<boolean>(this.bones.length);\r\n for (let index = 0; index < this.bones.length; index++) {\r\n this._sortBones(index, bones, visited);\r\n }\r\n\r\n this.bones = bones;\r\n }\r\n\r\n private _sortBones(index: number, bones: Bone[], visited: boolean[]): void {\r\n if (visited[index]) {\r\n return;\r\n }\r\n\r\n visited[index] = true;\r\n\r\n const bone = this.bones[index];\r\n if (!bone) return;\r\n\r\n if (bone._index === undefined) {\r\n bone._index = index;\r\n }\r\n\r\n const parentBone = bone.getParent();\r\n if (parentBone) {\r\n this._sortBones(this.bones.indexOf(parentBone), bones, visited);\r\n }\r\n\r\n bones.push(bone);\r\n }\r\n\r\n /**\r\n * Set the current local matrix as the restPose for all bones in the skeleton.\r\n */\r\n public setCurrentPoseAsRest(): void {\r\n this.bones.forEach((b) => {\r\n b.setCurrentPoseAsRest();\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Bones/skeleton.ts"],"names":[],"mappings":"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","sourcesContent":["import { Bone } from \"./bone\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport type { Animatable } from \"../Animations/animatable\";\r\nimport type { AnimationPropertiesOverride } from \"../Animations/animationPropertiesOverride\";\r\nimport { Animation } from \"../Animations/animation\";\r\nimport { AnimationRange } from \"../Animations/animationRange\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { DeepCopier } from \"../Misc/deepCopier\";\r\nimport type { IInspectable } from \"../Misc/iInspectable\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport type { AbstractScene } from \"../abstractScene\";\r\n\r\n/**\r\n * Class used to handle skinning animations\r\n * @see https://doc.babylonjs.com/how_to/how_to_use_bones_and_skeletons\r\n */\r\nexport class Skeleton implements IAnimatable {\r\n /**\r\n * Defines the list of child bones\r\n */\r\n public bones = new Array<Bone>();\r\n /**\r\n * Defines an estimate of the dimension of the skeleton at rest\r\n */\r\n public dimensionsAtRest: Vector3;\r\n /**\r\n * Defines a boolean indicating if the root matrix is provided by meshes or by the current skeleton (this is the default value)\r\n */\r\n public needInitialSkinMatrix = false;\r\n\r\n /**\r\n * Gets the list of animations attached to this skeleton\r\n */\r\n public animations: Array<Animation>;\r\n\r\n private _scene: Scene;\r\n private _isDirty = true;\r\n private _transformMatrices: Float32Array;\r\n private _transformMatrixTexture: Nullable<RawTexture>;\r\n private _meshesWithPoseMatrix = new Array<AbstractMesh>();\r\n private _animatables: IAnimatable[];\r\n private _identity = Matrix.Identity();\r\n private _synchronizedWithMesh: AbstractMesh;\r\n\r\n private _ranges: { [name: string]: Nullable<AnimationRange> } = {};\r\n\r\n private _absoluteTransformIsDirty = true;\r\n\r\n private _canUseTextureForBones = false;\r\n private _uniqueId = 0;\r\n\r\n /** @hidden */\r\n public _numBonesWithLinkedTransformNode = 0;\r\n\r\n /** @hidden */\r\n public _hasWaitingData: Nullable<boolean> = null;\r\n\r\n /** @hidden */\r\n public _parentContainer: Nullable<AbstractScene> = null;\r\n\r\n /**\r\n * Specifies if the skeleton should be serialized\r\n */\r\n public doNotSerialize = false;\r\n\r\n private _useTextureToStoreBoneMatrices = true;\r\n /**\r\n * Gets or sets a boolean indicating that bone matrices should be stored as a texture instead of using shader uniforms (default is true).\r\n * Please note that this option is not available if the hardware does not support it\r\n */\r\n public get useTextureToStoreBoneMatrices(): boolean {\r\n return this._useTextureToStoreBoneMatrices;\r\n }\r\n\r\n public set useTextureToStoreBoneMatrices(value: boolean) {\r\n this._useTextureToStoreBoneMatrices = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _animationPropertiesOverride: Nullable<AnimationPropertiesOverride> = null;\r\n\r\n /**\r\n * Gets or sets the animation properties override\r\n */\r\n public get animationPropertiesOverride(): Nullable<AnimationPropertiesOverride> {\r\n if (!this._animationPropertiesOverride) {\r\n return this._scene.animationPropertiesOverride;\r\n }\r\n return this._animationPropertiesOverride;\r\n }\r\n\r\n public set animationPropertiesOverride(value: Nullable<AnimationPropertiesOverride>) {\r\n this._animationPropertiesOverride = value;\r\n }\r\n\r\n /**\r\n * List of inspectable custom properties (used by the Inspector)\r\n * @see https://doc.babylonjs.com/how_to/debug_layer#extensibility\r\n */\r\n public inspectableCustomProperties: IInspectable[];\r\n\r\n // Events\r\n\r\n /**\r\n * An observable triggered before computing the skeleton's matrices\r\n */\r\n public onBeforeComputeObservable = new Observable<Skeleton>();\r\n\r\n /**\r\n * Gets a boolean indicating that the skeleton effectively stores matrices into a texture\r\n */\r\n public get isUsingTextureForMatrices() {\r\n return this.useTextureToStoreBoneMatrices && this._canUseTextureForBones;\r\n }\r\n\r\n /**\r\n * Gets the unique ID of this skeleton\r\n */\r\n public get uniqueId(): number {\r\n return this._uniqueId;\r\n }\r\n\r\n /**\r\n * Creates a new skeleton\r\n * @param name defines the skeleton name\r\n * @param id defines the skeleton Id\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(\r\n /** defines the skeleton name */\r\n public name: string,\r\n /** defines the skeleton Id */\r\n public id: string,\r\n scene: Scene\r\n ) {\r\n this.bones = [];\r\n\r\n this._scene = scene || EngineStore.LastCreatedScene;\r\n this._uniqueId = this._scene.getUniqueId();\r\n\r\n this._scene.addSkeleton(this);\r\n\r\n //make sure it will recalculate the matrix next time prepare is called.\r\n this._isDirty = true;\r\n\r\n const engineCaps = this._scene.getEngine().getCaps();\r\n this._canUseTextureForBones = engineCaps.textureFloat && engineCaps.maxVertexTextureImageUnits > 0;\r\n }\r\n\r\n /**\r\n * Gets the current object class name.\r\n * @return the class name\r\n */\r\n public getClassName(): string {\r\n return \"Skeleton\";\r\n }\r\n\r\n /**\r\n * Returns an array containing the root bones\r\n * @returns an array containing the root bones\r\n */\r\n public getChildren(): Array<Bone> {\r\n return this.bones.filter((b) => !b.getParent());\r\n }\r\n\r\n // Members\r\n /**\r\n * Gets the list of transform matrices to send to shaders (one matrix per bone)\r\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\r\n * @returns a Float32Array containing matrices data\r\n */\r\n public getTransformMatrices(mesh: AbstractMesh): Float32Array {\r\n if (this.needInitialSkinMatrix) {\r\n if (!mesh._bonesTransformMatrices) {\r\n this.prepare();\r\n }\r\n\r\n return mesh._bonesTransformMatrices!;\r\n }\r\n\r\n if (!this._transformMatrices) {\r\n this.prepare();\r\n }\r\n\r\n return this._transformMatrices;\r\n }\r\n\r\n /**\r\n * Gets the list of transform matrices to send to shaders inside a texture (one matrix per bone)\r\n * @param mesh defines the mesh to use to get the root matrix (if needInitialSkinMatrix === true)\r\n * @returns a raw texture containing the data\r\n */\r\n public getTransformMatrixTexture(mesh: AbstractMesh): Nullable<RawTexture> {\r\n if (this.needInitialSkinMatrix && mesh._transformMatrixTexture) {\r\n return mesh._transformMatrixTexture;\r\n }\r\n\r\n return this._transformMatrixTexture;\r\n }\r\n\r\n /**\r\n * Gets the current hosting scene\r\n * @returns a scene object\r\n */\r\n public getScene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n // Methods\r\n\r\n /**\r\n * Gets a string representing the current skeleton data\r\n * @param fullDetails defines a boolean indicating if we want a verbose version\r\n * @returns a string representing the current skeleton data\r\n */\r\n public toString(fullDetails?: boolean): string {\r\n let ret = `Name: ${this.name}, nBones: ${this.bones.length}`;\r\n ret += `, nAnimationRanges: ${this._ranges ? Object.keys(this._ranges).length : \"none\"}`;\r\n if (fullDetails) {\r\n ret += \", Ranges: {\";\r\n let first = true;\r\n for (const name in this._ranges) {\r\n if (first) {\r\n ret += \", \";\r\n first = false;\r\n }\r\n ret += name;\r\n }\r\n ret += \"}\";\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Get bone's index searching by name\r\n * @param name defines bone's name to search for\r\n * @return the indice of the bone. Returns -1 if not found\r\n */\r\n public getBoneIndexByName(name: string): number {\r\n for (let boneIndex = 0, cache = this.bones.length; boneIndex < cache; boneIndex++) {\r\n if (this.bones[boneIndex].name === name) {\r\n return boneIndex;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Create a new animation range\r\n * @param name defines the name of the range\r\n * @param from defines the start key\r\n * @param to defines the end key\r\n */\r\n public createAnimationRange(name: string, from: number, to: number): void {\r\n // check name not already in use\r\n if (!this._ranges[name]) {\r\n this._ranges[name] = new AnimationRange(name, from, to);\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n this.bones[i].animations[0].createRange(name, from, to);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Delete a specific animation range\r\n * @param name defines the name of the range\r\n * @param deleteFrames defines if frames must be removed as well\r\n */\r\n public deleteAnimationRange(name: string, deleteFrames = true): void {\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n this.bones[i].animations[0].deleteRange(name, deleteFrames);\r\n }\r\n }\r\n this._ranges[name] = null; // said much faster than 'delete this._range[name]'\r\n }\r\n\r\n /**\r\n * Gets a specific animation range\r\n * @param name defines the name of the range to look for\r\n * @returns the requested animation range or null if not found\r\n */\r\n public getAnimationRange(name: string): Nullable<AnimationRange> {\r\n return this._ranges[name] || null;\r\n }\r\n\r\n /**\r\n * Gets the list of all animation ranges defined on this skeleton\r\n * @returns an array\r\n */\r\n public getAnimationRanges(): Nullable<AnimationRange>[] {\r\n const animationRanges: Nullable<AnimationRange>[] = [];\r\n let name: string;\r\n for (name in this._ranges) {\r\n animationRanges.push(this._ranges[name]);\r\n }\r\n return animationRanges;\r\n }\r\n\r\n /**\r\n * Copy animation range from a source skeleton.\r\n * This is not for a complete retargeting, only between very similar skeleton's with only possible bone length differences\r\n * @param source defines the source skeleton\r\n * @param name defines the name of the range to copy\r\n * @param rescaleAsRequired defines if rescaling must be applied if required\r\n * @returns true if operation was successful\r\n */\r\n public copyAnimationRange(source: Skeleton, name: string, rescaleAsRequired = false): boolean {\r\n if (this._ranges[name] || !source.getAnimationRange(name)) {\r\n return false;\r\n }\r\n let ret = true;\r\n const frameOffset = this._getHighestAnimationFrame() + 1;\r\n\r\n // make a dictionary of source skeleton's bones, so exact same order or doubly nested loop is not required\r\n const boneDict: { [key: string]: Bone } = {};\r\n const sourceBones = source.bones;\r\n let nBones: number;\r\n let i: number;\r\n for (i = 0, nBones = sourceBones.length; i < nBones; i++) {\r\n boneDict[sourceBones[i].name] = sourceBones[i];\r\n }\r\n\r\n if (this.bones.length !== sourceBones.length) {\r\n Logger.Warn(`copyAnimationRange: this rig has ${this.bones.length} bones, while source as ${sourceBones.length}`);\r\n ret = false;\r\n }\r\n\r\n const skelDimensionsRatio = rescaleAsRequired && this.dimensionsAtRest && source.dimensionsAtRest ? this.dimensionsAtRest.divide(source.dimensionsAtRest) : null;\r\n\r\n for (i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n const boneName = this.bones[i].name;\r\n const sourceBone = boneDict[boneName];\r\n if (sourceBone) {\r\n ret = ret && this.bones[i].copyAnimationRange(sourceBone, name, frameOffset, rescaleAsRequired, skelDimensionsRatio);\r\n } else {\r\n Logger.Warn(\"copyAnimationRange: not same rig, missing source bone \" + boneName);\r\n ret = false;\r\n }\r\n }\r\n // do not call createAnimationRange(), since it also is done to bones, which was already done\r\n const range = source.getAnimationRange(name);\r\n if (range) {\r\n this._ranges[name] = new AnimationRange(name, range.from + frameOffset, range.to + frameOffset);\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Forces the skeleton to go to rest pose\r\n */\r\n public returnToRest(): void {\r\n for (const bone of this.bones) {\r\n if (bone._index !== -1) {\r\n bone.returnToRest();\r\n }\r\n }\r\n }\r\n\r\n private _getHighestAnimationFrame(): number {\r\n let ret = 0;\r\n for (let i = 0, nBones = this.bones.length; i < nBones; i++) {\r\n if (this.bones[i].animations[0]) {\r\n const highest = this.bones[i].animations[0].getHighestFrame();\r\n if (ret < highest) {\r\n ret = highest;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Begin a specific animation range\r\n * @param name defines the name of the range to start\r\n * @param loop defines if looping must be turned on (false by default)\r\n * @param speedRatio defines the speed ratio to apply (1 by default)\r\n * @param onAnimationEnd defines a callback which will be called when animation will end\r\n * @returns a new animatable\r\n */\r\n public beginAnimation(name: string, loop?: boolean, speedRatio?: number, onAnimationEnd?: () => void): Nullable<Animatable> {\r\n const range = this.getAnimationRange(name);\r\n\r\n if (!range) {\r\n return null;\r\n }\r\n\r\n return this._scene.beginAnimation(this, range.from, range.to, loop, speedRatio, onAnimationEnd);\r\n }\r\n\r\n /**\r\n * Convert the keyframes for a range of animation on a skeleton to be relative to a given reference frame.\r\n * @param skeleton defines the Skeleton containing the animation range to convert\r\n * @param referenceFrame defines the frame that keyframes in the range will be relative to\r\n * @param range defines the name of the AnimationRange belonging to the Skeleton to convert\r\n * @returns the original skeleton\r\n */\r\n public static MakeAnimationAdditive(skeleton: Skeleton, referenceFrame = 0, range: string): Nullable<Skeleton> {\r\n const rangeValue = skeleton.getAnimationRange(range);\r\n\r\n // We can't make a range additive if it doesn't exist\r\n if (!rangeValue) {\r\n return null;\r\n }\r\n\r\n // Find any current scene-level animatable belonging to the target that matches the range\r\n const sceneAnimatables = skeleton._scene.getAllAnimatablesByTarget(skeleton);\r\n let rangeAnimatable: Nullable<Animatable> = null;\r\n\r\n for (let index = 0; index < sceneAnimatables.length; index++) {\r\n const sceneAnimatable = sceneAnimatables[index];\r\n\r\n if (sceneAnimatable.fromFrame === rangeValue?.from && sceneAnimatable.toFrame === rangeValue?.to) {\r\n rangeAnimatable = sceneAnimatable;\r\n break;\r\n }\r\n }\r\n\r\n // Convert the animations belonging to the skeleton to additive keyframes\r\n const animatables = skeleton.getAnimatables();\r\n\r\n for (let index = 0; index < animatables.length; index++) {\r\n const animatable = animatables[index];\r\n const animations = animatable.animations;\r\n\r\n if (!animations) {\r\n continue;\r\n }\r\n\r\n for (let animIndex = 0; animIndex < animations.length; animIndex++) {\r\n Animation.MakeAnimationAdditive(animations[animIndex], referenceFrame, range);\r\n }\r\n }\r\n\r\n // Mark the scene-level animatable as additive\r\n if (rangeAnimatable) {\r\n rangeAnimatable.isAdditive = true;\r\n }\r\n\r\n return skeleton;\r\n }\r\n\r\n /** @hidden */\r\n public _markAsDirty(): void {\r\n this._isDirty = true;\r\n this._absoluteTransformIsDirty = true;\r\n }\r\n\r\n /**\r\n * @param mesh\r\n * @hidden\r\n */\r\n public _registerMeshWithPoseMatrix(mesh: AbstractMesh): void {\r\n this._meshesWithPoseMatrix.push(mesh);\r\n }\r\n\r\n /**\r\n * @param mesh\r\n * @hidden\r\n */\r\n public _unregisterMeshWithPoseMatrix(mesh: AbstractMesh): void {\r\n const index = this._meshesWithPoseMatrix.indexOf(mesh);\r\n\r\n if (index > -1) {\r\n this._meshesWithPoseMatrix.splice(index, 1);\r\n }\r\n }\r\n\r\n private _computeTransformMatrices(targetMatrix: Float32Array, initialSkinMatrix: Nullable<Matrix>): void {\r\n this.onBeforeComputeObservable.notifyObservers(this);\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const bone = this.bones[index];\r\n bone._childUpdateId++;\r\n const parentBone = bone.getParent();\r\n\r\n if (parentBone) {\r\n bone.getLocalMatrix().multiplyToRef(parentBone.getWorldMatrix(), bone.getWorldMatrix());\r\n } else {\r\n if (initialSkinMatrix) {\r\n bone.getLocalMatrix().multiplyToRef(initialSkinMatrix, bone.getWorldMatrix());\r\n } else {\r\n bone.getWorldMatrix().copyFrom(bone.getLocalMatrix());\r\n }\r\n }\r\n\r\n if (bone._index !== -1) {\r\n const mappedIndex = bone._index === null ? index : bone._index;\r\n bone.getInvertedAbsoluteTransform().multiplyToArray(bone.getWorldMatrix(), targetMatrix, mappedIndex * 16);\r\n }\r\n }\r\n\r\n this._identity.copyToArray(targetMatrix, this.bones.length * 16);\r\n }\r\n\r\n /**\r\n * Build all resources required to render a skeleton\r\n */\r\n public prepare(): void {\r\n // Update the local matrix of bones with linked transform nodes.\r\n if (this._numBonesWithLinkedTransformNode > 0) {\r\n for (const bone of this.bones) {\r\n if (bone._linkedTransformNode) {\r\n // Computing the world matrix also computes the local matrix.\r\n bone._linkedTransformNode.computeWorldMatrix();\r\n bone._matrix = bone._linkedTransformNode._localMatrix;\r\n }\r\n }\r\n }\r\n\r\n if (this.needInitialSkinMatrix) {\r\n for (const mesh of this._meshesWithPoseMatrix) {\r\n const poseMatrix = mesh.getPoseMatrix();\r\n\r\n let needsUpdate = this._isDirty;\r\n if (!mesh._bonesTransformMatrices || mesh._bonesTransformMatrices.length !== 16 * (this.bones.length + 1)) {\r\n mesh._bonesTransformMatrices = new Float32Array(16 * (this.bones.length + 1));\r\n needsUpdate = true;\r\n }\r\n\r\n if (!needsUpdate) {\r\n continue;\r\n }\r\n\r\n if (this._synchronizedWithMesh !== mesh) {\r\n this._synchronizedWithMesh = mesh;\r\n\r\n // Prepare bones\r\n for (const bone of this.bones) {\r\n if (!bone.getParent()) {\r\n const matrix = bone.getBaseMatrix();\r\n matrix.multiplyToRef(poseMatrix, TmpVectors.Matrix[1]);\r\n bone._updateDifferenceMatrix(TmpVectors.Matrix[1]);\r\n }\r\n }\r\n\r\n if (this.isUsingTextureForMatrices) {\r\n const textureWidth = (this.bones.length + 1) * 4;\r\n if (!mesh._transformMatrixTexture || mesh._transformMatrixTexture.getSize().width !== textureWidth) {\r\n if (mesh._transformMatrixTexture) {\r\n mesh._transformMatrixTexture.dispose();\r\n }\r\n\r\n mesh._transformMatrixTexture = RawTexture.CreateRGBATexture(\r\n mesh._bonesTransformMatrices,\r\n (this.bones.length + 1) * 4,\r\n 1,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n }\r\n\r\n this._computeTransformMatrices(mesh._bonesTransformMatrices, poseMatrix);\r\n\r\n if (this.isUsingTextureForMatrices && mesh._transformMatrixTexture) {\r\n mesh._transformMatrixTexture.update(mesh._bonesTransformMatrices);\r\n }\r\n }\r\n } else {\r\n if (!this._isDirty) {\r\n return;\r\n }\r\n\r\n if (!this._transformMatrices || this._transformMatrices.length !== 16 * (this.bones.length + 1)) {\r\n this._transformMatrices = new Float32Array(16 * (this.bones.length + 1));\r\n\r\n if (this.isUsingTextureForMatrices) {\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n }\r\n\r\n this._transformMatrixTexture = RawTexture.CreateRGBATexture(\r\n this._transformMatrices,\r\n (this.bones.length + 1) * 4,\r\n 1,\r\n this._scene,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n }\r\n }\r\n\r\n this._computeTransformMatrices(this._transformMatrices, null);\r\n\r\n if (this.isUsingTextureForMatrices && this._transformMatrixTexture) {\r\n this._transformMatrixTexture.update(this._transformMatrices);\r\n }\r\n }\r\n\r\n this._isDirty = false;\r\n }\r\n\r\n /**\r\n * Gets the list of animatables currently running for this skeleton\r\n * @returns an array of animatables\r\n */\r\n public getAnimatables(): IAnimatable[] {\r\n if (!this._animatables || this._animatables.length !== this.bones.length) {\r\n this._animatables = [];\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n this._animatables.push(this.bones[index]);\r\n }\r\n }\r\n\r\n return this._animatables;\r\n }\r\n\r\n /**\r\n * Clone the current skeleton\r\n * @param name defines the name of the new skeleton\r\n * @param id defines the id of the new skeleton\r\n * @returns the new skeleton\r\n */\r\n public clone(name: string, id?: string): Skeleton {\r\n const result = new Skeleton(name, id || name, this._scene);\r\n\r\n result.needInitialSkinMatrix = this.needInitialSkinMatrix;\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const source = this.bones[index];\r\n let parentBone = null;\r\n\r\n const parent = source.getParent();\r\n if (parent) {\r\n const parentIndex = this.bones.indexOf(parent);\r\n parentBone = result.bones[parentIndex];\r\n }\r\n\r\n const bone = new Bone(source.name, result, parentBone, source.getBaseMatrix().clone(), source.getRestPose().clone());\r\n bone._index = source._index;\r\n\r\n if (source._linkedTransformNode) {\r\n bone.linkTransformNode(source._linkedTransformNode);\r\n }\r\n\r\n DeepCopier.DeepCopy(source.animations, bone.animations);\r\n }\r\n\r\n if (this._ranges) {\r\n result._ranges = {};\r\n for (const rangeName in this._ranges) {\r\n const range = this._ranges[rangeName];\r\n\r\n if (range) {\r\n result._ranges[rangeName] = range.clone();\r\n }\r\n }\r\n }\r\n\r\n this._isDirty = true;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Enable animation blending for this skeleton\r\n * @param blendingSpeed defines the blending speed to apply\r\n * @see https://doc.babylonjs.com/babylon101/animations#animation-blending\r\n */\r\n public enableBlending(blendingSpeed = 0.01) {\r\n this.bones.forEach((bone) => {\r\n bone.animations.forEach((animation: Animation) => {\r\n animation.enableBlending = true;\r\n animation.blendingSpeed = blendingSpeed;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Releases all resources associated with the current skeleton\r\n */\r\n public dispose() {\r\n this._meshesWithPoseMatrix.length = 0;\r\n\r\n // Animations\r\n this.getScene().stopAnimation(this);\r\n\r\n // Remove from scene\r\n this.getScene().removeSkeleton(this);\r\n\r\n if (this._parentContainer) {\r\n const index = this._parentContainer.skeletons.indexOf(this);\r\n if (index > -1) {\r\n this._parentContainer.skeletons.splice(index, 1);\r\n }\r\n this._parentContainer = null;\r\n }\r\n\r\n if (this._transformMatrixTexture) {\r\n this._transformMatrixTexture.dispose();\r\n this._transformMatrixTexture = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serialize the skeleton in a JSON object\r\n * @returns a JSON object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n\r\n serializationObject.name = this.name;\r\n serializationObject.id = this.id;\r\n\r\n if (this.dimensionsAtRest) {\r\n serializationObject.dimensionsAtRest = this.dimensionsAtRest.asArray();\r\n }\r\n\r\n serializationObject.bones = [];\r\n\r\n serializationObject.needInitialSkinMatrix = this.needInitialSkinMatrix;\r\n\r\n for (let index = 0; index < this.bones.length; index++) {\r\n const bone = this.bones[index];\r\n const parent = bone.getParent();\r\n\r\n const serializedBone: any = {\r\n parentBoneIndex: parent ? this.bones.indexOf(parent) : -1,\r\n index: bone.getIndex(),\r\n name: bone.name,\r\n id: bone.id,\r\n matrix: bone.getBaseMatrix().toArray(),\r\n rest: bone.getRestPose().toArray(),\r\n linkedTransformNodeId: bone.getTransformNode()?.id,\r\n };\r\n\r\n serializationObject.bones.push(serializedBone);\r\n\r\n if (bone.length) {\r\n serializedBone.length = bone.length;\r\n }\r\n\r\n if (bone.metadata) {\r\n serializedBone.metadata = bone.metadata;\r\n }\r\n\r\n if (bone.animations && bone.animations.length > 0) {\r\n serializedBone.animation = bone.animations[0].serialize();\r\n }\r\n\r\n serializationObject.ranges = [];\r\n for (const name in this._ranges) {\r\n const source = this._ranges[name];\r\n\r\n if (!source) {\r\n continue;\r\n }\r\n\r\n const range: any = {};\r\n range.name = name;\r\n range.from = source.from;\r\n range.to = source.to;\r\n serializationObject.ranges.push(range);\r\n }\r\n }\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Creates a new skeleton from serialized data\r\n * @param parsedSkeleton defines the serialized data\r\n * @param scene defines the hosting scene\r\n * @returns a new skeleton\r\n */\r\n public static Parse(parsedSkeleton: any, scene: Scene): Skeleton {\r\n const skeleton = new Skeleton(parsedSkeleton.name, parsedSkeleton.id, scene);\r\n if (parsedSkeleton.dimensionsAtRest) {\r\n skeleton.dimensionsAtRest = Vector3.FromArray(parsedSkeleton.dimensionsAtRest);\r\n }\r\n\r\n skeleton.needInitialSkinMatrix = parsedSkeleton.needInitialSkinMatrix;\r\n\r\n let index: number;\r\n for (index = 0; index < parsedSkeleton.bones.length; index++) {\r\n const parsedBone = parsedSkeleton.bones[index];\r\n const parsedBoneIndex = parsedSkeleton.bones[index].index;\r\n let parentBone = null;\r\n if (parsedBone.parentBoneIndex > -1) {\r\n parentBone = skeleton.bones[parsedBone.parentBoneIndex];\r\n }\r\n\r\n const rest: Nullable<Matrix> = parsedBone.rest ? Matrix.FromArray(parsedBone.rest) : null;\r\n const bone = new Bone(parsedBone.name, skeleton, parentBone, Matrix.FromArray(parsedBone.matrix), rest, null, parsedBoneIndex);\r\n\r\n if (parsedBone.id !== undefined && parsedBone.id !== null) {\r\n bone.id = parsedBone.id;\r\n }\r\n\r\n if (parsedBone.length) {\r\n bone.length = parsedBone.length;\r\n }\r\n\r\n if (parsedBone.metadata) {\r\n bone.metadata = parsedBone.metadata;\r\n }\r\n\r\n if (parsedBone.animation) {\r\n bone.animations.push(Animation.Parse(parsedBone.animation));\r\n }\r\n\r\n if (parsedBone.linkedTransformNodeId !== undefined && parsedBone.linkedTransformNodeId !== null) {\r\n skeleton._hasWaitingData = true;\r\n bone._waitingTransformNodeId = parsedBone.linkedTransformNodeId;\r\n }\r\n }\r\n\r\n // placed after bones, so createAnimationRange can cascade down\r\n if (parsedSkeleton.ranges) {\r\n for (index = 0; index < parsedSkeleton.ranges.length; index++) {\r\n const data = parsedSkeleton.ranges[index];\r\n skeleton.createAnimationRange(data.name, data.from, data.to);\r\n }\r\n }\r\n return skeleton;\r\n }\r\n\r\n /**\r\n * Compute all node absolute transforms\r\n * @param forceUpdate defines if computation must be done even if cache is up to date\r\n */\r\n public computeAbsoluteTransforms(forceUpdate = false): void {\r\n if (this._absoluteTransformIsDirty || forceUpdate) {\r\n this.bones[0].computeAbsoluteTransforms();\r\n this._absoluteTransformIsDirty = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the root pose matrix\r\n * @returns a matrix\r\n */\r\n public getPoseMatrix(): Nullable<Matrix> {\r\n let poseMatrix: Nullable<Matrix> = null;\r\n\r\n if (this._meshesWithPoseMatrix.length > 0) {\r\n poseMatrix = this._meshesWithPoseMatrix[0].getPoseMatrix();\r\n }\r\n\r\n return poseMatrix;\r\n }\r\n\r\n /**\r\n * Sorts bones per internal index\r\n */\r\n public sortBones(): void {\r\n const bones = new Array<Bone>();\r\n const visited = new Array<boolean>(this.bones.length);\r\n for (let index = 0; index < this.bones.length; index++) {\r\n this._sortBones(index, bones, visited);\r\n }\r\n\r\n this.bones = bones;\r\n }\r\n\r\n private _sortBones(index: number, bones: Bone[], visited: boolean[]): void {\r\n if (visited[index]) {\r\n return;\r\n }\r\n\r\n visited[index] = true;\r\n\r\n const bone = this.bones[index];\r\n if (!bone) return;\r\n\r\n if (bone._index === undefined) {\r\n bone._index = index;\r\n }\r\n\r\n const parentBone = bone.getParent();\r\n if (parentBone) {\r\n this._sortBones(this.bones.indexOf(parentBone), bones, visited);\r\n }\r\n\r\n bones.push(bone);\r\n }\r\n\r\n /**\r\n * Set the current local matrix as the restPose for all bones in the skeleton.\r\n */\r\n public setCurrentPoseAsRest(): void {\r\n this.bones.forEach((b) => {\r\n b.setCurrentPoseAsRest();\r\n });\r\n }\r\n}\r\n"]}
@@ -66,7 +66,7 @@ var ArcRotateCameraKeyboardMoveInput = /** @class */ (function () {
66
66
  this._scene = this.camera.getScene();
67
67
  this._engine = this._scene.getEngine();
68
68
  this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add(function () {
69
- _this._keys = [];
69
+ _this._keys.length = 0;
70
70
  });
71
71
  this._onKeyboardObserver = this._scene.onKeyboardObservable.add(function (info) {
72
72
  var evt = info.event;
@@ -124,7 +124,7 @@ var ArcRotateCameraKeyboardMoveInput = /** @class */ (function () {
124
124
  this._onKeyboardObserver = null;
125
125
  this._onCanvasBlurObserver = null;
126
126
  }
127
- this._keys = [];
127
+ this._keys.length = 0;
128
128
  };
129
129
  /**
130
130
  * Update the current camera state depending on the inputs that have been used this frame.
@@ -1 +1 @@
1
- {"version":3,"file":"arcRotateCameraKeyboardMoveInput.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\nimport type { KeyboardInfo } from \"../../Events/keyboardEvents\";\r\nimport { KeyboardEventTypes } from \"../../Events/keyboardEvents\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Manage the keyboard inputs to control the movement of an arc rotate camera.\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\nexport class ArcRotateCameraKeyboardMoveInput implements ICameraInput<ArcRotateCamera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: ArcRotateCamera;\r\n\r\n /**\r\n * Defines the list of key codes associated with the up action (increase alpha)\r\n */\r\n @serialize()\r\n public keysUp = [38];\r\n\r\n /**\r\n * Defines the list of key codes associated with the down action (decrease alpha)\r\n */\r\n @serialize()\r\n public keysDown = [40];\r\n\r\n /**\r\n * Defines the list of key codes associated with the left action (increase beta)\r\n */\r\n @serialize()\r\n public keysLeft = [37];\r\n\r\n /**\r\n * Defines the list of key codes associated with the right action (decrease beta)\r\n */\r\n @serialize()\r\n public keysRight = [39];\r\n\r\n /**\r\n * Defines the list of key codes associated with the reset action.\r\n * Those keys reset the camera to its last stored state (with the method camera.storeState())\r\n */\r\n @serialize()\r\n public keysReset = [220];\r\n\r\n /**\r\n * Defines the panning sensibility of the inputs.\r\n * (How fast is the camera panning)\r\n */\r\n @serialize()\r\n public panningSensibility: number = 50.0;\r\n\r\n /**\r\n * Defines the zooming sensibility of the inputs.\r\n * (How fast is the camera zooming)\r\n */\r\n @serialize()\r\n public zoomingSensibility: number = 25.0;\r\n\r\n /**\r\n * Defines whether maintaining the alt key down switch the movement mode from\r\n * orientation to zoom.\r\n */\r\n @serialize()\r\n public useAltToZoom: boolean = true;\r\n\r\n /**\r\n * Rotation speed of the camera\r\n */\r\n @serialize()\r\n public angularSpeed = 0.01;\r\n\r\n private _keys = new Array<number>();\r\n private _ctrlPressed: boolean;\r\n private _altPressed: boolean;\r\n private _onCanvasBlurObserver: Nullable<Observer<Engine>>;\r\n private _onKeyboardObserver: Nullable<Observer<KeyboardInfo>>;\r\n private _engine: Engine;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n // was there a second variable defined?\r\n // eslint-disable-next-line prefer-rest-params\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n\r\n if (this._onCanvasBlurObserver) {\r\n return;\r\n }\r\n\r\n this._scene = this.camera.getScene();\r\n this._engine = this._scene.getEngine();\r\n\r\n this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add(() => {\r\n this._keys = [];\r\n });\r\n\r\n this._onKeyboardObserver = this._scene.onKeyboardObservable.add((info) => {\r\n const evt = info.event;\r\n if (!evt.metaKey) {\r\n if (info.type === KeyboardEventTypes.KEYDOWN) {\r\n this._ctrlPressed = evt.ctrlKey;\r\n this._altPressed = evt.altKey;\r\n\r\n if (\r\n this.keysUp.indexOf(evt.keyCode) !== -1 ||\r\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\r\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\r\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\r\n this.keysReset.indexOf(evt.keyCode) !== -1\r\n ) {\r\n const index = this._keys.indexOf(evt.keyCode);\r\n\r\n if (index === -1) {\r\n this._keys.push(evt.keyCode);\r\n }\r\n\r\n if (evt.preventDefault) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n }\r\n }\r\n } else {\r\n if (\r\n this.keysUp.indexOf(evt.keyCode) !== -1 ||\r\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\r\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\r\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\r\n this.keysReset.indexOf(evt.keyCode) !== -1\r\n ) {\r\n const index = this._keys.indexOf(evt.keyCode);\r\n\r\n if (index >= 0) {\r\n this._keys.splice(index, 1);\r\n }\r\n\r\n if (evt.preventDefault) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (this._scene) {\r\n if (this._onKeyboardObserver) {\r\n this._scene.onKeyboardObservable.remove(this._onKeyboardObserver);\r\n }\r\n if (this._onCanvasBlurObserver) {\r\n this._engine.onCanvasBlurObservable.remove(this._onCanvasBlurObserver);\r\n }\r\n this._onKeyboardObserver = null;\r\n this._onCanvasBlurObserver = null;\r\n }\r\n\r\n this._keys = [];\r\n }\r\n\r\n /**\r\n * Update the current camera state depending on the inputs that have been used this frame.\r\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\r\n */\r\n public checkInputs(): void {\r\n if (this._onKeyboardObserver) {\r\n const camera = this.camera;\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const keyCode = this._keys[index];\r\n if (this.keysLeft.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningX -= 1 / this.panningSensibility;\r\n } else {\r\n camera.inertialAlphaOffset -= this.angularSpeed;\r\n }\r\n } else if (this.keysUp.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningY += 1 / this.panningSensibility;\r\n } else if (this._altPressed && this.useAltToZoom) {\r\n camera.inertialRadiusOffset += 1 / this.zoomingSensibility;\r\n } else {\r\n camera.inertialBetaOffset -= this.angularSpeed;\r\n }\r\n } else if (this.keysRight.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningX += 1 / this.panningSensibility;\r\n } else {\r\n camera.inertialAlphaOffset += this.angularSpeed;\r\n }\r\n } else if (this.keysDown.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningY -= 1 / this.panningSensibility;\r\n } else if (this._altPressed && this.useAltToZoom) {\r\n camera.inertialRadiusOffset -= 1 / this.zoomingSensibility;\r\n } else {\r\n camera.inertialBetaOffset += this.angularSpeed;\r\n }\r\n } else if (this.keysReset.indexOf(keyCode) !== -1) {\r\n if (camera.useInputToRestoreState) {\r\n camera.restoreState();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCameraKeyboardMoveInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"keyboard\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"ArcRotateCameraKeyboardMoveInput\"] = ArcRotateCameraKeyboardMoveInput;\r\n"]}
1
+ {"version":3,"file":"arcRotateCameraKeyboardMoveInput.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { ArcRotateCamera } from \"../../Cameras/arcRotateCamera\";\r\nimport type { ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { CameraInputTypes } from \"../../Cameras/cameraInputsManager\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\nimport type { KeyboardInfo } from \"../../Events/keyboardEvents\";\r\nimport { KeyboardEventTypes } from \"../../Events/keyboardEvents\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Manage the keyboard inputs to control the movement of an arc rotate camera.\r\n * @see https://doc.babylonjs.com/how_to/customizing_camera_inputs\r\n */\r\nexport class ArcRotateCameraKeyboardMoveInput implements ICameraInput<ArcRotateCamera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public camera: ArcRotateCamera;\r\n\r\n /**\r\n * Defines the list of key codes associated with the up action (increase alpha)\r\n */\r\n @serialize()\r\n public keysUp = [38];\r\n\r\n /**\r\n * Defines the list of key codes associated with the down action (decrease alpha)\r\n */\r\n @serialize()\r\n public keysDown = [40];\r\n\r\n /**\r\n * Defines the list of key codes associated with the left action (increase beta)\r\n */\r\n @serialize()\r\n public keysLeft = [37];\r\n\r\n /**\r\n * Defines the list of key codes associated with the right action (decrease beta)\r\n */\r\n @serialize()\r\n public keysRight = [39];\r\n\r\n /**\r\n * Defines the list of key codes associated with the reset action.\r\n * Those keys reset the camera to its last stored state (with the method camera.storeState())\r\n */\r\n @serialize()\r\n public keysReset = [220];\r\n\r\n /**\r\n * Defines the panning sensibility of the inputs.\r\n * (How fast is the camera panning)\r\n */\r\n @serialize()\r\n public panningSensibility: number = 50.0;\r\n\r\n /**\r\n * Defines the zooming sensibility of the inputs.\r\n * (How fast is the camera zooming)\r\n */\r\n @serialize()\r\n public zoomingSensibility: number = 25.0;\r\n\r\n /**\r\n * Defines whether maintaining the alt key down switch the movement mode from\r\n * orientation to zoom.\r\n */\r\n @serialize()\r\n public useAltToZoom: boolean = true;\r\n\r\n /**\r\n * Rotation speed of the camera\r\n */\r\n @serialize()\r\n public angularSpeed = 0.01;\r\n\r\n private _keys = new Array<number>();\r\n private _ctrlPressed: boolean;\r\n private _altPressed: boolean;\r\n private _onCanvasBlurObserver: Nullable<Observer<Engine>>;\r\n private _onKeyboardObserver: Nullable<Observer<KeyboardInfo>>;\r\n private _engine: Engine;\r\n private _scene: Scene;\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n // was there a second variable defined?\r\n // eslint-disable-next-line prefer-rest-params\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n\r\n if (this._onCanvasBlurObserver) {\r\n return;\r\n }\r\n\r\n this._scene = this.camera.getScene();\r\n this._engine = this._scene.getEngine();\r\n\r\n this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add(() => {\r\n this._keys.length = 0;\r\n });\r\n\r\n this._onKeyboardObserver = this._scene.onKeyboardObservable.add((info) => {\r\n const evt = info.event;\r\n if (!evt.metaKey) {\r\n if (info.type === KeyboardEventTypes.KEYDOWN) {\r\n this._ctrlPressed = evt.ctrlKey;\r\n this._altPressed = evt.altKey;\r\n\r\n if (\r\n this.keysUp.indexOf(evt.keyCode) !== -1 ||\r\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\r\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\r\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\r\n this.keysReset.indexOf(evt.keyCode) !== -1\r\n ) {\r\n const index = this._keys.indexOf(evt.keyCode);\r\n\r\n if (index === -1) {\r\n this._keys.push(evt.keyCode);\r\n }\r\n\r\n if (evt.preventDefault) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n }\r\n }\r\n } else {\r\n if (\r\n this.keysUp.indexOf(evt.keyCode) !== -1 ||\r\n this.keysDown.indexOf(evt.keyCode) !== -1 ||\r\n this.keysLeft.indexOf(evt.keyCode) !== -1 ||\r\n this.keysRight.indexOf(evt.keyCode) !== -1 ||\r\n this.keysReset.indexOf(evt.keyCode) !== -1\r\n ) {\r\n const index = this._keys.indexOf(evt.keyCode);\r\n\r\n if (index >= 0) {\r\n this._keys.splice(index, 1);\r\n }\r\n\r\n if (evt.preventDefault) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (this._scene) {\r\n if (this._onKeyboardObserver) {\r\n this._scene.onKeyboardObservable.remove(this._onKeyboardObserver);\r\n }\r\n if (this._onCanvasBlurObserver) {\r\n this._engine.onCanvasBlurObservable.remove(this._onCanvasBlurObserver);\r\n }\r\n this._onKeyboardObserver = null;\r\n this._onCanvasBlurObserver = null;\r\n }\r\n\r\n this._keys.length = 0;\r\n }\r\n\r\n /**\r\n * Update the current camera state depending on the inputs that have been used this frame.\r\n * This is a dynamically created lambda to avoid the performance penalty of looping for inputs in the render loop.\r\n */\r\n public checkInputs(): void {\r\n if (this._onKeyboardObserver) {\r\n const camera = this.camera;\r\n\r\n for (let index = 0; index < this._keys.length; index++) {\r\n const keyCode = this._keys[index];\r\n if (this.keysLeft.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningX -= 1 / this.panningSensibility;\r\n } else {\r\n camera.inertialAlphaOffset -= this.angularSpeed;\r\n }\r\n } else if (this.keysUp.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningY += 1 / this.panningSensibility;\r\n } else if (this._altPressed && this.useAltToZoom) {\r\n camera.inertialRadiusOffset += 1 / this.zoomingSensibility;\r\n } else {\r\n camera.inertialBetaOffset -= this.angularSpeed;\r\n }\r\n } else if (this.keysRight.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningX += 1 / this.panningSensibility;\r\n } else {\r\n camera.inertialAlphaOffset += this.angularSpeed;\r\n }\r\n } else if (this.keysDown.indexOf(keyCode) !== -1) {\r\n if (this._ctrlPressed && this.camera._useCtrlForPanning) {\r\n camera.inertialPanningY -= 1 / this.panningSensibility;\r\n } else if (this._altPressed && this.useAltToZoom) {\r\n camera.inertialRadiusOffset -= 1 / this.zoomingSensibility;\r\n } else {\r\n camera.inertialBetaOffset += this.angularSpeed;\r\n }\r\n } else if (this.keysReset.indexOf(keyCode) !== -1) {\r\n if (camera.useInputToRestoreState) {\r\n camera.restoreState();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"ArcRotateCameraKeyboardMoveInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"keyboard\";\r\n }\r\n}\r\n\r\n(<any>CameraInputTypes)[\"ArcRotateCameraKeyboardMoveInput\"] = ArcRotateCameraKeyboardMoveInput;\r\n"]}
@@ -50,7 +50,7 @@ var FlyCameraKeyboardInput = /** @class */ (function () {
50
50
  this._scene = this.camera.getScene();
51
51
  this._engine = this._scene.getEngine();
52
52
  this._onCanvasBlurObserver = this._engine.onCanvasBlurObservable.add(function () {
53
- _this._keys = [];
53
+ _this._keys.length = 0;
54
54
  });
55
55
  this._onKeyboardObserver = this._scene.onKeyboardObservable.add(function (info) {
56
56
  var evt = info.event;
@@ -102,7 +102,7 @@ var FlyCameraKeyboardInput = /** @class */ (function () {
102
102
  this._onKeyboardObserver = null;
103
103
  this._onCanvasBlurObserver = null;
104
104
  }
105
- this._keys = [];
105
+ this._keys.length = 0;
106
106
  };
107
107
  /**
108
108
  * Gets the class name of the current input.
@@ -115,7 +115,7 @@ var FlyCameraKeyboardInput = /** @class */ (function () {
115
115
  * @hidden
116
116
  */
117
117
  FlyCameraKeyboardInput.prototype._onLostFocus = function () {
118
- this._keys = [];
118
+ this._keys.length = 0;
119
119
  };
120
120
  /**
121
121
  * Get the friendly name associated with the input class.