From 901d6c356e9284e61b8b18a6e13bef8a57dc7b27 Mon Sep 17 00:00:00 2001 From: Jun Koyama Date: Tue, 19 May 2020 18:40:23 +0900 Subject: [PATCH] Fix delay in starting fade-out for expressions --- CHANGELOG.md | 5 +++ src/motion/cubismmotionqueueentry.ts | 42 ++++++++++++++++++++++---- src/motion/cubismmotionqueuemanager.ts | 15 +++++---- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b87688..4ae6709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed * Fix implementation of `iterator#increment` in `csmmap` and `csmvector`. +* Fix delay in starting fade-out for expressions. + +### Changed + +* Rename the function name that handles seconds from `Time` to `Seconds`. ## [4-r.1] - 2020-01-30 diff --git a/src/motion/cubismmotionqueueentry.ts b/src/motion/cubismmotionqueueentry.ts index 6f57b70..7c431e3 100644 --- a/src/motion/cubismmotionqueueentry.ts +++ b/src/motion/cubismmotionqueueentry.ts @@ -31,6 +31,8 @@ export namespace Live2DCubismFramework { this._stateWeight = 0.0; this._lastEventCheckSeconds = 0.0; this._motionQueueEntryHandle = this; + this._fadeOutSeconds = 0.0; + this._isTriggeredFadeOut = false; } /** @@ -42,13 +44,23 @@ export namespace Live2DCubismFramework { } } + /** + * フェードアウト時間と開始判定の設定 + * @param fadeOutSeconds フェードアウトにかかる時間[秒] + */ + public setFadeOut(fadeOutSeconds: number): void { + this._fadeOutSeconds = fadeOutSeconds; + this._isTriggeredFadeOut = true; + } + /** * フェードアウトの開始 * @param fadeOutSeconds フェードアウトにかかる時間[秒] * @param userTimeSeconds デルタ時間の積算値[秒] */ - public startFadeout(fadeoutSeconds: number, userTimeSeconds: number): void { - const newEndTimeSeconds: number = userTimeSeconds + fadeoutSeconds; + public startFadeOut(fadeOutSeconds: number, userTimeSeconds: number): void { + const newEndTimeSeconds: number = userTimeSeconds + fadeOutSeconds; + this._isTriggeredFadeOut = true; if ( this._endTimeSeconds < 0.0 || @@ -189,16 +201,32 @@ export namespace Live2DCubismFramework { * * @return 最後にイベントの発火をチェックした時間[秒] */ - public getLastCheckEventTime(): number { + public getLastCheckEventSeconds(): number { return this._lastEventCheckSeconds; } /** * 最後にイベントをチェックした時間を設定 - * @param checkTime 最後にイベントをチェックした時間[秒] + * @param checkSeconds 最後にイベントをチェックした時間[秒] */ - public setLastCheckEventTime(checkTime: number): void { - this._lastEventCheckSeconds = checkTime; + public setLastCheckEventSeconds(checkSeconds: number): void { + this._lastEventCheckSeconds = checkSeconds; + } + + /** + * フェードアウト開始判定の取得 + * @return フェードアウト開始するかどうか + */ + public isTriggeredFadeOut(): boolean { + return this._isTriggeredFadeOut && this._endTimeSeconds < 0.0; + } + + /** + * フェードアウト時間の取得 + * @return フェードアウト時間[秒] + */ + public getFadeOutSeconds(): number { + return this._fadeOutSeconds; } _autoDelete: boolean; // 自動削除 @@ -213,6 +241,8 @@ export namespace Live2DCubismFramework { _stateTimeSeconds: number; // 時刻の状態[秒] _stateWeight: number; // 重みの状態 _lastEventCheckSeconds: number; // 最終のMotion側のチェックした時間 + private _fadeOutSeconds: number; // フェードアウト時間[秒] + private _isTriggeredFadeOut: boolean; // フェードアウト開始フラグ _motionQueueEntryHandle: CubismMotionQueueEntryHandle; // インスタンスごとに一意の値を持つ識別番号 } diff --git a/src/motion/cubismmotionqueuemanager.ts b/src/motion/cubismmotionqueuemanager.ts index 5251803..597f4fd 100644 --- a/src/motion/cubismmotionqueuemanager.ts +++ b/src/motion/cubismmotionqueuemanager.ts @@ -81,10 +81,7 @@ export namespace Live2DCubismFramework { continue; } - motionQueueEntry.startFadeout( - motionQueueEntry._motion.getFadeOutTime(), - userTimeSeconds - ); // フェードアウトを開始し終了する + motionQueueEntry.setFadeOut(motionQueueEntry._motion.getFadeOutTime()); // フェードアウト設定 } motionQueueEntry = new CubismMotionQueueEntry(); // 終了時に破棄する @@ -290,7 +287,7 @@ export namespace Live2DCubismFramework { // ------ ユーザトリガーイベントを検査する ---- const firedList: csmVector = motion.getFiredEvent( - motionQueueEntry.getLastCheckEventTime() - + motionQueueEntry.getLastCheckEventSeconds() - motionQueueEntry.getStartTime(), userTimeSeconds - motionQueueEntry.getStartTime() ); @@ -299,7 +296,7 @@ export namespace Live2DCubismFramework { this._eventCallBack(this, firedList.at(i), this._eventCustomData); } - motionQueueEntry.setLastCheckEventTime(userTimeSeconds); + motionQueueEntry.setLastCheckEventSeconds(userTimeSeconds); // ------ 終了済みの処理があれば削除する ------ if (motionQueueEntry.isFinished()) { @@ -308,6 +305,12 @@ export namespace Live2DCubismFramework { motionQueueEntry = null; ite = this._motions.erase(ite); // 削除 } else { + if (motionQueueEntry.isTriggeredFadeOut()) { + motionQueueEntry.startFadeOut( + motionQueueEntry.getFadeOutSeconds(), + userTimeSeconds + ); + } ite.preIncrement(); } }