Skip to content

Commit

Permalink
Add AnimatorController loader for AniamtorController Editor (#1078)
Browse files Browse the repository at this point in the history
* feat: add AnimatorController loader  for AniamtorController Editor
  • Loading branch information
luzhuang authored Oct 11, 2022
1 parent ea58e24 commit a4baff3
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 121 deletions.
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 a4baff3

Please sign in to comment.