Source: tiny/core/textures/TextureTransform.js

import Matrix from '../math/Matrix';
const tempMat = new Matrix();

/**
 * Class controls uv transform and frame clamp for texture
 *
 * @class
 * @version 1.0.2
 * @memberof Tiny
 */
class TextureTransform {
  /**
   *
   * @param {Tiny.Texture} texture - Observed texture
   * @param {number} [clampMargin] - Changes frame clamping, 0.5 by default. Use -0.5 for extra border.
   * @constructor
   */
  constructor(texture, clampMargin) {
    this._texture = texture;

    this.mapCoord = new Matrix();

    this.uClampFrame = new Float32Array(4);

    this.uClampOffset = new Float32Array(2);

    this._lastTextureID = -1;

    /**
     * Changes frame clamping
     * Works with TilingSprite and Mesh
     * Change to 1.5 if you texture has repeated right and bottom lines, that leads to smoother borders
     *
     * @default 0
     * @member {number}
     */
    this.clampOffset = 0;

    /**
     * Changes frame clamping
     * Works with TilingSprite and Mesh
     * Change to -0.5 to add a pixel to the edge, recommended for transparent trimmed textures in atlas
     *
     * @default 0.5
     * @member {number}
     */
    this.clampMargin = (typeof clampMargin === 'undefined') ? 0.5 : clampMargin;
  }

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

  set texture(value) {
    this._texture = value;
    this._lastTextureID = -1;
  }

  /**
   * Multiplies uvs array to transform
   *
   * @param {Float32Array} uvs - mesh uvs
   * @param {Float32Array} [out=uvs] - output
   * @return {Float32Array} output
   */
  multiplyUvs(uvs, out) {
    if (out === undefined) {
      out = uvs;
    }

    const mat = this.mapCoord;

    for (let i = 0; i < uvs.length; i += 2) {
      const x = uvs[i];
      const y = uvs[i + 1];

      out[i] = (x * mat.a) + (y * mat.c) + mat.tx;
      out[i + 1] = (x * mat.b) + (y * mat.d) + mat.ty;
    }

    return out;
  }

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

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

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

    this._lastTextureID = tex._updateID;

    const uvs = tex._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.uClampFrame;
    const margin = this.clampMargin / texBase.resolution;
    const offset = this.clampOffset;

    frame[0] = (tex._frame.x + margin + offset) / texBase.width;
    frame[1] = (tex._frame.y + margin + offset) / texBase.height;
    frame[2] = (tex._frame.x + tex._frame.width - margin + offset) / texBase.width;
    frame[3] = (tex._frame.y + tex._frame.height - margin + offset) / texBase.height;
    this.uClampOffset[0] = offset / texBase.realWidth;
    this.uClampOffset[1] = offset / texBase.realHeight;

    return true;
  }
}

export default TextureTransform;
Documentation generated by JSDoc 3.4.3 on Fri Jul 09 2021 19:32:25 GMT+0800 (CST)