@wcardinal/wcardinal-geditor
Version:
WebGL-based graphic editor, tester and viewer for supervisory systems
114 lines • 4.24 kB
JavaScript
/*
* Copyright (C) 2019 Toshiba Corporation
* SPDX-License-Identifier: Apache-2.0
*/
import { EShapeBase, EShapeCapability, EShapeEditor, EShapeLockPart, toSizeNormalized } from "@wcardinal/wcardinal-ui";
var UtilShapeTransforms = /** @class */ (function () {
function UtilShapeTransforms() {
}
UtilShapeTransforms.prepare = function (shape) {
var editor = shape.editor;
if (editor == null) {
editor = new EShapeEditor();
shape.editor = editor;
}
// Transform
shape.updateTransform();
var parent = shape.parent;
if (parent instanceof EShapeBase) {
parent.transform.internalTransform
.copyTo(editor.internalTransformParentInverse)
.invert();
}
else {
editor.internalTransformParentInverse.identity();
}
shape.transform.internalTransform.copyTo(editor.internalTransform);
// Rotation
editor.rotation = shape.transform.rotation;
// Size
editor.size.copyFrom(shape.size);
//
shape.lock(EShapeLockPart.TRANSFORM_CHILD);
};
UtilShapeTransforms.finalize = function (shape) {
shape.unlock(EShapeLockPart.TRANSFORM_CHILD, true);
};
UtilShapeTransforms.apply = function (shape, transform, capability) {
var editor = shape.editor;
if (editor != null) {
var newLocalTransform = editor.localTransform;
editor.internalTransformParentInverse
.copyTo(newLocalTransform)
.append(transform)
.append(editor.internalTransform);
this.applyLocal(shape, newLocalTransform, capability, editor.size);
}
};
UtilShapeTransforms.applyLocal = function (shape, localTransform, capability, size) {
// Reconstruct the position, the rotation and the size
var a = localTransform.a;
var b = localTransform.b;
var c = localTransform.c;
var d = localTransform.d;
var tx = localTransform.tx;
var ty = localTransform.ty;
shape.lock(EShapeLockPart.UPLOADED);
// Transform
var transform = shape.transform;
// Capability
var cposition = !!(capability & EShapeCapability.POSITION);
var crotation = !!(capability & EShapeCapability.ROTATION);
var cskew = !!(capability & EShapeCapability.SKEW);
var cwidth = !!(capability & EShapeCapability.WIDTH);
var cheight = !!(capability & EShapeCapability.HEIGHT);
// Rotation and skew
if (crotation || cskew) {
// Rotation
var rx = Math.atan2(-c, d); // rotation - skewX
var ry = Math.atan2(+b, a); // rotation + skewY
if (crotation) {
transform.rotation = (rx + ry) * 0.5; // Here, assumes `skewX` === `skewY`
}
// Skew
if (cskew) {
var skew = (ry - rx) * 0.5;
transform.skew.set(skew, skew);
}
}
// Position
if (cposition) {
// Assumes the pivot is invariant.
// tx = position.x - (a * px + c * py)
// ty = position.y - (b * px + d * py)
//
// Thus,
// position.x = tx + (a * px + c * py)
// position.y = ty + (b * px + d * py)
var pivot = transform.pivot;
var px = pivot.x;
var py = pivot.y;
transform.position.set(tx + (a * px + c * py), ty + (b * px + d * py));
}
// Scale
if (size != null && (cwidth || cheight)) {
var w = toSizeNormalized(size.x * Math.sqrt(a * a + b * b));
var h = toSizeNormalized(size.y * Math.sqrt(c * c + d * d));
var s = shape.size;
if (cwidth && cheight) {
s.set(w, h);
}
else if (cwidth) {
s.x = w;
}
else {
s.y = h;
}
}
//
shape.unlock(EShapeLockPart.UPLOADED, true);
};
return UtilShapeTransforms;
}());
export { UtilShapeTransforms };
//# sourceMappingURL=util-shape-transforms.js.map