From cd45e3d1d7654c1e2fc052547d826039bed0ba3c Mon Sep 17 00:00:00 2001 From: jsynk Date: Fri, 19 Feb 2016 08:10:14 +0100 Subject: [PATCH 1/2] model: Add initial support for multiple animation --- .../default/model/components/ModelRenderer.ts | 25 +++++++++++++++++-- .../typescriptAPI/Sup.ModelRenderer.d.ts.txt | 7 ++++++ .../typescriptAPI/Sup.ModelRenderer.ts.txt | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/plugins/default/model/components/ModelRenderer.ts b/plugins/default/model/components/ModelRenderer.ts index 950211e70..bc38acbdb 100644 --- a/plugins/default/model/components/ModelRenderer.ts +++ b/plugins/default/model/components/ModelRenderer.ts @@ -21,6 +21,12 @@ interface Animation { keyFrames: AnimationKeyFrames; } +interface AnimationTimes { + name: string; + time: number; + ignoreFilter?: RegExp; +} + function getInterpolationData(keyFrames: any[], time: number) { let prevKeyFrame = keyFrames[keyFrames.length - 1]; @@ -287,6 +293,21 @@ export default class ModelRenderer extends SupEngine.ActorComponent { return; } + setAnimationsAndTimes(animationList: Array) { + if (animationList instanceof Array) { + for (let i = 0; i < animationList.length; i++) { + let aniListItem = animationList[i]; + let newAnimation = this.animationsByName[aniListItem.animation]; + this.animation = newAnimation; + this.animationLooping = true; + this.animationTimer = aniListItem.time * this.actor.gameInstance.framesPerSecond; + this.isAnimationPlaying = true; + this.updatePose(aniListItem.ignoreFilter); + } + } + return; + } + getAnimation(): string { return (this.animation != null) ? this.animation.name : null; } setAnimationTime(time: number) { @@ -341,7 +362,7 @@ export default class ModelRenderer extends SupEngine.ActorComponent { return { position, orientation, scale }; } - updatePose() { + updatePose(ignoreFilter?: RegExp) { this.hasPoseBeenUpdated = true; // TODO: this.asset.speedMultiplier @@ -361,7 +382,7 @@ export default class ModelRenderer extends SupEngine.ActorComponent { for (let i = 0; i < (this.threeMesh).skeleton.bones.length; i++) { let bone = (this.threeMesh).skeleton.bones[i]; let boneKeyFrames = this.animation.keyFrames[bone.name]; - if (boneKeyFrames == null) continue; + if (boneKeyFrames == null || (ignoreFilter && ignoreFilter.test(bone.name))) continue; if (boneKeyFrames.translation != null) { let { prevKeyFrame, nextKeyFrame, t } = getInterpolationData(boneKeyFrames.translation, time); diff --git a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt index 66012747a..6a9f6da9b 100644 --- a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt +++ b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt @@ -1,3 +1,9 @@ +interface AnimationTimes { + name: string; + time: number; + ignoreFilter?: RegExp; +} + declare namespace Sup { class ModelRenderer extends ActorComponent { constructor(actor: Actor, pathOrAsset?: string|Model); @@ -21,6 +27,7 @@ declare namespace Sup { getAnimation(): string; setAnimation(animationName: string, looping?: boolean): ModelRenderer; setAnimationTime(time: number): ModelRenderer; + setAnimationsAndTimes(animationList: Array): ModelRenderer; getAnimationTime(): number; getAnimationDuration(): number; diff --git a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt index f9433628f..0a287d2c8 100644 --- a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt +++ b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt @@ -64,6 +64,7 @@ namespace Sup { } setAnimation(animationName, looping) { this.__inner.setAnimation(animationName, looping); return this } + setAnimationsAndTimes(animationList) { this.__inner.setAnimationsAndTimes(animationList); return this } getAnimation() { return this.__inner.getAnimation() } setAnimationTime(time) { this.__inner.setAnimationTime(time); return this } getAnimationTime() { return this.__inner.getAnimationTime() } From 9b8e93030d0f930893aec2aa003813afaa686205 Mon Sep 17 00:00:00 2001 From: jsynk Date: Fri, 19 Feb 2016 21:54:49 +0100 Subject: [PATCH 2/2] model: renaming and more options for multple animations --- .../default/model/components/ModelRenderer.ts | 34 +++++++++++-------- .../typescriptAPI/Sup.ModelRenderer.d.ts.txt | 9 ++--- .../typescriptAPI/Sup.ModelRenderer.ts.txt | 2 +- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/plugins/default/model/components/ModelRenderer.ts b/plugins/default/model/components/ModelRenderer.ts index bc38acbdb..0e36afeaf 100644 --- a/plugins/default/model/components/ModelRenderer.ts +++ b/plugins/default/model/components/ModelRenderer.ts @@ -21,10 +21,11 @@ interface Animation { keyFrames: AnimationKeyFrames; } -interface AnimationTimes { +interface AnimationItem { name: string; - time: number; - ignoreFilter?: RegExp; + time?: number; + looping?: boolean; + ignoreBoneNameFilter?: RegExp; } function getInterpolationData(keyFrames: any[], time: number) { @@ -293,17 +294,20 @@ export default class ModelRenderer extends SupEngine.ActorComponent { return; } - setAnimationsAndTimes(animationList: Array) { - if (animationList instanceof Array) { - for (let i = 0; i < animationList.length; i++) { - let aniListItem = animationList[i]; - let newAnimation = this.animationsByName[aniListItem.animation]; - this.animation = newAnimation; - this.animationLooping = true; - this.animationTimer = aniListItem.time * this.actor.gameInstance.framesPerSecond; - this.isAnimationPlaying = true; - this.updatePose(aniListItem.ignoreFilter); + setMultipleAnimations(newAnimationItemList: Array) { + for (let i = 0; i < newAnimationItemList.length; i++) { + let newAnimationItem = newAnimationItemList[i]; + let newAnimation = this.animationsByName[newAnimationItem.name]; + if (newAnimation == null) throw new Error(`Animation ${newAnimationItem.name} doesn't exist`); + this.animation = newAnimation; + this.animationLooping = newAnimationItem.looping ? true : false; + let time = newAnimationItem.time; + if (typeof time === "number") { + if (time < 0 || time > this.getAnimationDuration()) throw new Error("Invalid time"); + this.animationTimer = time * this.actor.gameInstance.framesPerSecond; } + this.isAnimationPlaying = true; + this.updatePose(newAnimationItem.ignoreBoneNameFilter); } return; } @@ -362,7 +366,7 @@ export default class ModelRenderer extends SupEngine.ActorComponent { return { position, orientation, scale }; } - updatePose(ignoreFilter?: RegExp) { + updatePose(ignoreBoneNameFilter?: RegExp) { this.hasPoseBeenUpdated = true; // TODO: this.asset.speedMultiplier @@ -382,7 +386,7 @@ export default class ModelRenderer extends SupEngine.ActorComponent { for (let i = 0; i < (this.threeMesh).skeleton.bones.length; i++) { let bone = (this.threeMesh).skeleton.bones[i]; let boneKeyFrames = this.animation.keyFrames[bone.name]; - if (boneKeyFrames == null || (ignoreFilter && ignoreFilter.test(bone.name))) continue; + if (boneKeyFrames == null || (ignoreBoneNameFilter && ignoreBoneNameFilter.test(bone.name))) continue; if (boneKeyFrames.translation != null) { let { prevKeyFrame, nextKeyFrame, t } = getInterpolationData(boneKeyFrames.translation, time); diff --git a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt index 6a9f6da9b..78f007ddb 100644 --- a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt +++ b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.d.ts.txt @@ -1,7 +1,8 @@ -interface AnimationTimes { +interface AnimationItem { name: string; - time: number; - ignoreFilter?: RegExp; + time?: number; + looping?: boolean; + ignoreBoneNameFilter?: RegExp; } declare namespace Sup { @@ -27,9 +28,9 @@ declare namespace Sup { getAnimation(): string; setAnimation(animationName: string, looping?: boolean): ModelRenderer; setAnimationTime(time: number): ModelRenderer; - setAnimationsAndTimes(animationList: Array): ModelRenderer; getAnimationTime(): number; getAnimationDuration(): number; + setMultipleAnimations(animationItemList: Array): ModelRenderer; isAnimationPlaying(): boolean; playAnimation(looping?: boolean): ModelRenderer; diff --git a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt index 0a287d2c8..8e23b3a7a 100644 --- a/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt +++ b/plugins/default/model/typescriptAPI/Sup.ModelRenderer.ts.txt @@ -64,7 +64,7 @@ namespace Sup { } setAnimation(animationName, looping) { this.__inner.setAnimation(animationName, looping); return this } - setAnimationsAndTimes(animationList) { this.__inner.setAnimationsAndTimes(animationList); return this } + setMultipleAnimations(animationItemList) { this.__inner.setMultipleAnimations(animationItemList); return this } getAnimation() { return this.__inner.getAnimation() } setAnimationTime(time) { this.__inner.setAnimationTime(time); return this } getAnimationTime() { return this.__inner.getAnimationTime() }