@dcl-sdk/utils
Version:
A collection of helpers to make it easier to build a Decentraland scene using the SDK 7.
79 lines • 10.9 kB
JavaScript
import { engine, Schemas, Transform, Tween, TweenSequence } from '@dcl/sdk/ecs';
import { Quaternion } from '@dcl/sdk/math';
import { priority } from './priority';
export var AXIS;
(function (AXIS) {
AXIS["X"] = "x";
AXIS["Y"] = "y";
AXIS["Z"] = "z";
})(AXIS || (AXIS = {}));
function createPerpetualMotions(targetEngine) {
const PerpetualRotation = targetEngine.defineComponent('dcl.utils.PerpetualRotation', {
velocity: Schemas.Quaternion
});
function system(dt) {
for (const [entity, rotation] of targetEngine.getEntitiesWith(PerpetualRotation, Transform)) {
const rotationDelta = Quaternion.slerp(Quaternion.Identity(), rotation.velocity, dt);
const transform = Transform.getMutable(entity);
transform.rotation = Quaternion.normalize(Quaternion.multiply(transform.rotation, rotationDelta));
}
}
targetEngine.addSystem(system, priority.PerpetualMotionSystemPriority);
return {
startRotation(entity, velocity) {
PerpetualRotation.createOrReplace(entity, { velocity: velocity });
},
stopRotation(entity) {
if (Tween.has(entity)) {
Tween.deleteFrom(entity);
}
if (TweenSequence.has(entity)) {
TweenSequence.deleteFrom(entity);
}
if (PerpetualRotation.has(entity)) {
PerpetualRotation.deleteFrom(entity);
}
},
smoothRotation(entity, duration, axis) {
let firstEnd = Quaternion.fromEulerDegrees(0, 180, 0);
let secondEnd = Quaternion.fromEulerDegrees(0, 360, 0);
switch (axis) {
case AXIS.X:
firstEnd = Quaternion.fromEulerDegrees(180, 0, 0);
secondEnd = Quaternion.fromEulerDegrees(360, 0, 0);
break;
case AXIS.Y:
firstEnd = Quaternion.fromEulerDegrees(0, 180, 0);
secondEnd = Quaternion.fromEulerDegrees(0, 360, 0);
break;
case AXIS.Z:
firstEnd = Quaternion.fromEulerDegrees(0, 0, 180);
secondEnd = Quaternion.fromEulerDegrees(0, 0, 360);
break;
}
Tween.createOrReplace(entity, {
mode: Tween.Mode.Rotate({
start: Quaternion.fromEulerDegrees(0, 0, 0),
end: firstEnd
}),
duration: duration / 2,
easingFunction: 0
});
TweenSequence.create(entity, {
loop: 0,
sequence: [
{
mode: Tween.Mode.Rotate({
start: firstEnd,
end: secondEnd
}),
duration: duration / 2,
easingFunction: 0
}
]
});
}
};
}
export const perpetualMotions = createPerpetualMotions(engine);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVycGV0dWFsTW90aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BlcnBldHVhbE1vdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLE1BQU0sRUFBbUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWEsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUtyQyxNQUFNLENBQU4sSUFBWSxJQUlYO0FBSkQsV0FBWSxJQUFJO0lBQ2QsZUFBTyxDQUFBO0lBQ1AsZUFBTyxDQUFBO0lBQ1AsZUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUpXLElBQUksS0FBSixJQUFJLFFBSWY7QUFFRCxTQUFTLHNCQUFzQixDQUFDLFlBQXFCO0lBQ25ELE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyw2QkFBNkIsRUFBRTtRQUNwRixRQUFRLEVBQUUsT0FBTyxDQUFDLFVBQVU7S0FDN0IsQ0FBQyxDQUFBO0lBRUYsU0FBUyxNQUFNLENBQUMsRUFBVTtRQUN4QixLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDcEYsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFF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QUUsUUFBUSxHQUFHLENBQUM7d0JBQ3RCLGNBQWMsR0FBMEI7cUJBQ3pDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFBO1FBQ0osQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFYXNpbmdGdW5jdGlvbiwgZW5naW5lLCBFbnRpdHksIElFbmdpbmUsIFNjaGVtYXMsIFRyYW5zZm9ybSwgVHdlZW4sIFR3ZWVuTG9vcCwgVHdlZW5TZXF1ZW5jZSB9IGZyb20gJ0BkY2wvc2RrL2VjcydcbmltcG9ydCB7IFF1YXRlcm5pb24gfSBmcm9tICdAZGNsL3Nkay9tYXRoJ1xuaW1wb3J0IHsgcHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5J1xuXG5leHBvcnQgdHlwZSBQZXJwZXR1YWxNb3Rpb25zID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlUGVycGV0dWFsTW90aW9ucz5cblxuXG5leHBvcnQgZW51bSBBWElTIHtcbiAgWCA9ICd4JyxcbiAgWSA9ICd5JyxcbiAgWiA9ICd6J1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQZXJwZXR1YWxNb3Rpb25zKHRhcmdldEVuZ2luZTogSUVuZ2luZSkge1xuICBjb25zdCBQZXJwZXR1YWxSb3RhdGlvbiA9IHRhcmdldEVuZ2luZS5kZWZpbmVDb21wb25lbnQoJ2RjbC51dGlscy5QZXJwZXR1YWxSb3RhdGlvbicsIHtcbiAgICB2ZWxvY2l0eTogU2NoZW1hcy5RdWF0ZXJuaW9uXG4gIH0pXG5cbiAgZnVuY3Rpb24gc3lzdGVtKGR0OiBudW1iZXIpIHtcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHksIHJvdGF0aW9uXSBvZiB0YXJnZXRFbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBlcnBldHVhbFJvdGF0aW9uLCBUcmFuc2Zvcm0pKSB7XG4gICAgICBjb25zdCByb3RhdGlvbkRlbHRhID0gUXVhdGVybmlvbi5zbGVycChRdWF0ZXJuaW9uLklkZW50aXR5KCksIHJvdGF0aW9uLnZlbG9jaXR5LCBkdClcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IFRyYW5zZm9ybS5nZXRNdXRhYmxlKGVudGl0eSlcbiAgICAgIHRyYW5zZm9ybS5yb3RhdGlvbiA9IFF1YXRlcm5pb24ubm9ybWFsaXplKFF1YXRlcm5pb24ubXVsdGlwbHkodHJhbnNmb3JtLnJvdGF0aW9uLCByb3RhdGlvbkRlbHRhKSlcbiAgICB9XG4gIH1cblxuICB0YXJnZXRFbmdpbmUuYWRkU3lzdGVtKHN5c3RlbSwgcHJpb3JpdHkuUGVycGV0dWFsTW90aW9uU3lzdGVtUHJpb3JpdHkpXG5cbiAgcmV0dXJuIHtcbiAgICAvLyBEZXByZWNhdGVkISBVc2Ugc21vb3RoUm90YXRpb24gaW5zdGVhZFxuICAgIHN0YXJ0Um90YXRpb24oZW50aXR5OiBFbnRpdHksIHZlbG9jaXR5OiBRdWF0ZXJuaW9uKSB7XG4gICAgICBQZXJwZXR1YWxSb3RhdGlvbi5jcmVhdGVPclJlcGxhY2UoZW50aXR5LCB7IHZlbG9jaXR5OiB2ZWxvY2l0eSB9KVxuICAgIH0sXG4gICAgc3RvcFJvdGF0aW9uKGVudGl0eTogRW50aXR5KSB7XG5cbiAgICAgIGlmIChUd2Vlbi5oYXMoZW50aXR5KSkge1xuICAgICAgICBUd2Vlbi5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAgIH1cbiAgICAgIGlmIChUd2VlblNlcXVlbmNlLmhhcyhlbnRpdHkpKSB7XG4gICAgICAgIFR3ZWVuU2VxdWVuY2UuZGVsZXRlRnJvbShlbnRpdHkpXG4gICAgICB9XG5cbiAgICAgIGlmIChQZXJwZXR1YWxSb3RhdGlvbi5oYXMoZW50aXR5KSkge1xuICAgICAgICBQZXJwZXR1YWxSb3RhdGlvbi5kZWxldGVGcm9tKGVudGl0eSlcbiAgICAgIH1cblxuICAgIH0sXG4gICAgc21vb3RoUm90YXRpb24oZW50aXR5OiBFbnRpdHksIGR1cmF0aW9uOiBudW1iZXIsIGF4aXM/OiBBWElTKSB7XG5cbiAgICAgIGxldCBmaXJzdEVuZCA9IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygwLCAxODAsIDApXG4gICAgICBsZXQgc2Vjb25kRW5kID0gUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsIDM2MCwgMClcblxuICAgICAgc3dpdGNoIChheGlzKSB7XG4gICAgICAgIGNhc2UgQVhJUy5YOlxuICAgICAgICAgIGZpcnN0RW5kID0gUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDE4MCwgMCwgMClcbiAgICAgICAgICBzZWNvbmRFbmQgPSBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMzYwLCAwLCAwKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgQVhJUy5ZOlxuICAgICAgICAgIGZpcnN0RW5kID0gUXVhdGVybmlvbi5mcm9tRXVsZXJEZWdyZWVzKDAsIDE4MCwgMClcbiAgICAgICAgICBzZWNvbmRFbmQgPSBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgMzYwLCAwKVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSBBWElTLlo6XG4gICAgICAgICAgZmlyc3RFbmQgPSBRdWF0ZXJuaW9uLmZyb21FdWxlckRlZ3JlZXMoMCwgMCwgMTgwKVxuICAgICAgICAgIHNlY29uZEVuZCA9IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygwLCAwLCAzNjApXG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgVHdlZW4uY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwge1xuICAgICAgICBtb2RlOiBUd2Vlbi5Nb2RlLlJvdGF0ZSh7XG4gICAgICAgICAgc3RhcnQ6IFF1YXRlcm5pb24uZnJvbUV1bGVyRGVncmVlcygwLCAwLCAwKSxcbiAgICAgICAgICBlbmQ6IGZpcnN0RW5kXG4gICAgICAgIH0pLFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gLyAyLFxuICAgICAgICBlYXNpbmdGdW5jdGlvbjogRWFzaW5nRnVuY3Rpb24uRUZfTElORUFSXG4gICAgICB9KVxuICAgICAgVHdlZW5TZXF1ZW5jZS5jcmVhdGUoZW50aXR5LCB7XG4gICAgICAgIGxvb3A6IFR3ZWVuTG9vcC5UTF9SRVNUQVJULFxuICAgICAgICBzZXF1ZW5jZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGU6IFR3ZWVuLk1vZGUuUm90YXRlKHtcbiAgICAgICAgICAgICAgc3RhcnQ6IGZpcnN0RW5kLFxuICAgICAgICAgICAgICBlbmQ6IHNlY29uZEVuZFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gLyAyLFxuICAgICAgICAgICAgZWFzaW5nRnVuY3Rpb246IEVhc2luZ0Z1bmN0aW9uLkVGX0xJTkVBUlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBlcnBldHVhbE1vdGlvbnMgPSBjcmVhdGVQZXJwZXR1YWxNb3Rpb25zKGVuZ2luZSlcbiJdfQ==