Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor state transition update logic and fix time bug #2130

Merged
merged 41 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
1feed59
feat: add transition condition
Mar 4, 2022
1c77e2c
feat: add transition condition
Mar 4, 2022
88c15f1
feat: merge dev0.7
Mar 4, 2022
7c8ae75
feat: add transition condition
luzhuang Oct 12, 2022
96dda3f
feat: stateMachine add transition condition
luzhuang May 14, 2024
3394896
feat: opt code
luzhuang Jun 19, 2024
19fe396
feat: opt code
luzhuang Jun 19, 2024
291745a
test: add test
luzhuang Jun 20, 2024
d89e9ed
feat: opt code
luzhuang Jun 20, 2024
6e60422
feat: opt code
luzhuang Jun 20, 2024
979227b
feat: opt code
luzhuang Jun 20, 2024
3505273
feat: opt code
luzhuang Jun 20, 2024
9c3510b
feat: revert to transition modification
luzhuang Jun 21, 2024
578394b
feat: stash
luzhuang Jun 21, 2024
2eb195f
fix: animation time is not correct
luzhuang Jun 21, 2024
b5c2ba5
Merge branch dev/1.3 of github.com:oasis-engine/engine into fix/anima…
luzhuang Jun 21, 2024
7d148e4
feat: opt code
luzhuang Jun 21, 2024
1a64dfc
refactor: opt code
GuoLei1990 Jun 23, 2024
4a05d69
refactor: opt code
GuoLei1990 Jun 23, 2024
5433f0e
refactor: opt code
GuoLei1990 Jun 23, 2024
47d2959
refactor: opt code
GuoLei1990 Jun 23, 2024
c1719c9
refactor: opt code
GuoLei1990 Jun 23, 2024
64bddd3
refactor: opt code
GuoLei1990 Jun 23, 2024
a314a8f
refactor: opt code
GuoLei1990 Jun 23, 2024
f4c2a40
refactor: opt code
GuoLei1990 Jun 23, 2024
0d9985e
refactor: opt code
GuoLei1990 Jun 23, 2024
27de4b6
refactor: opt code
GuoLei1990 Jun 23, 2024
f1b17cf
refactor: opt code
GuoLei1990 Jun 23, 2024
813484a
Merge pull request #37 from GuoLei1990/luzhuang-plus
luzhuang Jun 24, 2024
e88e9ff
fix: animation time error
luzhuang Jun 25, 2024
adaa33e
fix: backwards animation time error
luzhuang Jun 25, 2024
f6f5862
fix: backwards animation time error
luzhuang Jun 25, 2024
8bad9d8
feat: opt code
luzhuang Jun 26, 2024
c4ad04e
feat: opt code
luzhuang Jun 27, 2024
3cf63bf
feat: opt code
luzhuang Jun 27, 2024
031e069
feat: opt code
luzhuang Jun 27, 2024
594ab2b
feat: opt code
luzhuang Jun 27, 2024
1352a7f
feat: opt code
luzhuang Jun 27, 2024
d481845
feat: opt code
luzhuang Jun 27, 2024
ca42ad5
feat: opt code
luzhuang Jun 27, 2024
48872bc
feat: opt code
luzhuang Jun 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions e2e/case/.mockForE2E.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { Camera, Engine, RenderTarget, Texture2D } from "@galacean/engine-core";

