Newer
Older
pixi.js / test / core / TransformStatic.js
@Stafford Williams Stafford Williams on 17 Jan 2017 3 KB preserve mocha scope (#3599)
'use strict';

describe('PIXI.TransformStatic', function ()
{
    describe('setFromMatrix', function ()
    {
        it('should decompose negative scale into rotation', function ()
        {
            const eps = 1e-3;

            const transform = new PIXI.TransformStatic();
            const parent = new PIXI.TransformStatic();
            const otherTransform = new PIXI.TransformStatic();

            transform.position.set(20, 10);
            transform.scale.set(-2, -3);
            transform.rotation = Math.PI / 6;
            transform.updateTransform(parent);

            otherTransform.setFromMatrix(transform.worldTransform);

            const position = otherTransform.position;
            const scale = otherTransform.scale;
            const skew = otherTransform.skew;

            expect(position.x).to.be.closeTo(20, eps);
            expect(position.y).to.be.closeTo(10, eps);
            expect(scale.x).to.be.closeTo(2, eps);
            expect(scale.y).to.be.closeTo(3, eps);
            expect(skew.x).to.equal(0);
            expect(skew.y).to.equal(0);
            expect(otherTransform.rotation).to.be.closeTo(-5 * Math.PI / 6, eps);
        });

        it('should decompose mirror into skew', function ()
        {
            const eps = 1e-3;

            const transform = new PIXI.TransformStatic();
            const parent = new PIXI.TransformStatic();
            const otherTransform = new PIXI.TransformStatic();

            transform.position.set(20, 10);
            transform.scale.set(2, -3);
            transform.rotation = Math.PI / 6;
            transform.updateTransform(parent);

            otherTransform.setFromMatrix(transform.worldTransform);

            const position = otherTransform.position;
            const scale = otherTransform.scale;
            const skew = otherTransform.skew;

            expect(position.x).to.be.closeTo(20, eps);
            expect(position.y).to.be.closeTo(10, eps);
            expect(scale.x).to.be.closeTo(2, eps);
            expect(scale.y).to.be.closeTo(3, eps);
            expect(skew.x).to.be.closeTo(5 * Math.PI / 6, eps);
            expect(skew.y).to.be.closeTo(Math.PI / 6, eps);
            expect(otherTransform.rotation).to.equal(0);
        });

        it('should apply skew before scale, like in adobe animate and spine', function ()
        {
            // this example looks the same in CSS and in pixi, made with pixi-animate by @bigtimebuddy

            const eps = 1e-3;

            const transform = new PIXI.TransformStatic();
            const parent = new PIXI.TransformStatic();
            const otherTransform = new PIXI.TransformStatic();

            transform.position.set(387.8, 313.95);
            transform.scale.set(0.572, 4.101);
            transform.skew.set(-0.873, 0.175);
            transform.updateTransform(parent);

            const mat = transform.worldTransform;

            expect(mat.a).to.be.closeTo(0.563, eps);
            expect(mat.b).to.be.closeTo(0.100, eps);
            expect(mat.c).to.be.closeTo(-3.142, eps);
            expect(mat.d).to.be.closeTo(2.635, eps);
            expect(mat.tx).to.be.closeTo(387.8, eps);
            expect(mat.ty).to.be.closeTo(313.95, eps);

            otherTransform.setFromMatrix(transform.worldTransform);

            const position = otherTransform.position;
            const scale = otherTransform.scale;
            const skew = otherTransform.skew;

            expect(position.x).to.be.closeTo(387.8, eps);
            expect(position.y).to.be.closeTo(313.95, eps);
            expect(scale.x).to.be.closeTo(0.572, eps);
            expect(scale.y).to.be.closeTo(4.101, eps);
            expect(skew.x).to.be.closeTo(-0.873, eps);
            expect(skew.y).to.be.closeTo(0.175, eps);
            expect(otherTransform.rotation).to.be.equal(0);
        });
    });
});