Skip to content

Commit

Permalink
Merge 4fd8c0d into ea58e24
Browse files Browse the repository at this point in the history
  • Loading branch information
luzhuang authored Oct 11, 2022
2 parents ea58e24 + 4fd8c0d commit 8db811d
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 125 deletions.
12 changes: 8 additions & 4 deletions packages/core/src/animation/AnimatorController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import { AnimatorControllerLayer } from "./AnimatorControllerLayer";
* Store the data for Animator playback.
*/
export class AnimatorController {
/** @internal */
_onDataChanged: () => void = null;

private _updateFlagManager: UpdateFlagManager = new UpdateFlagManager();
private _layers: AnimatorControllerLayer[] = [];
private _layersMap: Record<string, AnimatorControllerLayer> = {};
Expand All @@ -32,7 +35,7 @@ export class AnimatorController {
addLayer(layer: AnimatorControllerLayer): void {
this._layers.push(layer);
this._layersMap[layer.name] = layer;
this._distributeUpdateFlag();
this._onChange();
}

/**
Expand All @@ -43,7 +46,7 @@ export class AnimatorController {
const theLayer = this.layers[layerIndex];
this._layers.splice(layerIndex, 1);
delete this._layersMap[theLayer.name];
this._distributeUpdateFlag();
this._onChange();
}

/**
Expand All @@ -54,7 +57,7 @@ export class AnimatorController {
for (let name in this._layersMap) {
delete this._layersMap[name];
}
this._distributeUpdateFlag();
this._onChange();
}

/**
Expand All @@ -64,7 +67,8 @@ export class AnimatorController {
return this._updateFlagManager.createFlag(BoolUpdateFlag);
}

private _distributeUpdateFlag(): void {
private _onChange() {
this._updateFlagManager.dispatch();
this._onDataChanged && this._onDataChanged();
}
}
6 changes: 4 additions & 2 deletions packages/core/src/asset/AssetType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ export enum AssetType {
Material = "material",
/** Mesh. */
Mesh = "mesh",
/** Animation Clip. */
AnimationClip = "animation-clip",
/** AnimationClip. */
AnimationClip = "AnimationClip",
/** AnimatorController. */
AnimatorController = "AnimatorController",
/** Prefab.*/
Prefab = "prefab",
/** Compress Texture. */
Expand Down
87 changes: 87 additions & 0 deletions packages/loader/src/AnimatorControllerLoader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import {
resourceLoader,
Loader,
AssetPromise,
AssetType,
LoadItem,
ResourceManager,
AnimatorController,
AnimatorControllerLayer,
AnimatorStateMachine,
AnimatorStateTransition
} from "@oasis-engine/core";

@resourceLoader(AssetType.AnimatorController, ["json"], false)
class AnimatorControllerLoader extends Loader<AnimatorController> {
load(item: LoadItem, resourceManager: ResourceManager): AssetPromise<AnimatorController> {
return new AssetPromise((resolve, reject) => {
this.request<any>(item.url, {
...item,
type: "json"
}).then(async (data) => {
const animatorController = new AnimatorController();
const { layers } = data;
const promises = [];
layers.forEach((layerData, layerIndex: number) => {
const { name, blendingMode, weight, stateMachine: stateMachineData } = layerData;
const layer = new AnimatorControllerLayer(name);
layer.blendingMode = blendingMode;
layer.weight = weight;
if (stateMachineData) {
const { states } = stateMachineData;
const stateMachine = (layer.stateMachine = new AnimatorStateMachine());
states.forEach((stateData, stateIndex: number) => {
const {
name,
speed,
wrapMode,
clipStartNormalizedTime,
clipEndNormalizedTime,
isDefaultState,
clip: clipData
} = stateData;
const state = stateMachine.addState(name);
state.speed = speed;
state.wrapMode = wrapMode;
state.clipStartTime = clipStartNormalizedTime;
state.clipEndTime = clipEndNormalizedTime;
if (clipData) {
promises.push(
new Promise(async (resolve) => {
resolve({
layerIndex,
stateIndex,
clip: await resourceManager.getResourceByRef(clipData)
});
})
);
}
});
states.forEach((stateData) => {
const { name, transitions } = stateData;
transitions.forEach((transitionData) => {
const { targetStateName, duration, offset, exitTime } = transitionData;
const sourceState = stateMachine.findStateByName(name);
const destState = stateMachine.findStateByName(targetStateName);
const transition = new AnimatorStateTransition();
transition.destinationState = destState;
transition.duration = duration;
transition.exitTime = exitTime;
transition.offset = offset;
sourceState.addTransition(transition);
});
});
}
animatorController.addLayer(layer);
});
Promise.all(promises).then((clipData) => {
clipData.forEach((data) => {
const { layerIndex, stateIndex, clip } = data;
animatorController.layers[layerIndex].stateMachine.states[stateIndex].clip = clip;
});
resolve(animatorController);
});
});
});
}
}
3 changes: 2 additions & 1 deletion packages/loader/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ import "./HDRLoader";
import "./gltf/extensions/index";
import "./MaterialLoader";
import "./MeshLoader";
import "./AnimatorControllerLoader";

export * from "./resource-deserialize";
export { GLTFResource } from "./gltf/GLTFResource";
export * from "./SceneLoader";
export { parseSingleKTX } from "./compressed-texture";
export { parseSingleKTX } from "./compressed-texture";
1 change: 0 additions & 1 deletion packages/loader/src/resource-deserialize/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export { ReflectionParser } from "./resources/prefab/ReflectionParser";
export { PrefabParser } from "./resources/prefab/PrefabParser";
export type { IModelMesh } from "./resources/mesh/IModelMesh";
export type { IAnimationClipAsset } from "./resources/animationClip/type";
export type { IAnimatorControllerAsset } from "./resources/animatorController/type";

/**
* Decode engine binary resource.
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ export class ReflectionParser {
for (let i = 0; i < entityConfig.components.length; i++) {
const componentConfig = entityConfig.components[i];
const key = !componentConfig.refId ? componentConfig.class : componentConfig.refId;
const component = entity.addComponent(Loader.getClass(key));
let component;
if (key === "Animator") {
component = entity.getComponent(Loader.getClass(key));
}
component = component || entity.addComponent(Loader.getClass(key));
const promise = this.parsePropsAndMethods(component, componentConfig, engine);
promises.push(promise);
}
Expand Down

0 comments on commit 8db811d

Please sign in to comment.