in skiko/src/commonMain/cpp/common/node/RenderNode.cpp [269:304]
void RenderNode::updateMatrix() {
if (!this->matrixDirty) {
return;
}
float pivotX, pivotY;
if (this->pivot.isFinite()) {
pivotX = this->pivot.fX;
pivotY = this->pivot.fY;
} else {
pivotX = this->bounds.width() / 2.0f;
pivotY = this->bounds.height() / 2.0f;
}
this->transformMatrix.reset();
if (isZero(this->rotationX) && isZero(this->rotationY)) {
this->transformMatrix.setTranslate(this->translationX, this->translationY);
this->transformMatrix.preRotate(this->rotationZ, pivotX, pivotY);
this->transformMatrix.preScale(this->scaleX, this->scaleY, pivotX, pivotY);
} else {
this->transformMatrix.preScale(this->scaleX, this->scaleY, pivotX, pivotY);
SkM44 transform3D;
transform3D.preConcat(SkM44::Rotate({1, 0, 0}, -this->rotationX * SK_ScalarPI / 180));
transform3D.preConcat(SkM44::Rotate({0,-1, 0}, -this->rotationY * SK_ScalarPI / 180));
transform3D.preConcat(SkM44::Rotate({0, 0, 1}, -this->rotationZ * SK_ScalarPI / 180));
SkPatch3D patch3D;
patch3D.transform(transform3D);
SkMatrix transform;
this->transformCamera.patchToMatrix(patch3D, &transform);
transform.preTranslate(-pivotX, -pivotY);
transform.postTranslate(pivotX + this->translationX, pivotY + this->translationY);
this->transformMatrix.postConcat(transform);
}
this->matrixDirty = false;
this->matrixIdentity = this->transformMatrix.isIdentity();
}