Skip to content

Commit

Permalink
open current play AnimatorState in AnimatorPlayState.ts
Browse files Browse the repository at this point in the history
  • Loading branch information
GuoLei1990 committed Oct 8, 2019
1 parent 72e8bf3 commit 8061ace
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 63 deletions.
36 changes: 19 additions & 17 deletions src/layaAir/laya/d3/component/Animator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -883,7 +883,7 @@ export class Animator extends Component {
addtive = controllerLayer.blendingMode !== AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
switch (controllerLayer._playType) {
case 0:
var animatorState: AnimatorState = controllerLayer._currentPlayState;
var animatorState: AnimatorState = playStateInfo._currentState;
var clip: AnimationClip = animatorState._clip;
var speed: number = this._speed * animatorState.speed;
var finish: boolean = playStateInfo._finish;//提前取出finish,防止最后一帧跳过
Expand All @@ -896,7 +896,7 @@ export class Animator extends Component {
}
break;
case 1:
animatorState = controllerLayer._currentPlayState;
animatorState = playStateInfo._currentState;
clip = animatorState._clip;
var crossClipState: AnimatorState = controllerLayer._crossPlayState;
var crossClip: AnimationClip = crossClipState._clip;
Expand All @@ -913,7 +913,7 @@ export class Animator extends Component {
this._setClipDatasToNode(crossClipState, addtive, controllerLayer.defaultWeight, i === 0);

controllerLayer._playType = 0;//完成融合,切换到正常播放状态
controllerLayer._currentPlayState = crossClipState;
playStateInfo._currentState = crossClipState;
crossPlayStateInfo._cloneTo(playStateInfo);
}
} else {
Expand Down Expand Up @@ -949,7 +949,7 @@ export class Animator extends Component {
this._updateClipDatas(crossClipState, addtive, crossPlayStateInfo, timerScale * crossSpeed);
this._setClipDatasToNode(crossClipState, addtive, 1.0, i === 0);
controllerLayer._playType = 0;//完成融合,切换到正常播放状态
controllerLayer._currentPlayState = crossClipState;
playStateInfo._currentState = crossClipState;
crossPlayStateInfo._cloneTo(playStateInfo);
} else {
this._updateClipDatas(crossClipState, addtive, crossPlayStateInfo, timerScale * crossScale * crossSpeed);
Expand Down Expand Up @@ -1044,15 +1044,6 @@ export class Animator extends Component {
return this._controllerLayers[layerInex];
}

/**
* 获取当前的播放状态。
* @param layerIndex 层索引。
* @return 动画播放状态。
*/
getCurrentAnimatorPlayState(layerInex: number = 0): AnimatorPlayState {
return this._controllerLayers[layerInex]._playStateInfo;
}

/**
* 播放动画。
* @param name 如果为null则播放默认动画,否则按名字播放动画片段。
Expand All @@ -1064,9 +1055,10 @@ export class Animator extends Component {
if (controllerLayer) {
var defaultState: AnimatorState = controllerLayer.defaultState;
if (!name && !defaultState)
throw new Error("Animator:must have default clip value,please set clip property.");
var curPlayState: AnimatorState = controllerLayer._currentPlayState;
throw new Error("Animator:must have default clip value,please set clip property.");
var playStateInfo: AnimatorPlayState = controllerLayer._playStateInfo;
var curPlayState: AnimatorState = playStateInfo._currentState;


var animatorState: AnimatorState = name ? controllerLayer._statesMap[name] : defaultState;
var clipDuration: number = animatorState._clip._duration;
Expand All @@ -1077,7 +1069,7 @@ export class Animator extends Component {
playStateInfo._resetPlayState(0.0);
(curPlayState !== null && curPlayState !== animatorState) && (this._revertDefaultKeyframeNodes(curPlayState));
controllerLayer._playType = 0;
controllerLayer._currentPlayState = animatorState;
playStateInfo._currentState = animatorState;
} else {
if (normalizedTime !== Number.NEGATIVE_INFINITY) {
playStateInfo._resetPlayState(clipDuration * normalizedTime);
Expand Down Expand Up @@ -1118,7 +1110,7 @@ export class Animator extends Component {
var crossNodeOwners: KeyframeNodeOwner[] = controllerLayer._crossNodesOwners;
var crossNodeOwnerIndicesMap: any = controllerLayer._crossNodesOwnersIndicesMap;

var srcAnimatorState: AnimatorState = controllerLayer._currentPlayState;
var srcAnimatorState: AnimatorState = controllerLayer._playStateInfo._currentState;
var destNodeOwners: KeyframeNodeOwner[] = destAnimatorState._nodeOwners;
var destCrossClipNodeIndices: number[] = controllerLayer._destCrossClipNodeIndices;
var destClip: AnimationClip = destAnimatorState._clip;
Expand Down Expand Up @@ -1372,6 +1364,16 @@ export class Animator extends Component {
}
}

/**
* @deprecated
* 获取当前的播放状态。
* @param layerIndex 层索引。
* @return 动画播放状态。
*/
getCurrentAnimatorPlayState(layerInex: number = 0): AnimatorPlayState {
return this._controllerLayers[layerInex]._playStateInfo;
}

/**
*@internal
* [NATIVE]
Expand Down
76 changes: 34 additions & 42 deletions src/layaAir/laya/d3/component/AnimatorControllerLayer.ts
Original file line number Diff line number Diff line change
@@ -1,78 +1,73 @@
import { AnimatorState } from "./AnimatorState";
import { KeyframeNodeOwner } from "./KeyframeNodeOwner";
import { AnimatorPlayState } from "./AnimatorPlayState";
import { AnimationClip } from "../animation/AnimationClip";
import { KeyframeNodeList } from "../animation/KeyframeNodeList";
import { IClone } from "../core/IClone";
import { IReferenceCounter } from "../resource/IReferenceCounter";
import { Animator } from "./Animator";
import { AnimatorPlayState } from "./AnimatorPlayState";
import { AnimatorState } from "./AnimatorState";
import { KeyframeNodeOwner } from "./KeyframeNodeOwner";


/**
* <code>AnimatorControllerLayer</code> 类用于创建动画控制器层。
*/
export class AnimatorControllerLayer implements IReferenceCounter, IClone {
/**@internal */
/**混合模式_覆盖。 */
static BLENDINGMODE_OVERRIDE: number = 0;
/**@internal */
/**混合模式_叠加。 */
static BLENDINGMODE_ADDTIVE: number = 1;

/**@internal */
private _defaultState: AnimatorState = null;
/**@internal */
private _referenceCount: number = 0;

/**@internal 0:常规播放、1:动态融合播放、2:固定融合播放*/
_playType: number;
_playType: number = -1;
/**@internal */
_crossDuration: number;
_crossDuration: number = -1;
/**@internal */
_crossPlayState: AnimatorState;
/**@internal */
_crossMark: number;
_crossMark: number = 0;
/**@internal */
_crossNodesOwnersCount: number;
_crossNodesOwnersCount: number = 0;
/**@internal */
_crossNodesOwners: KeyframeNodeOwner[];
_crossNodesOwners: KeyframeNodeOwner[] = [];
/**@internal */
_crossNodesOwnersIndicesMap: any;
_crossNodesOwnersIndicesMap: any = {};
/**@internal */
_srcCrossClipNodeIndices: number[];
_srcCrossClipNodeIndices: number[] = [];
/**@internal */
_destCrossClipNodeIndices: number[];
_destCrossClipNodeIndices: number[] = [];

/**@internal */
_animator: Animator;
/**@internal */
_currentPlayState: AnimatorState;
/**@internal */
_statesMap: any = {};
/**@internal */
_states: AnimatorState[];
_states: AnimatorState[] = [];
/**@internal */
_playStateInfo: AnimatorPlayState;
_playStateInfo: AnimatorPlayState = new AnimatorPlayState();
/**@internal */
_crossPlayStateInfo: AnimatorPlayState;
_crossPlayStateInfo: AnimatorPlayState = new AnimatorPlayState();

/** 层的名称。*/
name: string;
/** 名称。*/
blendingMode: number;
blendingMode: number = AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
/** 权重。*/
defaultWeight: number;
/** 激活时是否自动播放*/
defaultWeight: number = 1.0;
/** 激活时是否自动播放*/
playOnWake: boolean = true;

/**
* 获取默认动画状态。
* @return 默认动画状态。
* 默认动画状态机。
*/
get defaultState(): AnimatorState {
return this._defaultState;
}

/**
* 设置默认动画状态。
* @param value 默认动画状态。
*/
set defaultState(value: AnimatorState) {
this._defaultState = value;
this._statesMap[value.name] = value;
Expand All @@ -82,24 +77,12 @@ export class AnimatorControllerLayer implements IReferenceCounter, IClone {
* 创建一个 <code>AnimatorControllerLayer</code> 实例。
*/
constructor(name: string) {
this._playType = -1;
this._crossMark = 0;
this._crossDuration = -1;
this._crossNodesOwnersIndicesMap = {};
this._crossNodesOwnersCount = 0;
this._crossNodesOwners = [];
this._currentPlayState = null;
this._states = [];
this._playStateInfo = new AnimatorPlayState();
this._crossPlayStateInfo = new AnimatorPlayState();
this._srcCrossClipNodeIndices = [];
this._destCrossClipNodeIndices = [];

this.name = name;
this.defaultWeight = 1.0;
this.blendingMode = AnimatorControllerLayer.BLENDINGMODE_OVERRIDE;
}

/**
* @internal
*/
private _removeClip(clipStateInfos: AnimatorState[], statesMap: any, index: number, state: AnimatorState): void {
var clip: AnimationClip = state._clip;
var clipStateInfo: AnimatorState = clipStateInfos[index];
Expand Down Expand Up @@ -148,8 +131,17 @@ export class AnimatorControllerLayer implements IReferenceCounter, IClone {
this._removeReference(-this._referenceCount);
}

/**
* 获取当前的播放状态。
* @return 动画播放状态。
*/
getCurrentPlayState(): AnimatorPlayState {
return this._playStateInfo;
}

/**
* 获取动画状态。
* @return 动画状态。
*/
getAnimatorState(name: string): AnimatorState {
var state: AnimatorState = this._statesMap[name];
Expand Down
11 changes: 11 additions & 0 deletions src/layaAir/laya/d3/component/AnimatorPlayState.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { AnimatorState } from "./AnimatorState";

/**
* <code>AnimatorPlayState</code> 类用于创建动画播放状态信息。
*/
Expand All @@ -20,6 +22,8 @@ export class AnimatorPlayState {
_playEventIndex: number;
/**@internal */
_lastIsFront: boolean;
/**@internal */
_currentState: AnimatorState = null;

/**
* 获取播放状态的归一化时间,整数为循环次数,小数为单次播放时间。
Expand All @@ -35,6 +39,13 @@ export class AnimatorPlayState {
return this._duration;
}

/**
* 动画状态机。
*/
get animatorState(): AnimatorState {
return this._currentState;
}

/**
* 创建一个 <code>AnimatorPlayState</code> 实例。
*/
Expand Down
4 changes: 0 additions & 4 deletions src/layaAir/laya/d3/component/AnimatorState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,13 @@ export class AnimatorState implements IReferenceCounter, IClone {
}

/**
* @internal
* @implements IReferenceCounter
*/
_getReferenceCount(): number {
return this._referenceCount;
}

/**
* @internal
* @implements IReferenceCounter
*/
_addReference(count: number = 1): void {
Expand All @@ -74,7 +72,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}

/**
* @internal
* @implements IReferenceCounter
*/
_removeReference(count: number = 1): void {
Expand All @@ -83,7 +80,6 @@ export class AnimatorState implements IReferenceCounter, IClone {
}

/**
* @internal
* @implements IReferenceCounter
*/
_clearReference(): void {
Expand Down

0 comments on commit 8061ace

Please sign in to comment.