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 #8767

Closed
wants to merge 220 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
220 commits
Select commit Hold shift + click to select a range
7e65dad
fix(): render connection line in context
ShaMan123 Feb 27, 2023
bb2f8e6
Update Control.ts
ShaMan123 Feb 27, 2023
d3863fd
rendering
ShaMan123 Feb 27, 2023
29d08e9
fix
ShaMan123 Feb 27, 2023
10900c8
cleanup
ShaMan123 Feb 27, 2023
68f0008
restore
ShaMan123 Feb 27, 2023
ca00a3c
restore
ShaMan123 Feb 27, 2023
073b50f
Update CHANGELOG.md
ShaMan123 Feb 27, 2023
76691b0
restore
ShaMan123 Feb 27, 2023
ce2ef9e
fix `isContainedWithinObject` under group
ShaMan123 Feb 28, 2023
c9e7772
fix finally
ShaMan123 Feb 28, 2023
fa501da
Update ObjectGeometry.ts
ShaMan123 Feb 28, 2023
b2da410
Update object_geometry.js
ShaMan123 Feb 28, 2023
e1f6edd
cleanup
ShaMan123 Feb 28, 2023
c670ca7
Update SelectableCanvas.ts
ShaMan123 Feb 28, 2023
e862589
lint
ShaMan123 Feb 28, 2023
8e27a40
Update CHANGELOG.md
ShaMan123 Feb 28, 2023
dd7c1b9
refactor coords
ShaMan123 Feb 28, 2023
eea85fe
Revert "refactor coords"
ShaMan123 Mar 1, 2023
4f0fd27
Update util.js
ShaMan123 Mar 1, 2023
30c989d
go
ShaMan123 Mar 1, 2023
7e21549
Update util.js
ShaMan123 Mar 1, 2023
b781913
make the test meaning ful
ShaMan123 Mar 1, 2023
b980b5b
Update InteractiveObject.ts
ShaMan123 Mar 1, 2023
c399332
refctor planeChange
ShaMan123 Mar 1, 2023
560d603
mapValues
ShaMan123 Mar 1, 2023
ec142a3
`sendPointToPlane` test
ShaMan123 Mar 1, 2023
830e68a
fix!
ShaMan123 Mar 1, 2023
0e58b91
done todo
ShaMan123 Mar 1, 2023
043a9af
debugging
ShaMan123 Mar 1, 2023
9fa50e1
Update ObjectGeometry.ts
ShaMan123 Mar 1, 2023
32a5528
major progress
ShaMan123 Mar 1, 2023
08feb27
Update ObjectGeometry.ts
ShaMan123 Mar 1, 2023
63968d5
ppp
ShaMan123 Mar 1, 2023
9338a8d
WOW!
ShaMan123 Mar 1, 2023
434c6fc
WooOOW
ShaMan123 Mar 1, 2023
def498a
CRAZY & not BREAKING!~@@#$#%
ShaMan123 Mar 1, 2023
33233da
Merge branch 'master' into control-connection-rendering
asturur Mar 4, 2023
750c5c4
fix(): flipping!!
ShaMan123 Mar 5, 2023
00a2050
imports
ShaMan123 Mar 5, 2023
6890c20
make non breaking
ShaMan123 Mar 5, 2023
63f4206
Merge branch 'master' into control-connection-rendering
ShaMan123 Mar 5, 2023
c3201c0
exec todo: remove backward compat
ShaMan123 Mar 5, 2023
fd46e5d
Update Control.ts
ShaMan123 Mar 5, 2023
e7aac03
Update polyControl.ts
ShaMan123 Mar 6, 2023
bd96b2d
WORKING!
ShaMan123 Mar 6, 2023
eb20a9b
Update ObjectGeometry.ts
ShaMan123 Mar 6, 2023
6e15280
Update matrix.ts
ShaMan123 Mar 6, 2023
9960f10
fix stroke calc
ShaMan123 Mar 6, 2023
a0da905
shearing
ShaMan123 Mar 7, 2023
4a3f04c
calcBaseChangeMatrix
ShaMan123 Mar 7, 2023
c6788c9
Update planeChange.ts
ShaMan123 Mar 7, 2023
978a5f0
progress
ShaMan123 Mar 7, 2023
ce057b2
progress
ShaMan123 Mar 7, 2023
47f2e85
Update InteractiveObject.ts
ShaMan123 Mar 7, 2023
29b7196
Merge branch 'master' into redo-coords
ShaMan123 Mar 7, 2023
79398c2
,
ShaMan123 Mar 8, 2023
374784d
BBox!
ShaMan123 Mar 8, 2023
d40de93
drawing
ShaMan123 Mar 8, 2023
928fff9
rename
ShaMan123 Mar 8, 2023
dd9d011
Update BBox.ts
ShaMan123 Mar 8, 2023
22636ac
Update InteractiveObject.ts
ShaMan123 Mar 8, 2023
8e2bbad
great
ShaMan123 Mar 8, 2023
74ef4a4
Update Object.ts
ShaMan123 Mar 8, 2023
659e2bf
contains point
ShaMan123 Mar 8, 2023
e149470
fixes
ShaMan123 Mar 8, 2023
6936575
Update ObjectGeometry.ts
ShaMan123 Mar 8, 2023
5e86d38
isOnScreen
ShaMan123 Mar 8, 2023
2a0c9e0
disable tests
ShaMan123 Mar 8, 2023
739fe72
calcViewportBoundaries => getViewportBBox
ShaMan123 Mar 8, 2023
66bf21d
Update CHANGELOG.md
ShaMan123 Mar 8, 2023
69611b8
checkout
ShaMan123 Mar 8, 2023
89b823c
calcCornerCoords
ShaMan123 Mar 8, 2023
14c184a
refactor oCoords
ShaMan123 Mar 8, 2023
4129b4f
Update Control.ts
ShaMan123 Mar 8, 2023
73a72e8
getDimensionsVectorForPositioning
ShaMan123 Mar 10, 2023
aab1d77
patch caching dimensions
ShaMan123 Mar 10, 2023
33b1b5e
cleanup
ShaMan123 Mar 10, 2023
994e283
Update Control.ts
ShaMan123 Mar 10, 2023
792faae
Update planeChange.ts
ShaMan123 Mar 10, 2023
486ec34
fix bbox
ShaMan123 Mar 10, 2023
a5366b1
fabulous!
ShaMan123 Mar 10, 2023
f2e4b9a
remove old bbox logic
ShaMan123 Mar 10, 2023
6ae9ef2
disable tests
ShaMan123 Mar 10, 2023
df00dd6
adapt controls - skew yet to be worked on
ShaMan123 Mar 10, 2023
bea3c22
skew initial
ShaMan123 Mar 10, 2023
3ceb00c
skew fix to legacy
ShaMan123 Mar 10, 2023
da0a18a
cleanup
ShaMan123 Mar 10, 2023
6d10560
Update BBox.ts
ShaMan123 Mar 10, 2023
185d061
origin
ShaMan123 Mar 10, 2023
e193066
Update ObjectGeometry.ts
ShaMan123 Mar 11, 2023
a1be589
fixes
ShaMan123 Mar 11, 2023
bad9093
major adapt dangerous
ShaMan123 Mar 11, 2023
de72da3
canvas bbox + geometry
ShaMan123 Mar 12, 2023
17de633
refactor into folder
ShaMan123 Mar 12, 2023
a41991d
getCoordsMap => getCoords
ShaMan123 Mar 12, 2023
87aba0c
rename
ShaMan123 Mar 12, 2023
5de865f
docs
ShaMan123 Mar 12, 2023
f1b2971
more origin
ShaMan123 Mar 12, 2023
bedbb74
getXY progress
ShaMan123 Mar 13, 2023
51c16a1
Update rotate.ts
ShaMan123 Mar 13, 2023
2bf1702
Update SelectableCanvas.ts
ShaMan123 Mar 13, 2023
815d849
fix
ShaMan123 Mar 13, 2023
9327fc3
ObjectPosition
ShaMan123 Mar 13, 2023
94a6b2c
ObjectTransformations
ShaMan123 Mar 13, 2023
04fafdb
ObjectBBox
ShaMan123 Mar 13, 2023
b581979
Merge branch 'master' into redo-coords
ShaMan123 Mar 13, 2023
a61374f
Merge branch 'master' into redo-coords
ShaMan123 Mar 14, 2023
61faa84
rm CanvasBBox => rect BBox
ShaMan123 Mar 14, 2023
e280737
imports
ShaMan123 Mar 14, 2023
12db471
rotateBy
ShaMan123 Mar 14, 2023
01a93e2
centerTransform props
ShaMan123 Mar 14, 2023
a7daa86
change resolveOriginPoint signature
ShaMan123 Mar 14, 2023
f1416fa
Update PlaneBBox.ts
ShaMan123 Mar 14, 2023
659101d
fix object transforms!!
ShaMan123 Mar 14, 2023
1237515
Update rotate.ts
ShaMan123 Mar 14, 2023
7376986
cleanup + fix `needsViewportCoords`
ShaMan123 Mar 14, 2023
521fcee
Update BBox.ts
ShaMan123 Mar 14, 2023
5193109
transformObjectInPlane
ShaMan123 Mar 14, 2023
7976c70
Update ObjectTransformations.ts
ShaMan123 Mar 14, 2023
5465e65
t
ShaMan123 Mar 14, 2023
ea6b886
shearing success
ShaMan123 Mar 15, 2023
b61d876
m
ShaMan123 Mar 15, 2023
0259b2e
shear x stable ish
ShaMan123 Mar 15, 2023
2ec47c2
shear y stable ish - scaling after?
ShaMan123 Mar 15, 2023
ed83774
shearby: still buggy
ShaMan123 Mar 15, 2023
9e4a279
shearBy progress
ShaMan123 Mar 15, 2023
0d2c172
Update planeChange.ts
ShaMan123 Mar 15, 2023
9a924a9
shearBy!!
ShaMan123 Mar 15, 2023
0490e27
shearing!
ShaMan123 Mar 15, 2023
a7ba741
ObjectTransfomations is stable
ShaMan123 Mar 15, 2023
0abfb94
Update Canvas.ts
ShaMan123 Mar 15, 2023
a38994a
Update ObjectBBox.ts
ShaMan123 Mar 15, 2023
f96cf52
Update StackedObject.ts
ShaMan123 Mar 15, 2023
659fdcf
shearSidesBy
ShaMan123 Mar 15, 2023
53ed0e0
make less or more confusing
ShaMan123 Mar 15, 2023
893161f
fix transformations in vpt
ShaMan123 Mar 16, 2023
17554cb
getTotalAngle => TRadian
ShaMan123 Mar 17, 2023
91c7b51
disable drawing
ShaMan123 Mar 17, 2023
0a4bac7
fix getXY
ShaMan123 Mar 17, 2023
2f48488
cleanup
ShaMan123 Mar 17, 2023
697d999
Update rotate.ts
ShaMan123 Mar 17, 2023
a48b458
cleanup
ShaMan123 Mar 17, 2023
a1df1e6
Merge branch 'master' into redo-coords
ShaMan123 Mar 17, 2023
4668242
skew progress
ShaMan123 Mar 17, 2023
366dbc9
Update skew.ts
ShaMan123 Mar 17, 2023
35dcc11
rotate3D 🤯
ShaMan123 Mar 17, 2023
1efdeca
Update vectors.ts
ShaMan123 Mar 17, 2023
3816fff
Update ObjectTransformations.ts
ShaMan123 Mar 17, 2023
76819c0
types
ShaMan123 Mar 18, 2023
60797cc
fix
ShaMan123 Mar 18, 2023
47a6809
transform origin
ShaMan123 Mar 18, 2023
57b4843
Update util.ts
ShaMan123 Mar 18, 2023
e75989e
remove ObjectPosition
ShaMan123 Mar 18, 2023
edee097
strokeBordersLegacy
ShaMan123 Mar 18, 2023
2d84ab2
rename getDimensionsVector => getBBoxVector
ShaMan123 Mar 18, 2023
904f379
rm(): scale to size methods
ShaMan123 Mar 18, 2023
7804378
Update BBox.ts
ShaMan123 Mar 18, 2023
93534a9
scaling control working!
ShaMan123 Mar 18, 2023
e64387a
cleanup
ShaMan123 Mar 18, 2023
d50a203
Merge branch 'master' into redo-coords
ShaMan123 Mar 18, 2023
e8b4d50
cleanup
ShaMan123 Mar 19, 2023
102428a
disable
ShaMan123 Mar 19, 2023
c30af2b
Update Text.ts
ShaMan123 Mar 19, 2023
410486d
Update EventTypeDefs.ts
ShaMan123 Mar 19, 2023
5a73f99
Merge branch 'master' into control-connection-rendering
ShaMan123 Mar 19, 2023
e7faf79
Merge branch 'control-connection-rendering' into redo-coords
ShaMan123 Mar 19, 2023
3e5188e
fix merge conflicts
ShaMan123 Mar 19, 2023
5465462
fix scale/scaleBy
ShaMan123 Mar 19, 2023
95bb5eb
Update vectors.ts
ShaMan123 Mar 19, 2023
b8775a6
scaling isn't there yet
ShaMan123 Mar 19, 2023
6c36773
stablizing
ShaMan123 Mar 19, 2023
37d76d6
scale is stable
ShaMan123 Mar 19, 2023
c07ab92
Merge branch 'master' into redo-coords
ShaMan123 Mar 19, 2023
b367d21
flipY connection line
ShaMan123 Mar 19, 2023
b1b06fc
skew progress
ShaMan123 Mar 20, 2023
4ae4f14
skewing major progress
ShaMan123 Mar 20, 2023
d378092
more progress
ShaMan123 Mar 20, 2023
8fb484b
cleanup
ShaMan123 Mar 20, 2023
8f6108d
resize controls
ShaMan123 Mar 23, 2023
f42a197
cleanup
ShaMan123 Mar 23, 2023
3b02db0
cleanup
ShaMan123 Mar 23, 2023
a8e6df7
disable
ShaMan123 Mar 23, 2023
688d78a
Update Group.ts
ShaMan123 Mar 23, 2023
cee0b24
Update ObjectBBox.ts
ShaMan123 Mar 23, 2023
207f29d
fix resize from behind
ShaMan123 Mar 23, 2023
4449f8a
Update polyControl.ts
ShaMan123 Mar 23, 2023
b3bbe7a
cleanup
ShaMan123 Mar 23, 2023
34a0471
rm `_normalizePointer`
ShaMan123 Mar 23, 2023
b79bda8
rm `restorePointerVpt`
ShaMan123 Mar 23, 2023
8a965da
oCoords => controlCoords
ShaMan123 Mar 23, 2023
a5e6879
imports
ShaMan123 Mar 23, 2023
fa945b9
fix with skewing
ShaMan123 Mar 23, 2023
5e32e52
Update SelectableCanvas.ts
ShaMan123 Mar 23, 2023
f13ae49
move groupSelector logic to viewport
ShaMan123 Mar 23, 2023
5a0ed64
Update src/brushes/PatternBrush.ts
ShaMan123 Mar 23, 2023
cab736b
stop using `calcTransformMatrix(skipGroup)`
ShaMan123 Mar 25, 2023
89ed92c
cleanup
ShaMan123 Mar 25, 2023
03ce915
fix: transform caching issue
ShaMan123 Mar 25, 2023
7b9fe7e
Update ObjectLayout.ts
ShaMan123 Mar 25, 2023
8d0765c
type group
ShaMan123 Mar 25, 2023
811b6da
Update SelectableCanvas.ts
ShaMan123 Mar 25, 2023
62ffbdf
Update Group.ts
ShaMan123 Mar 25, 2023
857e8e1
perf
ShaMan123 Mar 25, 2023
9f47084
fix(): keep watching selected children
ShaMan123 Mar 25, 2023
5bb9feb
fix: transform caching issue
ShaMan123 Mar 25, 2023
6dded07
disable matrix cache
ShaMan123 Mar 25, 2023
548932a
scale signature
ShaMan123 Mar 25, 2023
14c30f8
rename
ShaMan123 Mar 25, 2023
b2ceee9
Update controls_handlers.js
ShaMan123 Mar 25, 2023
0c95269
fix tests
ShaMan123 Mar 25, 2023
59e3546
fix(): padding
ShaMan123 Mar 25, 2023
bb3983d
cleanup
ShaMan123 Mar 26, 2023
cb74ad2
Squashed commit of the following:
ShaMan123 Mar 26, 2023
e4847c7
remove `fromSVG`
ShaMan123 Apr 29, 2023
a4c0f62
patch(): `Control#shouldActivate`
ShaMan123 May 19, 2023
bd8fca0
Merge branch 'master' into redo-coords
ShaMan123 Sep 19, 2023
ada6bd9
merge artifacts
ShaMan123 Sep 19, 2023
704c307
lint + fix more merge artifacts
ShaMan123 Sep 19, 2023
a759265
more merge fixes
ShaMan123 Sep 19, 2023
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

## [next]

- fix(): redo object geometry [#8767](https://github.com/fabricjs/fabric.js/pull/8767)
- refactor(): Control connection rendering moved to control [#8745](https://github.com/fabricjs/fabric.js/issues/8745)
- chore(TS): Group types [#8807](https://github.com/fabricjs/fabric.js/pull/8807)
- fix(IText): cursor width under group [#9341](https://github.com/fabricjs/fabric.js/pull/9341)
- TS(Canvas): constructor optional el [#9348](https://github.com/fabricjs/fabric.js/pull/9348)

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