UNPKG

@dcl-sdk/utils

Version:

A collection of helpers to make it easier to build a Decentraland scene using the SDK 7.

65 lines 9.77 kB
import { engine, EntityState, Tween, } from "@dcl/sdk/ecs"; import { priority } from "./priority"; import { InterpolationType } from "./math"; import { getEasingFunctionFromInterpolation } from "./helpers"; function createTweens(targetEngine) { const tweenMap = new Map(); function makeSystem(dt) { const deadTweens = []; for (const [entity, tweenData] of tweenMap.entries()) { if (targetEngine.getEntityState(entity) == EntityState.Removed || !Tween.has(entity)) { tweenMap.delete(entity); continue; } const tween = Tween.get(entity); tweenData.normalizedTime += dt * 1000; if (tweenData.normalizedTime >= tween.duration) { deadTweens.push(entity); } } for (const entity of deadTweens) { const callback = tweenMap.get(entity)?.callback; Tween.deleteFrom(entity); tweenMap.delete(entity); if (callback) callback(); } } function makeStop(entity) { Tween.deleteFrom(entity); tweenMap.delete(entity); } function makeStart(mode) { return function (entity, start, end, duration, interpolationType = InterpolationType.LINEAR, onFinish) { const currentTime = duration === 0 ? 1 : 0; tweenMap.set(entity, { normalizedTime: currentTime, callback: onFinish }); Tween.createOrReplace(entity, { duration: duration * 1000, easingFunction: getEasingFunctionFromInterpolation(interpolationType), currentTime, mode: Tween.Mode[mode]({ start: start, end: end }), }); }; } function makeGetOnFinishCallback(entity) { if (!tweenMap.has(entity)) { throw new Error(`Entity ${entity} is not registered with tweens system`); } return tweenMap.get(entity); } targetEngine.addSystem(makeSystem, priority.TweenSystemPriority); return { startTranslation: makeStart("Move"), stopTranslation: makeStop, startRotation: makeStart("Rotate"), stopRotation: makeStop, startScaling: makeStart("Scale"), stopScaling: makeStop, getTranslationOnFinishCallback: makeGetOnFinishCallback, getRotationOnFinishCallback: makeGetOnFinishCallback, getScalingOnFinishCallback: makeGetOnFinishCallback, }; } export const tweens = createTweens(engine); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdlZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHdlZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFHTixXQUFXLEVBQ1gsS0FBSyxHQUVOLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVkvRCxTQUFTLFlBQVksQ0FBQyxZQUFxQjtJQUN6QyxNQUFNLFFBQVEsR0FBYSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXJDLFNBQVMsVUFBVSxDQUFDLEVBQVU7UUFDNUIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXRCLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxJQUNFLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU87Z0JBQzFELENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDbEIsQ0FBQztnQkFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4QixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsU0FBUyxDQUFDLGNBQWMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBRXRDLElBQUksU0FBUyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9DLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDO1lBQ2hELEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixJQUFJLFFBQVE7Z0JBQUUsUUFBUSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLFFBQVEsQ0FBQyxNQUFjO1FBQzlCLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxTQUFTLENBR2hCLElBQVU7UUFDVixPQUFPLFVBQ0wsTUFBYyxFQUNkLEtBQW9CLEVBQ3BCLEdBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLG9CQUF1QyxpQkFBaUIsQ0FBQyxNQUFNLEVBQy9ELFFBQTJCO1lBRTNCLE1BQU0sV0FBVyxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMxRSxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRTtnQkFDNUIsUUFBUSxFQUFFLFFBQVEsR0FBRyxJQUFJO2dCQUN6QixjQUFjLEVBQUUsa0NBQWtDLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JFLFdBQVc7Z0JBQ1gsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBWSxFQUFFLEdBQUcsRUFBRSxHQUFVLEVBQUUsQ0FBQzthQUNqRSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyx1QkFBdUIsQ0FBQyxNQUFjO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLE1BQU0sdUNBQXVDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUVqRSxPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUNuQyxlQUFlLEVBQUUsUUFBUTtRQUN6QixhQUFhLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxZQUFZLEVBQUUsUUFBUTtRQUN0QixZQUFZLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNoQyxXQUFXLEVBQUUsUUFBUTtRQUNyQiw4QkFBOEIsRUFBRSx1QkFBdUI7UUFDdkQsMkJBQTJCLEVBQUUsdUJBQXVCO1FBQ3BELDBCQUEwQixFQUFFLHVCQUF1QjtLQUNwRCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBlbmdpbmUsXG4gIEVudGl0eSxcbiAgSUVuZ2luZSxcbiAgRW50aXR5U3RhdGUsXG4gIFR3ZWVuLFxuICBUd2VlbkhlbHBlcixcbn0gZnJvbSBcIkBkY2wvc2RrL2Vjc1wiO1xuXG5pbXBvcnQgeyBwcmlvcml0eSB9IGZyb20gXCIuL3ByaW9yaXR5XCI7XG5pbXBvcnQgeyBJbnRlcnBvbGF0aW9uVHlwZSB9IGZyb20gXCIuL21hdGhcIjtcbmltcG9ydCB7IGdldEVhc2luZ0Z1bmN0aW9uRnJvbUludGVycG9sYXRpb24gfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCB0eXBlIE9uRmluaXNoQ2FsbGJhY2sgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgVHdlZW5zID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVHdlZW5zPjtcbnR5cGUgVHdlZW5NYXAgPSBNYXA8XG4gIEVudGl0eSxcbiAge1xuICAgIG5vcm1hbGl6ZWRUaW1lOiBudW1iZXI7XG4gICAgY2FsbGJhY2s6IE9uRmluaXNoQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gIH1cbj47XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVucyh0YXJnZXRFbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgdHdlZW5NYXA6IFR3ZWVuTWFwID0gbmV3IE1hcCgpO1xuXG4gIGZ1bmN0aW9uIG1ha2VTeXN0ZW0oZHQ6IG51bWJlcikge1xuICAgIGNvbnN0IGRlYWRUd2VlbnMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgW2VudGl0eSwgdHdlZW5EYXRhXSBvZiB0d2Vlbk1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGFyZ2V0RW5naW5lLmdldEVudGl0eVN0YXRlKGVudGl0eSkgPT0gRW50aXR5U3RhdGUuUmVtb3ZlZCB8fFxuICAgICAgICAhVHdlZW4uaGFzKGVudGl0eSlcbiAgICAgICkge1xuICAgICAgICB0d2Vlbk1hcC5kZWxldGUoZW50aXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR3ZWVuID0gVHdlZW4uZ2V0KGVudGl0eSk7XG4gICAgICB0d2VlbkRhdGEubm9ybWFsaXplZFRpbWUgKz0gZHQgKiAxMDAwO1xuXG4gICAgICBpZiAodHdlZW5EYXRhLm5vcm1hbGl6ZWRUaW1lID49IHR3ZWVuLmR1cmF0aW9uKSB7XG4gICAgICAgIGRlYWRUd2VlbnMucHVzaChlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGRlYWRUd2VlbnMpIHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHdlZW5NYXAuZ2V0KGVudGl0eSk/LmNhbGxiYWNrO1xuICAgICAgVHdlZW4uZGVsZXRlRnJvbShlbnRpdHkpO1xuICAgICAgdHdlZW5NYXAuZGVsZXRlKGVudGl0eSk7XG4gICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZVN0b3AoZW50aXR5OiBFbnRpdHkpIHtcbiAgICBUd2Vlbi5kZWxldGVGcm9tKGVudGl0eSk7XG4gICAgdHdlZW5NYXAuZGVsZXRlKGVudGl0eSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlU3RhcnQ8XG4gICAgTW9kZSBleHRlbmRzIGtleW9mIFR3ZWVuSGVscGVyLFxuICAgIFR5cGUgZXh0ZW5kcyBQYXJhbWV0ZXJzPFR3ZWVuSGVscGVyW01vZGVdPlswXVxuICA+KG1vZGU6IE1vZGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICBzdGFydDogVHlwZVtcInN0YXJ0XCJdLFxuICAgICAgZW5kOiBUeXBlW1wiZW5kXCJdLFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIGludGVycG9sYXRpb25UeXBlOiBJbnRlcnBvbGF0aW9uVHlwZSA9IEludGVycG9sYXRpb25UeXBlLkxJTkVBUixcbiAgICAgIG9uRmluaXNoPzogT25GaW5pc2hDYWxsYmFja1xuICAgICkge1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBkdXJhdGlvbiA9PT0gMCA/IDEgOiAwO1xuICAgICAgdHdlZW5NYXAuc2V0KGVudGl0eSwgeyBub3JtYWxpemVkVGltZTogY3VycmVudFRpbWUsIGNhbGxiYWNrOiBvbkZpbmlzaCB9KTtcbiAgICAgIFR3ZWVuLmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIHtcbiAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgZWFzaW5nRnVuY3Rpb246IGdldEVhc2luZ0Z1bmN0aW9uRnJvbUludGVycG9sYXRpb24oaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICBjdXJyZW50VGltZSxcbiAgICAgICAgbW9kZTogVHdlZW4uTW9kZVttb2RlXSh7IHN0YXJ0OiBzdGFydCBhcyBhbnksIGVuZDogZW5kIGFzIGFueSB9KSxcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlR2V0T25GaW5pc2hDYWxsYmFjayhlbnRpdHk6IEVudGl0eSkge1xuICAgIGlmICghdHdlZW5NYXAuaGFzKGVudGl0eSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7ZW50aXR5fSBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHR3ZWVucyBzeXN0ZW1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHR3ZWVuTWFwLmdldChlbnRpdHkpO1xuICB9XG5cbiAgdGFyZ2V0RW5naW5lLmFkZFN5c3RlbShtYWtlU3lzdGVtLCBwcmlvcml0eS5Ud2VlblN5c3RlbVByaW9yaXR5KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0VHJhbnNsYXRpb246IG1ha2VTdGFydChcIk1vdmVcIiksXG4gICAgc3RvcFRyYW5zbGF0aW9uOiBtYWtlU3RvcCxcbiAgICBzdGFydFJvdGF0aW9uOiBtYWtlU3RhcnQoXCJSb3RhdGVcIiksXG4gICAgc3RvcFJvdGF0aW9uOiBtYWtlU3RvcCxcbiAgICBzdGFydFNjYWxpbmc6IG1ha2VTdGFydChcIlNjYWxlXCIpLFxuICAgIHN0b3BTY2FsaW5nOiBtYWtlU3RvcCxcbiAgICBnZXRUcmFuc2xhdGlvbk9uRmluaXNoQ2FsbGJhY2s6IG1ha2VHZXRPbkZpbmlzaENhbGxiYWNrLFxuICAgIGdldFJvdGF0aW9uT25GaW5pc2hDYWxsYmFjazogbWFrZUdldE9uRmluaXNoQ2FsbGJhY2ssXG4gICAgZ2V0U2NhbGluZ09uRmluaXNoQ2FsbGJhY2s6IG1ha2VHZXRPbkZpbmlzaENhbGxiYWNrLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgdHdlZW5zID0gY3JlYXRlVHdlZW5zKGVuZ2luZSk7XG4iXX0=