export const updateForE2E = (engine, deltaTime = 100) => {
export const updateForE2E = (engine, deltaTime = 100, loopTime = 10) => {
engine._vSyncCount = Infinity;
engine._time._lastSystemTime = 0;
let times = 0;
performance.now = function () {
times++;
return times * deltaTime;
};
for (let i = 0; i < 10; ++i) {
for (let i = 0; i < loopTime; ++i) {
engine.update();
}
engine._hardwareRenderer._gl.finish();
Expand Down
89 changes: 55 additions & 34 deletions e2e/case/animator-stateMachine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,49 +51,70 @@ WebGLEngine.create({ canvas: "canvas" }).then((engine) => {
const idleState = animator.findAnimatorState("idle");
const walkState = animator.findAnimatorState("walk");
const runState = animator.findAnimatorState("run");
{
// handle idle state
const toWalkTransition = new AnimatorStateTransition();
toWalkTransition.destinationState = walkState;
toWalkTransition.exitTime = 0.5;
toWalkTransition.duration = 0.3;
toWalkTransition.addCondition(AnimatorConditionMode.Greater, "playerSpeed", 0);
idleState.addTransition(toWalkTransition);
let idleToWalkTime = 0;
let walkToRunTime = 0;
let runToWalkTime = 0;
let walkToIdleTime = 0;

const exitTransition = idleState.addExitTransition();
exitTransition.addCondition(AnimatorConditionMode.Equals, "playerSpeed", 0);
}
{
// handle walk state
const toRunTransition = new AnimatorStateTransition();
toRunTransition.destinationState = runState;
toRunTransition.duration = 0.3;
toRunTransition.addCondition(AnimatorConditionMode.Greater, "playerSpeed", 0.5);
walkState.addTransition(toRunTransition);
// handle idle state
const toWalkTransition = new AnimatorStateTransition();
toWalkTransition.destinationState = walkState;
toWalkTransition.duration = 0.2;
toWalkTransition.addCondition(AnimatorConditionMode.Greater, "playerSpeed", 0);
idleState.addTransition(toWalkTransition);
idleToWalkTime =
//@ts-ignore
toWalkTransition.exitTime * idleState._getDuration() + toWalkTransition.duration * walkState._getDuration();

const toIdleTransition = new AnimatorStateTransition();
toIdleTransition.destinationState = idleState;
toIdleTransition.duration = 0.3;
toIdleTransition.addCondition(AnimatorConditionMode.Equals, "playerSpeed", 0);
walkState.addTransition(toIdleTransition);
}
{
// handle run state
const toWalkTransition = new AnimatorStateTransition();
toWalkTransition.destinationState = walkState;
toWalkTransition.duration = 0.3;
toWalkTransition.addCondition(AnimatorConditionMode.Less, "playerSpeed", 0.5);
runState.addTransition(toWalkTransition);
}
const exitTransition = idleState.addExitTransition();
exitTransition.addCondition(AnimatorConditionMode.Equals, "playerSpeed", 0);
// to walk state
const toRunTransition = new AnimatorStateTransition();
toRunTransition.destinationState = runState;
toRunTransition.duration = 0.3;
toRunTransition.addCondition(AnimatorConditionMode.Greater, "playerSpeed", 0.5);
walkState.addTransition(toRunTransition);
walkToRunTime =
//@ts-ignore
(toRunTransition.exitTime - toWalkTransition.duration) * walkState._getDuration() +
//@ts-ignore
toRunTransition.duration * runState._getDuration();
const toIdleTransition = new AnimatorStateTransition();
toIdleTransition.destinationState = idleState;
toIdleTransition.duration = 0.3;
toIdleTransition.addCondition(AnimatorConditionMode.Equals, "playerSpeed", 0);
walkState.addTransition(toIdleTransition);
walkToIdleTime =
//@ts-ignore
(toIdleTransition.exitTime - toRunTransition.duration) * walkState._getDuration() +
//@ts-ignore
toIdleTransition.duration * idleState._getDuration();

// to run state
const RunToWalkTransition = new AnimatorStateTransition();
RunToWalkTransition.destinationState = walkState;
RunToWalkTransition.duration = 0.3;
RunToWalkTransition.addCondition(AnimatorConditionMode.Less, "playerSpeed", 0.5);
runState.addTransition(RunToWalkTransition);
runToWalkTime =
//@ts-ignore
(RunToWalkTransition.exitTime - toRunTransition.duration) * runState._getDuration() +
//@ts-ignore
RunToWalkTransition.duration * walkState._getDuration();

stateMachine.addEntryStateTransition(idleState);

const anyTransition = stateMachine.addAnyStateTransition(idleState);
anyTransition.addCondition(AnimatorConditionMode.Equals, "playerSpeed", 0);
anyTransition.duration = 0.3;
let anyToIdleTime =
// @ts-ignore
(anyTransition.exitTime - toIdleTransition.duration) * walkState._getDuration() +
// @ts-ignore
anyTransition.duration * idleState._getDuration();

updateForE2E(engine, 500);

engine.time.maximumDeltaTime = 10000;
updateForE2E(engine, (idleToWalkTime + walkToRunTime) * 1000, 1);
initScreenshot(engine, camera);
});
});
4 changes: 2 additions & 2 deletions e2e/fixtures/originImage/Animator_animator-stateMachine.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion packages/core/src/ComponentsManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ export class ComponentsManager {
callAnimationUpdate(deltaTime: number): void {
this._onUpdateAnimations.forEach(
(element: Animator) => {
element.engine.time.frameCount > element._playFrameCount && element.update(deltaTime);
element.update(deltaTime);
},
(element: Animator, index: number) => {
element._onUpdateIndex = index;
Expand Down
Loading
Loading