Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redo coords #4

Open
wants to merge 187 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
187 commits
Select commit Hold shift + click to select a range
bde87b2
perf(): reduce setCoords calls
ShaMan123 Apr 11, 2024
bb54987
invalidate coords
ShaMan123 Apr 11, 2024
0ad5916
groundbreaking no need for setCoords
ShaMan123 Apr 11, 2024
ab95bb4
cleanup
ShaMan123 Apr 11, 2024
a055616
cleanup tests
ShaMan123 Apr 11, 2024
db53c89
fix finally
ShaMan123 Feb 28, 2023
dffbbba
Update ObjectGeometry.ts
ShaMan123 Feb 28, 2023
10f7fc0
Update object_geometry.js
ShaMan123 Feb 28, 2023
75ef680
Update SelectableCanvas.ts
ShaMan123 Feb 28, 2023
6b638b2
Update CHANGELOG.md
ShaMan123 Feb 28, 2023
7401fbf
refactor coords
ShaMan123 Feb 28, 2023
55a01c0
Revert "refactor coords"
ShaMan123 Mar 1, 2023
14d7bf9
Update util.js
ShaMan123 Mar 1, 2023
8b3f894
go
ShaMan123 Mar 1, 2023
a6db4e8
make the test meaning ful
ShaMan123 Mar 1, 2023
b391736
Update InteractiveObject.ts
ShaMan123 Mar 1, 2023
cf0a0cc
mapValues
ShaMan123 Mar 1, 2023
4e8962f
fix!
ShaMan123 Mar 1, 2023
f3db15e
debugging
ShaMan123 Mar 1, 2023
7672ba6
Update ObjectGeometry.ts
ShaMan123 Mar 1, 2023
2a2a80c
major progress
ShaMan123 Mar 1, 2023
6eec687
Update ObjectGeometry.ts
ShaMan123 Mar 1, 2023
8fba5dc
ppp
ShaMan123 Mar 1, 2023
4bc2807
WOW!
ShaMan123 Mar 1, 2023
235d94f
WooOOW
ShaMan123 Mar 1, 2023
0f8243d
CRAZY & not BREAKING!~@@#$#%
ShaMan123 Mar 1, 2023
7ca2325
imports
ShaMan123 Mar 5, 2023
9407fa3
WORKING!
ShaMan123 Mar 6, 2023
38e0272
Update ObjectGeometry.ts
ShaMan123 Mar 6, 2023
a01dbd7
Update matrix.ts
ShaMan123 Mar 6, 2023
e2580a4
fix stroke calc
ShaMan123 Mar 6, 2023
c687d4e
shearing
ShaMan123 Mar 7, 2023
74e75a0
calcBaseChangeMatrix
ShaMan123 Mar 7, 2023
05affb6
Update planeChange.ts
ShaMan123 Mar 7, 2023
0857bbb
progress
ShaMan123 Mar 7, 2023
1e0ad84
progress
ShaMan123 Mar 7, 2023
d43598c
Update InteractiveObject.ts
ShaMan123 Mar 7, 2023
f8dd002
,
ShaMan123 Mar 8, 2023
74c3b98
BBox!
ShaMan123 Mar 8, 2023
91770f6
drawing
ShaMan123 Mar 8, 2023
a6d90d1
rename
ShaMan123 Mar 8, 2023
f38d03c
Update BBox.ts
ShaMan123 Mar 8, 2023
25fc4fa
great
ShaMan123 Mar 8, 2023
584a4f1
contains point
ShaMan123 Mar 8, 2023
1208f81
fixes
ShaMan123 Mar 8, 2023
0449a5c
Update ObjectGeometry.ts
ShaMan123 Mar 8, 2023
60770d4
isOnScreen
ShaMan123 Mar 8, 2023
7c70107
disable tests
ShaMan123 Mar 8, 2023
cfc7cc8
calcViewportBoundaries => getViewportBBox
ShaMan123 Mar 8, 2023
fd710c5
Update CHANGELOG.md
ShaMan123 Mar 8, 2023
728e5ed
checkout
ShaMan123 Mar 8, 2023
6cdae28
calcCornerCoords
ShaMan123 Mar 8, 2023
aefb2f9
refactor oCoords
ShaMan123 Mar 8, 2023
fe40904
getDimensionsVectorForPositioning
ShaMan123 Mar 10, 2023
e6b4d0a
patch caching dimensions
ShaMan123 Mar 10, 2023
a4f23f9
cleanup
ShaMan123 Mar 10, 2023
cae999b
Update Control.ts
ShaMan123 Mar 10, 2023
9c8b05f
fix bbox
ShaMan123 Mar 10, 2023
be58f7f
fabulous!
ShaMan123 Mar 10, 2023
70a3aec
remove old bbox logic
ShaMan123 Mar 10, 2023
f510d78
disable tests
ShaMan123 Mar 10, 2023
e681042
adapt controls - skew yet to be worked on
ShaMan123 Mar 10, 2023
70c2e87
skew initial
ShaMan123 Mar 10, 2023
5610686
skew fix to legacy
ShaMan123 Mar 10, 2023
97db71a
cleanup
ShaMan123 Mar 10, 2023
83810dc
Update BBox.ts
ShaMan123 Mar 10, 2023
65a5eec
origin
ShaMan123 Mar 10, 2023
9e798b2
Update ObjectGeometry.ts
ShaMan123 Mar 11, 2023
2b0f657
fixes
ShaMan123 Mar 11, 2023
ed5028d
major adapt dangerous
ShaMan123 Mar 11, 2023
6a5f53a
canvas bbox + geometry
ShaMan123 Mar 12, 2023
4ff528f
refactor into folder
ShaMan123 Mar 12, 2023
e91a9a5
getCoordsMap => getCoords
ShaMan123 Mar 12, 2023
ec1dcf5
rename
ShaMan123 Mar 12, 2023
82a53d4
docs
ShaMan123 Mar 12, 2023
c92bbea
more origin
ShaMan123 Mar 12, 2023
a370f92
getXY progress
ShaMan123 Mar 13, 2023
423a5ca
Update rotate.ts
ShaMan123 Mar 13, 2023
20b2d29
Update SelectableCanvas.ts
ShaMan123 Mar 13, 2023
2f976d5
fix
ShaMan123 Mar 13, 2023
747f596
ObjectPosition
ShaMan123 Mar 13, 2023
cdca50c
ObjectTransformations
ShaMan123 Mar 13, 2023
d7bf38b
ObjectBBox
ShaMan123 Mar 13, 2023
d71aba1
rm CanvasBBox => rect BBox
ShaMan123 Mar 14, 2023
702ce53
imports
ShaMan123 Mar 14, 2023
530ae98
rotateBy
ShaMan123 Mar 14, 2023
4410b1c
centerTransform props
ShaMan123 Mar 14, 2023
cb9666f
change resolveOriginPoint signature
ShaMan123 Mar 14, 2023
eab4327
Update PlaneBBox.ts
ShaMan123 Mar 14, 2023
36fef02
fix object transforms!!
ShaMan123 Mar 14, 2023
02897f1
Update rotate.ts
ShaMan123 Mar 14, 2023
e0a49ee
cleanup + fix `needsViewportCoords`
ShaMan123 Mar 14, 2023
71a3f81
Update BBox.ts
ShaMan123 Mar 14, 2023
c49282f
transformObjectInPlane
ShaMan123 Mar 14, 2023
db90bc0
Update ObjectTransformations.ts
ShaMan123 Mar 14, 2023
a8c49d2
t
ShaMan123 Mar 14, 2023
802e74b
shearing success
ShaMan123 Mar 15, 2023
fb19651
m
ShaMan123 Mar 15, 2023
f6917b4
shear x stable ish
ShaMan123 Mar 15, 2023
1050d03
shear y stable ish - scaling after?
ShaMan123 Mar 15, 2023
93df8b8
shearby: still buggy
ShaMan123 Mar 15, 2023
c6448eb
shearBy progress
ShaMan123 Mar 15, 2023
97eaa1d
Update planeChange.ts
ShaMan123 Mar 15, 2023
3c6a5ca
shearBy!!
ShaMan123 Mar 15, 2023
3b703d5
shearing!
ShaMan123 Mar 15, 2023
b098c93
ObjectTransfomations is stable
ShaMan123 Mar 15, 2023
afa3192
Update Canvas.ts
ShaMan123 Mar 15, 2023
d2d74c8
Update ObjectBBox.ts
ShaMan123 Mar 15, 2023
8d3b231
shearSidesBy
ShaMan123 Mar 15, 2023
c48de28
make less or more confusing
ShaMan123 Mar 15, 2023
7f352e0
fix transformations in vpt
ShaMan123 Mar 16, 2023
fd8c8e1
getTotalAngle => TRadian
ShaMan123 Mar 17, 2023
c4df018
disable drawing
ShaMan123 Mar 17, 2023
98d670c
fix getXY
ShaMan123 Mar 17, 2023
8ac0e3d
cleanup
ShaMan123 Mar 17, 2023
197dccc
Update rotate.ts
ShaMan123 Mar 17, 2023
18c2d32
cleanup
ShaMan123 Mar 17, 2023
5f45b39
skew progress
ShaMan123 Mar 17, 2023
5b973ee
Update skew.ts
ShaMan123 Mar 17, 2023
d20def3
rotate3D 🤯
ShaMan123 Mar 17, 2023
552b472
Update vectors.ts
ShaMan123 Mar 17, 2023
5680d57
Update ObjectTransformations.ts
ShaMan123 Mar 17, 2023
45e2510
types
ShaMan123 Mar 18, 2023
201ea83
fix
ShaMan123 Mar 18, 2023
519691c
transform origin
ShaMan123 Mar 18, 2023
92f4fc2
Update util.ts
ShaMan123 Mar 18, 2023
67c90cd
remove ObjectPosition
ShaMan123 Mar 18, 2023
b2516c1
strokeBordersLegacy
ShaMan123 Mar 18, 2023
1025ea2
rename getDimensionsVector => getBBoxVector
ShaMan123 Mar 18, 2023
57c5f9b
rm(): scale to size methods
ShaMan123 Mar 18, 2023
d21346c
Update BBox.ts
ShaMan123 Mar 18, 2023
9283753
scaling control working!
ShaMan123 Mar 18, 2023
89ec697
cleanup
ShaMan123 Mar 18, 2023
cd68211
cleanup
ShaMan123 Mar 19, 2023
7803827
disable
ShaMan123 Mar 19, 2023
a9c711a
Update Text.ts
ShaMan123 Mar 19, 2023
9af5ff4
fix(): render connection line in context
ShaMan123 Feb 27, 2023
c971148
Update Control.ts
ShaMan123 Feb 27, 2023
e4d207d
rendering
ShaMan123 Feb 27, 2023
45993d1
cleanup
ShaMan123 Feb 27, 2023
34a4545
restore
ShaMan123 Feb 27, 2023
6735816
Update CHANGELOG.md
ShaMan123 Feb 27, 2023
e03fbf1
make non breaking
ShaMan123 Mar 5, 2023
2896bb7
exec todo: remove backward compat
ShaMan123 Mar 5, 2023
8fcdfd0
Update Control.ts
ShaMan123 Mar 5, 2023
4fedfbc
fix merge conflicts
ShaMan123 Mar 19, 2023
cad33e4
fix scale/scaleBy
ShaMan123 Mar 19, 2023
e525db8
Update vectors.ts
ShaMan123 Mar 19, 2023
1f5386f
scaling isn't there yet
ShaMan123 Mar 19, 2023
c5cdffa
stablizing
ShaMan123 Mar 19, 2023
768c3a3
scale is stable
ShaMan123 Mar 19, 2023
52d4130
flipY connection line
ShaMan123 Mar 19, 2023
89a093a
skew progress
ShaMan123 Mar 20, 2023
a419f90
skewing major progress
ShaMan123 Mar 20, 2023
6d473a0
more progress
ShaMan123 Mar 20, 2023
32fb38a
cleanup
ShaMan123 Mar 20, 2023
557a2ae
resize controls
ShaMan123 Mar 23, 2023
562f9fa
cleanup
ShaMan123 Mar 23, 2023
abda3a1
cleanup
ShaMan123 Mar 23, 2023
6c7e076
disable
ShaMan123 Mar 23, 2023
898bdc7
Update Group.ts
ShaMan123 Mar 23, 2023
0bc28fc
Update ObjectBBox.ts
ShaMan123 Mar 23, 2023
6d42984
fix resize from behind
ShaMan123 Mar 23, 2023
050431e
Update polyControl.ts
ShaMan123 Mar 23, 2023
3d52574
cleanup
ShaMan123 Mar 23, 2023
63acc04
oCoords => controlCoords
ShaMan123 Mar 23, 2023
b59e4f7
fix with skewing
ShaMan123 Mar 23, 2023
ed6c591
move groupSelector logic to viewport
ShaMan123 Mar 23, 2023
aa05642
Update src/brushes/PatternBrush.ts
ShaMan123 Mar 23, 2023
f6b0887
stop using `calcTransformMatrix(skipGroup)`
ShaMan123 Mar 25, 2023
d799d88
cleanup
ShaMan123 Mar 25, 2023
7339f84
fix: transform caching issue
ShaMan123 Mar 25, 2023
cae260d
Update SelectableCanvas.ts
ShaMan123 Mar 25, 2023
1193aa0
Update Group.ts
ShaMan123 Mar 25, 2023
de3e88d
perf
ShaMan123 Mar 25, 2023
055414c
fix: transform caching issue
ShaMan123 Mar 25, 2023
1c31fc6
disable matrix cache
ShaMan123 Mar 25, 2023
8b28eb6
scale signature
ShaMan123 Mar 25, 2023
db139ac
rename
ShaMan123 Mar 25, 2023
87626eb
Update controls_handlers.js
ShaMan123 Mar 25, 2023
d0c6bc5
fix tests
ShaMan123 Mar 25, 2023
a7a4872
fix(): padding
ShaMan123 Mar 25, 2023
4ff7b4c
cleanup
ShaMan123 Mar 26, 2023
2523995
merge artifacts
ShaMan123 Sep 19, 2023
5432f1c
lint + fix more merge artifacts
ShaMan123 Sep 19, 2023
d58dc9a
more merge fixes
ShaMan123 Sep 19, 2023
852f2eb
shadow geometry WIP
ShaMan123 May 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,16 @@
- fix(IText): layout change regression caused by #8663 (`text` was changed but layout was skipped) [#8711](https://github.com/fabricjs/fabric.js/pull/8711)
- fix(IText, Textbox): fix broken text input [#8775](https://github.com/fabricjs/fabric.js/pull/8775)
- ci(): `.codesandbox` [#8135](https://github.com/fabricjs/fabric.js/pull/8135)
- fix(): redo object geometry [#8767](https://github.com/fabricjs/fabric.js/pull/8767)
- ci(): disallow circular deps [#8759](https://github.com/fabricjs/fabric.js/pull/8759)
- fix(): env WebGL import cycle [#8758](https://github.com/fabricjs/fabric.js/pull/8758)
- chore(TS): remove controls from prototype. BREAKING: controls aren't shared anymore [#8753](https://github.com/fabricjs/fabric.js/pull/8753)
- chore(TS): remove object `type` from prototype [#8714](https://github.com/fabricjs/fabric.js/pull/8714)
- chore(TS): type Object props [#8677](https://github.com/fabricjs/fabric.js/issues/8677)
- fix(Geometry): `_getCoords` not respecting group [#8747](https://github.com/fabricjs/fabric.js/issues/8747)
- chore(TS): remove default values from filter prototypes [#8742](https://github.com/fabricjs/fabric.js/issues/8742)
- refactor(): Control connection rendering [#8745](https://github.com/fabricjs/fabric.js/issues/8745)
**BREAKING**: `Control#render` method signature
- chore(TS): remove default values from Objects prototypes, ( filters in a followup ) [#8719](https://github.com/fabricjs/fabric.js/issues/8719)
- fix(Intersection): bug causing selection edge case [#8735](https://github.com/fabricjs/fabric.js/pull/8735)
- chore(TS): class interface for options/brevity [#8674](https://github.com/fabricjs/fabric.js/issues/8674)
Expand Down
1 change: 0 additions & 1 deletion e2e/tests/controls/hit-regions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ beforeAll((canvas) => {
});
canvas.add(group);
canvas.centerObject(group);
group.setCoords();
canvas.setActiveObject(rect);
canvas.renderAll();
return { rect, group };
Expand Down
2 changes: 1 addition & 1 deletion e2e/utils/ObjectUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export class ObjectUtil<T extends FabricObject = FabricObject> {

getObjectControlPoint(controlName: string) {
return this.executeInBrowser(
(object, { controlName }) => object.oCoords[controlName],
(object, { controlName }) => object.getControlCoords()[controlName],
{ controlName }
);
}
Expand Down
12 changes: 6 additions & 6 deletions lib/aligning_guidelines.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectTop + activeObjectHeight / 2 + aligningLineOffset)
: (activeObjectTop - activeObjectHeight / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(objectLeft, activeObjectTop), 'center', 'center');
activeObject.setXY(new fabric.Point(objectLeft, activeObjectTop), 'center', 'center');
}

// snap by the left edge
Expand All @@ -116,7 +116,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectTop + activeObjectHeight / 2 + aligningLineOffset)
: (activeObjectTop - activeObjectHeight / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop), 'center', 'center');
activeObject.setXY(new fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop), 'center', 'center');
}

// snap by the right edge
Expand All @@ -131,7 +131,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectTop + activeObjectHeight / 2 + aligningLineOffset)
: (activeObjectTop - activeObjectHeight / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop), 'center', 'center');
activeObject.setXY(new fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop), 'center', 'center');
}

// snap by the vertical center line
Expand All @@ -146,7 +146,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset)
: (activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(activeObjectLeft, objectTop), 'center', 'center');
activeObject.setXY(new fabric.Point(activeObjectLeft, objectTop), 'center', 'center');
}

// snap by the top edge
Expand All @@ -161,7 +161,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset)
: (activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2), 'center', 'center');
activeObject.setXY(new fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2), 'center', 'center');
}

