Newer
Older
pixi.js / src / core / textures / TextureTransform.js
@Ivan Popelyshev Ivan Popelyshev on 4 Oct 2016 2 KB Giant tilingSprite refactoring.
import { default as Matrix } from '../math/Matrix';

const tempMat = new Matrix();

/**
 * class controls uv transform and frame clamp for texture
 */
export default class TextureTransform {
    /**
     *
     * @param {PIXI.Texture} texture observed texture
     * @constructor
     */
    constructor(texture)
    {
        this._texture = texture;

        this.mapCoord = new Matrix();

        this.frameClamp = new Float32Array(4);

        this._lastTextureID = -1;

        this.update();
    }

    /**
     * texture property
     * @member {PIXI.Texture}
     * @memberof PIXI.TextureTransform
     */
    get texture()
    {
        return this._texture;
    }

    /**
     * sets texture value
     * @param {PIXI.Texture} value texture to be set
     */
    set texture(value)
    {
        this._texture = value;
        this._lastTextureID = -1;
    }

    /**
     * updates matrices if texture was changed
     * @param {boolean} forceUpdate if true, matrices will be updated any case
     */
    update(forceUpdate)
    {
        const tex = this.texture;

        if (!tex || !tex.valid)
        {
            return;
        }

        if (!forceUpdate
            && this._lastTextureID === this.texture._updateID)
        {
            return;
        }

        this._lastTextureID = this.texture._updateID;

        const uvs = this.texture._uvs;

        this.mapCoord.set(uvs.x1 - uvs.x0, uvs.y1 - uvs.y0, uvs.x3 - uvs.x0, uvs.y3 - uvs.y0, uvs.x0, uvs.y0);

        const orig = tex.orig;
        const trim = tex.trim;

        if (trim)
        {
            tempMat.set(orig.width / trim.width, 0, 0, orig.height / trim.height,
                -trim.x / trim.width, -trim.y / trim.height);
            this.mapCoord.append(tempMat);
        }

        const texBase = tex.baseTexture;
        const frame = this.frameClamp;

        frame[0] = (tex._frame.x + tex.smoothEdge2) / texBase.width;
        frame[1] = (tex._frame.y + tex.smoothEdge2) / texBase.height;
        frame[2] = (tex._frame.x + tex._frame.width - tex.smoothEdge1 + tex.smoothEdge2) / texBase.width;
        frame[3] = (tex._frame.y + tex._frame.height - tex.smoothEdge1 + tex.smoothEdge2) / texBase.height;
    }
}