transformationMatrix property

Matrix transformationMatrix
override

The transformation matrix of this display object relative to this display object's parent.

The transformation matrix is calculated according the following properties of this display object: x, y, pivotX, pivotY, rotation, scaleX, scaleY, skewX and skewY

Implementation

@override
Matrix get transformationMatrix {
  // _transformationMatrix.identity();
  // _transformationMatrix.translate(-_pivotX, -_pivotY);
  // _transformationMatrix.scale(_scaleX, _scaleY);
  // _transformationMatrix.rotate(_rotation);
  // _transformationMatrix.translate(_x, _y);

  if (_transformationMatrixRefresh) {
    _transformationMatrixRefresh = false;

    var matrix = _transformationMatrix;
    num rotation = _rotation;
    num scaleX = _scaleX;
    num scaleY = _scaleY;
    num skewX = _skewX;
    num skewY = _skewY;

    // Having a scale of 0 is bad, the matrix.det gets zero which causes
    // infinite values on a inverted matrix. It also causes a bug on
    // Firefox in some Linux distrubutions:
    // https://bugzilla.mozilla.org/show_bug.cgi?id=661452

    if (scaleX > -0.0001 && scaleX < 0.0001) {
      scaleX = (scaleX >= 0) ? 0.0001 : -0.0001;
    }
    if (scaleY > -0.0001 && scaleY < 0.0001) {
      scaleY = (scaleY >= 0) ? 0.0001 : -0.0001;
    }

    if (skewX != 0.0 || skewY != 0.0) {
      num ma = scaleX * cos(skewY + rotation);
      num mb = scaleX * sin(skewY + rotation);
      num mc = -scaleY * sin(skewX + rotation);
      num md = scaleY * cos(skewX + rotation);
      num mx = _x - _pivotX * ma - _pivotY * mc;
      num my = _y - _pivotX * mb - _pivotY * md;
      matrix.setTo(ma, mb, mc, md, mx, my);
    } else if (rotation != 0.0) {
      num cr = cos(rotation);
      num sr = sin(rotation);
      num ma = scaleX * cr;
      num mb = scaleX * sr;
      num mc = -scaleY * sr;
      num md = scaleY * cr;
      num mx = _x - _pivotX * ma - _pivotY * mc;
      num my = _y - _pivotX * mb - _pivotY * md;
      matrix.setTo(ma, mb, mc, md, mx, my);
    } else {
      num mx = _x - _pivotX * scaleX;
      num my = _y - _pivotY * scaleY;
      matrix.setTo(scaleX, 0.0, 0.0, scaleY, mx, my);
    }
  }

  return _transformationMatrix;
}