123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- const avatarLoader = new XAvatarLoader
- , log$J = new Logger$1("AnimationController");
- class XAnimationController {
- constructor(e) {
- E(this, "iBodyAnim");
- E(this, "animations", []);
- E(this, "defaultAnimation", "Idle");
- E(this, "onPlay", "Idle");
- E(this, "loop", !0);
- E(this, "animationExtras", []);
- E(this, "enableBlend", !1);
- E(this, "enableSkLod", !1);
- E(this, "_boneMap", new Map);
- E(this, "_lodMask", new Map);
- E(this, "activeFaceAnimation");
- E(this, "iFaceAnim");
- E(this, "_scene");
- E(this, "_avatar");
- E(this, "onPlayObservable", new Observable);
- E(this, "postObserver");
- E(this, "playAnimation", (e,t,r=0,n,o,a)=>new Promise((s,l)=>{
- if (this._isPlaying(e, r) || (this._registerAnimInfo(e, t, r, n, o, a),
- !this._isAnimate()))
- return s(null);
- this._prerocess(e, t),
- this._avatar.avatarManager.loadAnimation(this._avatar.avatarType, e).then(u=>{
- if (!u)
- return l(new AvatarAnimationError("animation group does not exist"));
- const c = this._mappingSkeleton(u);
- if (!c)
- return l(new AvatarAnimationError("mapping animation failed"));
- if (c && this._isAnimationValid(c))
- return c.dispose(),
- l(new AvatarAnimationError("mapping animation failed"));
- if (this.enableSkLod && this.skeletonMask(c, r),
- this.detachAnimation(r),
- r == 0 ? this.iBodyAnim.animGroup = c : r == 1 && (this.iFaceAnim.animGroup = c),
- !this._playAnimation(r))
- return l(new AvatarAnimationError("[Engine] play animation failed, animtion resource does not match current character"));
- this._playEffect(),
- this.postObserver = c.onAnimationEndObservable.addOnce(()=>(this._postprocess(r),
- s(null)))
- }
- )
- }
- ));
- E(this, "stopAnimation", (e=0)=>{
- var t, r, n, o;
- switch (e) {
- case 0:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((t = this.iBodyAnim) == null || t.animGroup.stop());
- break;
- case 1:
- this.iFaceAnim && this.iFaceAnim.animGroup && ((r = this.iFaceAnim) == null || r.animGroup.stop());
- break;
- case 2:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((n = this.iBodyAnim) == null || n.animGroup.stop()),
- this.iFaceAnim && this.iFaceAnim.animGroup && ((o = this.iFaceAnim) == null || o.animGroup.stop());
- break
- }
- }
- );
- E(this, "pauseAnimation", (e=0)=>{
- var t, r, n, o;
- switch (e) {
- case 0:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((t = this.iBodyAnim) == null || t.animGroup.pause());
- break;
- case 1:
- this.iFaceAnim && this.iFaceAnim.animGroup && ((r = this.iFaceAnim) == null || r.animGroup.pause());
- break;
- case 2:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((n = this.iBodyAnim) == null || n.animGroup.pause()),
- this.iFaceAnim && this.iFaceAnim.animGroup && ((o = this.iFaceAnim) == null || o.animGroup.pause());
- break
- }
- }
- );
- E(this, "resetAnimation", (e=0)=>{
- var t, r, n, o;
- switch (e) {
- case 0:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((t = this.iBodyAnim) == null || t.animGroup.reset());
- break;
- case 1:
- this.iFaceAnim && this.iFaceAnim.animGroup && ((r = this.iFaceAnim) == null || r.animGroup.reset());
- break;
- case 2:
- this.iBodyAnim && this.iBodyAnim.animGroup && ((n = this.iBodyAnim) == null || n.animGroup.reset()),
- this.iFaceAnim && this.iFaceAnim.animGroup && ((o = this.iFaceAnim) == null || o.animGroup.reset());
- break
- }
- }
- );
- this._avatar = e,
- this._scene = e.avatarManager.scene,
- this.animationExtras.push(action.Cheering.animName),
- this._boneMap = new Map
- }
- _isPlaying(e, t) {
- return t == 0 && this.iBodyAnim != null && this.iBodyAnim.animGroup && e == this.iBodyAnim.name ? !0 : !!(t == 1 && this.iFaceAnim != null && this.iFaceAnim.animGroup && e == this.iFaceAnim.name)
- }
- activeAnimation(e=0) {
- var t, r;
- switch (e) {
- case 0:
- return (t = this.iBodyAnim) == null ? void 0 : t.animGroup;
- case 1:
- return (r = this.iFaceAnim) == null ? void 0 : r.animGroup;
- default:
- return
- }
- }
- enableAnimationBlend(e=.1, t=0) {
- var r, n, o, a;
- if (t == 0 && ((r = this.iBodyAnim) == null ? void 0 : r.animGroup))
- for (const s of (n = this.iBodyAnim) == null ? void 0 : n.animGroup.targetedAnimations)
- s.animation.enableBlending = !0,
- s.animation.blendingSpeed = e;
- else if (t == 0 && ((o = this.iFaceAnim) == null ? void 0 : o.animGroup))
- for (const s of (a = this.iFaceAnim) == null ? void 0 : a.animGroup.targetedAnimations)
- s.animation.enableBlending = !0,
- s.animation.blendingSpeed = e
- }
- disableAnimationBlend(e=0) {
- var t, r, n, o;
- if (e == 0 && ((t = this.iBodyAnim) == null ? void 0 : t.animGroup))
- for (const a of (r = this.iBodyAnim) == null ? void 0 : r.animGroup.targetedAnimations)
- a.animation.enableBlending = !1;
- else if (e == 0 && ((n = this.iFaceAnim) == null ? void 0 : n.animGroup))
- for (const a of (o = this.iFaceAnim) == null ? void 0 : o.animGroup.targetedAnimations)
- a.animation.enableBlending = !1
- }
- skeletonMask(e, t=0) {
- if (t == 0) {
- const r = this._lodMask.get(this._avatar.distLevel);
- if (r)
- for (let n = 0; n < e.targetedAnimations.length; ++n)
- r.includes(e.targetedAnimations[n].target.name) || (e.targetedAnimations.splice(n, 1),
- n--);
- return !0
- }
- return !1
- }
- detachAnimation(e=2) {
- var t, r;
- switch (e) {
- case 0:
- this.iBodyAnim && this.iBodyAnim.animGroup && (this.iBodyAnim.animGroup._parentContainer.xReferenceCount && this.iBodyAnim.animGroup._parentContainer.xReferenceCount--,
- this.iBodyAnim.animGroup.stop(),
- this.iBodyAnim.animGroup.dispose(),
- this.iBodyAnim.animGroup = void 0);
- break;
- case 1:
- this.iFaceAnim && this.iFaceAnim.animGroup && (this.iFaceAnim.animGroup._parentContainer.xReferenceCount && this.iFaceAnim.animGroup._parentContainer.xReferenceCount--,
- this.iFaceAnim.animGroup.stop(),
- this.iFaceAnim.animGroup.dispose(),
- this.iFaceAnim.animGroup = void 0);
- break;
- case 2:
- this.iBodyAnim && this.iBodyAnim.animGroup && (this.iBodyAnim.animGroup._parentContainer.xReferenceCount && this.iBodyAnim.animGroup._parentContainer.xReferenceCount--,
- (t = this.iBodyAnim) == null || t.animGroup.stop(),
- (r = this.iBodyAnim) == null || r.animGroup.dispose(),
- this.iBodyAnim.animGroup = void 0),
- this.iFaceAnim && this.iFaceAnim.animGroup && (this.iFaceAnim.animGroup._parentContainer.xReferenceCount && this.iFaceAnim.animGroup._parentContainer.xReferenceCount--,
- this.iFaceAnim.animGroup.stop(),
- this.iFaceAnim.animGroup.dispose(),
- this.iFaceAnim.animGroup = void 0);
- break
- }
- }
- blendAnimation() {}
- getAnimation(e, t) {
- return avatarLoader.animations.get(getAnimationKey(t, e))
- }
- _mappingSkeleton(e) {
- if (e) {
- const t = e.clone(e.name, r=>{
- var o, a, s;
- const n = r.name.split(" ").length > 2 ? r.name.split(" ")[2] : r.name;
- if (this._boneMap.size === ((o = this._avatar.skeleton) == null ? void 0 : o.bones.length))
- return this._boneMap.get(n);
- {
- const l = (s = (a = this._avatar.skeleton) == null ? void 0 : a.bones.find(u=>u.name === r.name || u.name === r.name.split(" ")[2])) == null ? void 0 : s.getTransformNode();
- return l && (l.name = n,
- this._boneMap.set(n, l)),
- l
- }
- }
- );
- return t._parentContainer = e._parentContainer,
- t
- } else
- return
- }
- removeAnimation(e) {
- const t = avatarLoader.containers.get(e.name);
- t && (t.dispose(),
- avatarLoader.containers.delete(e.name),
- avatarLoader.animations.delete(getAnimationKey(e.name, e.skType)))
- }
- _setPosition(e, t) {
- this._avatar.priority === 0 && this._avatar.isRender && e === this.defaultAnimation && e != this.onPlay && !this._avatar.isSelected && this._avatar.setPosition(this._avatar.position, !0)
- }
- _registerAnimInfo(e, t, r=0, n, o, a) {
- const s = {
- name: e,
- skType: this._avatar.avatarType,
- loop: t,
- playSpeed: n,
- currentFrame: 0,
- startFrame: o,
- endFrame: a
- };
- r == 0 ? this.iBodyAnim == null ? this.iBodyAnim = s : (this.iBodyAnim.name = e,
- this.iBodyAnim.skType = this._avatar.avatarType,
- this.iBodyAnim.loop = t,
- this.iBodyAnim.playSpeed = n,
- this.iBodyAnim.currentFrame = 0,
- this.iBodyAnim.startFrame = o,
- this.iBodyAnim.endFrame = a) : r == 1 && (this.iFaceAnim == null ? this.iFaceAnim = s : (this.iFaceAnim.name = e,
- this.iFaceAnim.skType = this._avatar.avatarType,
- this.iFaceAnim.loop = t,
- this.iFaceAnim.playSpeed = n,
- this.iFaceAnim.currentFrame = 0,
- this.iFaceAnim.startFrame = o,
- this.iFaceAnim.endFrame = a)),
- this.onPlay = e,
- this.loop = t
- }
- _isAnimate() {
- var e;
- return !(!this._avatar.isRender || !this._avatar.skeleton || ((e = this._avatar.rootNode) == null ? void 0 : e.getChildMeshes().length) == 0)
- }
- _prerocess(e, t) {
- this._avatar.isRayCastEnable && this._setPosition(e, t),
- this._avatar.priority === 0 && log$J.info(`start play animation: ${e} on avatar ${this._avatar.id}`)
- }
- _playEffect() {
- this.animationExtras.indexOf(this.iBodyAnim.name) != -1 && action.Cheering.attachPair.forEach(t=>{
- this._avatar.attachExtraProp(t.obj, t.bone, new Vector3(t.offset.x,t.offset.y,t.offset.z), new Vector3(t.rotate.x,t.rotate.y,t.rotate.z)),
- this._avatar.showExtra(t.obj)
- }
- )
- }
- _playAnimation(e=0) {
- var t, r;
- return e == 0 && this.iBodyAnim && ((t = this.iBodyAnim) == null ? void 0 : t.animGroup) ? (this.onPlayObservable.notifyObservers(this._scene),
- this.iBodyAnim.animGroup.start(this.loop, this.iBodyAnim.playSpeed, this.iBodyAnim.startFrame, this.iBodyAnim.endFrame, !1),
- !0) : e == 1 && this.iFaceAnim && ((r = this.iFaceAnim) == null ? void 0 : r.animGroup) ? (this.iFaceAnim.animGroup.start(this.loop, this.iFaceAnim.playSpeed, this.iFaceAnim.startFrame, this.iFaceAnim.endFrame, !1),
- !0) : !1
- }
- _postprocess(e) {
- var r, n;
- let t;
- e == 0 ? t = (r = this.iBodyAnim) == null ? void 0 : r.name : e == 1 && (t = (n = this.iFaceAnim) == null ? void 0 : n.name),
- t === action.Cheering.animName && this._avatar.disposeExtra()
- }
- _isAnimationValid(e) {
- for (let t = 0; t < e.targetedAnimations.length; ++t)
- if (e.targetedAnimations[t].target)
- return !1;
- return !0
- }
- }
|