// snap by the bottom edge
Expand All @@ -176,7 +176,7 @@ function initAligningGuidelines(canvas) {
? (activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset)
: (activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset)
});
activeObject.setPositionByOrigin(new fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2), 'center', 'center');
activeObject.setXY(new fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2), 'center', 'center');
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/centering_guidelines.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ function initCenteringGuidelines(canvas) {
isInHorizontalCenter = Math.round(objectCenter.y) in canvasHeightCenterMap;

if (isInHorizontalCenter || isInVerticalCenter) {
object.setPositionByOrigin(new fabric.Point((isInVerticalCenter ? canvasWidthCenter : objectCenter.x), (isInHorizontalCenter ? canvasHeightCenter : objectCenter.y)), 'center', 'center');
object.setXY(new fabric.Point((isInVerticalCenter ? canvasWidthCenter : objectCenter.x), (isInHorizontalCenter ? canvasHeightCenter : objectCenter.y)), 'center', 'center');
}
});

Expand Down
176 changes: 176 additions & 0 deletions src/BBox/BBox.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import { iMatrix } from '../constants';
import { Point } from '../Point';
import type { ObjectBBox } from '../shapes/Object/ObjectBBox';
import type { TMat2D } from '../typedefs';
import { mapValues } from '../util/internals';
import { makeBoundingBoxFromPoints } from '../util/misc/boundingBoxFromPoints';
import {
calcBaseChangeMatrix,
sendPointToPlane,
} from '../util/misc/planeChange';
import { radiansToDegrees } from '../util/misc/radiansDegreesConversion';
import { createVector } from '../util/misc/vectors';
import type { ViewportBBoxPlanes } from './ViewportBBox';
import { ViewportBBox } from './ViewportBBox';

