AFRAME.registerComponent("animation-mixer", {
  init() {
    this.mixer = null;

    const object3DMap = this.el.object3DMap;
    const rootObject3D = object3DMap.mesh || object3DMap.scene;

    if (rootObject3D) {
      this.setAnimationMixer(rootObject3D);
    } else {
      this.onModelLoaded = this.onModelLoaded.bind(this);
      this.el.addEventListener("model-loaded", this.onModelLoaded);
    }
  },

  onModelLoaded(event) {
    const sceneObject3D = event.detail.model;
    this.setAnimationMixer(sceneObject3D);

    this.el.removeEventListener(this.onModelLoaded);
  },

  setAnimationMixer(rootObject3D) {
    this.mixer = new THREE.AnimationMixer(rootObject3D);
  },

  tick: function(t, dt) {
    if (this.mixer) {
      this.mixer.update(dt / 1000);
    }
  },

  destroy() {
    this.el.removeEventListener(this.onModelLoaded);
  }
});