82 lines
2.5 KiB
JavaScript
82 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
var Matrix = require('../../../maths/matrix/Matrix.js');
|
|
var matrixAndBoundsPool = require('./utils/matrixAndBoundsPool.js');
|
|
|
|
"use strict";
|
|
function getGlobalBounds(target, skipUpdateTransform, bounds) {
|
|
bounds.clear();
|
|
let parentTransform;
|
|
let pooledMatrix;
|
|
if (target.parent) {
|
|
if (!skipUpdateTransform) {
|
|
pooledMatrix = matrixAndBoundsPool.matrixPool.get().identity();
|
|
parentTransform = updateTransformBackwards(target, pooledMatrix);
|
|
} else {
|
|
parentTransform = target.parent.worldTransform;
|
|
}
|
|
} else {
|
|
parentTransform = Matrix.Matrix.IDENTITY;
|
|
}
|
|
_getGlobalBounds(target, bounds, parentTransform, skipUpdateTransform);
|
|
if (pooledMatrix) {
|
|
matrixAndBoundsPool.matrixPool.return(pooledMatrix);
|
|
}
|
|
if (!bounds.isValid) {
|
|
bounds.set(0, 0, 0, 0);
|
|
}
|
|
return bounds;
|
|
}
|
|
function _getGlobalBounds(target, bounds, parentTransform, skipUpdateTransform) {
|
|
if (!target.visible || !target.measurable)
|
|
return;
|
|
let worldTransform;
|
|
if (!skipUpdateTransform) {
|
|
target.updateLocalTransform();
|
|
worldTransform = matrixAndBoundsPool.matrixPool.get();
|
|
worldTransform.appendFrom(target.localTransform, parentTransform);
|
|
} else {
|
|
worldTransform = target.worldTransform;
|
|
}
|
|
const parentBounds = bounds;
|
|
const preserveBounds = !!target.effects.length;
|
|
if (preserveBounds) {
|
|
bounds = matrixAndBoundsPool.boundsPool.get().clear();
|
|
}
|
|
if (target.boundsArea) {
|
|
bounds.addRect(target.boundsArea, worldTransform);
|
|
} else {
|
|
if (target.addBounds) {
|
|
bounds.matrix = worldTransform;
|
|
target.addBounds(bounds);
|
|
}
|
|
for (let i = 0; i < target.children.length; i++) {
|
|
_getGlobalBounds(target.children[i], bounds, worldTransform, skipUpdateTransform);
|
|
}
|
|
}
|
|
if (preserveBounds) {
|
|
for (let i = 0; i < target.effects.length; i++) {
|
|
target.effects[i].addBounds?.(bounds);
|
|
}
|
|
parentBounds.addBounds(bounds, Matrix.Matrix.IDENTITY);
|
|
matrixAndBoundsPool.boundsPool.return(bounds);
|
|
}
|
|
if (!skipUpdateTransform) {
|
|
matrixAndBoundsPool.matrixPool.return(worldTransform);
|
|
}
|
|
}
|
|
function updateTransformBackwards(target, parentTransform) {
|
|
const parent = target.parent;
|
|
if (parent) {
|
|
updateTransformBackwards(parent, parentTransform);
|
|
parent.updateLocalTransform();
|
|
parentTransform.append(parent.localTransform);
|
|
}
|
|
return parentTransform;
|
|
}
|
|
|
|
exports._getGlobalBounds = _getGlobalBounds;
|
|
exports.getGlobalBounds = getGlobalBounds;
|
|
exports.updateTransformBackwards = updateTransformBackwards;
|
|
//# sourceMappingURL=getGlobalBounds.js.map
|