export interface BBoxPlanes extends ViewportBBoxPlanes {
parent(): TMat2D;
self(): TMat2D;
}

export class BBox extends ViewportBBox {
protected declare readonly planes: BBoxPlanes;

protected constructor(transform: TMat2D, planes: BBoxPlanes) {
super(transform, planes);
}

/**
* Use this to operate on the object's own transformation.\
* Used to position the object in the relative plane
*/
sendToParent() {
return this.sendToPlane(this.planes.parent());
}

/**
* Use this to operate in a transform-less plane
*
* e.g.
* {@link getBBox} will return the following:
*
* ```js
* let w = object.width;
* let h = object.height;
* let s = object.strokeWidth;
* let sx, sy, px, py; // non linear stroke/padding factors transformed back to the object plane
* ```
*
* | case | left | top | width | height |
* | --- | --- | --- | --- | --- |
* | no `stroke`/`padding` | `-w / 2` | `-h / 2` | `w` | `h` |
* | `strokeUniform = false` | `-w / 2 - s` | `-h / 2 - s` | `w + s * 2` | `h + s * 2` |
* | `strokeUniform = true || padding` | `-w / 2 - sx` | `-h / 2 - sy` | `w + sx * 2` | `h + sy * 2` |
*
*/
sendToSelf() {
return this.sendToPlane(this.planes.self());
}

static getViewportCoords(target: ObjectBBox) {
const coords = target.calcCoords();
if (target.needsViewportCoords()) {
return coords;
} else {
const vpt = target.getViewportTransform();
return mapValues(coords, (coord) => sendPointToPlane(coord, vpt));
}
}

static getPlanes(target: ObjectBBox): BBoxPlanes {
const self = target.calcTransformMatrix();
const parent = target.group?.calcTransformMatrix() || iMatrix;
const viewport = target.getViewportTransform();
return {
self() {
return self;
},
parent() {
return parent;
},
viewport() {
return viewport;
},
};
}

static bbox(target: ObjectBBox) {
const coords = this.getViewportCoords(target);
const bbox = makeBoundingBoxFromPoints(Object.values(coords));
const transform = calcBaseChangeMatrix(
undefined,
[new Point(bbox.width, 0), new Point(0, bbox.height)],
coords.tl.midPointFrom(coords.br)
);
return new this(transform, this.getPlanes(target));
}

/**
*
* @param target
* @returns the bbox that respects rotation and flipping
*/
static rotated(target: ObjectBBox) {
const coords = this.getViewportCoords(target);
const rotation = this.calcRotation(coords);
const center = coords.tl.midPointFrom(coords.br);
const bbox = makeBoundingBoxFromPoints(
Object.values(coords).map((coord) => coord.rotate(-rotation.x, center))
);
const transform = calcBaseChangeMatrix(
undefined,
[
// flipX/Y are taken into consideration in `rotation`
new Point(bbox.width, 0).rotate(rotation.x),
new Point(0, bbox.height).rotate(rotation.y),
],
center
);
return new this(transform, this.getPlanes(target));
}

static legacy(target: ObjectBBox) {
const coords = this.getViewportCoords(target);
const rotation = this.calcRotation(coords);
const center = coords.tl.midPointFrom(coords.br);
const viewportBBox = makeBoundingBoxFromPoints(Object.values(coords));
const rotatedBBox = makeBoundingBoxFromPoints(
Object.values(coords).map((coord) => coord.rotate(-rotation.x, center))
);
const bboxTransform = calcBaseChangeMatrix(
undefined,
[
new Point(rotatedBBox.width / viewportBBox.width, 0),
new Point(0, rotatedBBox.height / viewportBBox.height),
],
center
);
const legacyCoords = mapValues(coords, (coord) =>
coord.transform(bboxTransform)
);
const legacyBBox = makeBoundingBoxFromPoints(Object.values(legacyCoords));
const transform = calcBaseChangeMatrix(
undefined,
[new Point(1, 0).rotate(rotation.x), new Point(0, 1).rotate(rotation.y)],
center
);
return {
angle: radiansToDegrees(rotation.x),
getCoords() {
return legacyCoords;
},
getTransformation() {
return transform;
},
getBBox() {
return legacyBBox;
},
getBBoxVector() {
return new Point(legacyBBox.width, legacyBBox.height);
},
transform(ctx: CanvasRenderingContext2D) {
ctx.transform(...transform);
},
};
}

static transformed(target: ObjectBBox) {
const coords = this.getViewportCoords(target);
const transform = calcBaseChangeMatrix(
undefined,
[createVector(coords.tl, coords.tr), createVector(coords.tl, coords.bl)],
coords.tl.midPointFrom(coords.br)
);
return new this(transform, this.getPlanes(target));
}
}
41 changes: 41 additions & 0 deletions src/BBox/OwnBBox.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { iMatrix } from '../constants';
import type { ObjectBBox } from '../shapes/Object/ObjectBBox';
import type { TMat2D } from '../typedefs';
import { mapValues } from '../util/internals';
import { multiplyTransformMatrices } from '../util/misc/matrix';
import { sendPointToPlane } from '../util/misc/planeChange';
import type { BBoxPlanes } from './BBox';
import { BBox } from './BBox';

/**
* Performance optimization
*/
export class OwnBBox extends BBox {
constructor(transform: TMat2D, planes: BBoxPlanes) {
super(transform, planes);
}

getCoords() {
const from = multiplyTransformMatrices(
this.planes.viewport(),
this.planes.self()
);
return mapValues(super.getCoords(), (coord) =>
sendPointToPlane(coord, from)
);
}

static getPlanes(target: ObjectBBox): BBoxPlanes {
return {
self() {
return target.calcTransformMatrix();
},
parent() {
return target.group?.calcTransformMatrix() || iMatrix;
},
viewport() {
return target.getViewportTransform();
},
};
}
}
Loading
Loading