Skip to content

Commit 1601b40

Browse files
committed
🦄 refactor: add the transform property to SnapResult
1 parent 37ab558 commit 1601b40

File tree

14 files changed

+51
-30
lines changed

14 files changed

+51
-30
lines changed

packages/chili-core/src/shape/meshData.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// See LICENSE file in the project root for full license information.
33

44
import { VisualConfig } from "../config";
5-
import { XYZ } from "../math";
5+
import { Matrix4, XYZ } from "../math";
66
import { Serializer } from "../serialize";
77
import { LineType } from "./lineType";
88
import { ISubShape } from "./shape";
@@ -78,6 +78,7 @@ export interface ShapeMeshRange {
7878
start: number;
7979
count: number;
8080
shape: ISubShape;
81+
transform?: Matrix4;
8182
}
8283

8384
export interface ShapeMeshData {
@@ -147,6 +148,7 @@ export namespace EdgeMeshData {
147148
start: range.start + data.position.length / 3,
148149
count: range.count,
149150
shape: range.shape,
151+
transform: range.transform,
150152
};
151153
});
152154
return {
@@ -173,6 +175,7 @@ export namespace FaceMeshData {
173175
start: range.start + data.position.length / 3,
174176
count: range.count,
175177
shape: range.shape,
178+
transform: range.transform,
176179
};
177180
});
178181
const groups = other.groups.map((group) => {
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
// Part of the Chili3d Project, under the AGPL-3.0 License.
22
// See LICENSE file in the project root for full license information.
33

4-
import { XYZ } from "../math";
4+
import { Matrix4, XYZ } from "../math";
55
import { IShape } from "../shape";
66
import { INodeVisual } from "./visualObject";
77

88
export interface VisualShapeData {
99
shape: IShape;
1010
owner: INodeVisual;
11+
transform: Matrix4;
1112
point?: XYZ;
1213
indexes: number[];
1314
}

packages/chili-geo/src/mesh.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export class MeshUtils {
2020
start: g.start + offset.faceIndex,
2121
shape: g.shape,
2222
count: g.count,
23+
transform: matrix,
2324
};
2425
}),
2526
);
@@ -43,6 +44,7 @@ export class MeshUtils {
4344
start: g.start + data.index.length,
4445
shape: g.shape,
4546
count: g.count,
47+
transform: matrix,
4648
};
4749
}),
4850
);
@@ -73,6 +75,7 @@ export class MeshUtils {
7375
data.range = data.range.concat(
7476
other.range.map((g) => {
7577
return {
78+
transform: matrix,
7679
start: g.start + offset,
7780
shape: g.shape,
7881
count: g.count,
@@ -94,6 +97,7 @@ export class MeshUtils {
9497
start: g.start + start,
9598
shape: g.shape,
9699
count: g.count,
100+
transform: matrix,
97101
};
98102
}),
99103
);
@@ -145,7 +149,7 @@ export class MeshUtils {
145149
offset: { facePosition: number; faceIndex: number },
146150
) {
147151
for (const index of group) {
148-
const { start, count, shape } = mesh.range[index[0]];
152+
const { start, count, shape, transform: worldTransform } = mesh.range[index[0]];
149153

150154
const oldIndex = mesh.index.slice(start, start + count);
151155
const { min, max } = MathUtils.minMax(oldIndex)!;
@@ -160,6 +164,7 @@ export class MeshUtils {
160164
start: offset.faceIndex,
161165
count,
162166
shape,
167+
transform: worldTransform,
163168
});
164169
offset.facePosition += max - min + 1;
165170
offset.faceIndex += oldIndex.length;

packages/chili-three/src/threeGeometry.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
IShape,
1010
ISubShape,
1111
IVisualGeometry,
12+
Matrix4,
1213
ShapeMeshRange,
1314
ShapeNode,
1415
ShapeType,
@@ -165,27 +166,30 @@ export class ThreeGeometry extends ThreeVisualObject implements IVisualGeometry
165166

166167
override getSubShapeAndIndex(shapeType: "face" | "edge", subVisualIndex: number) {
167168
let subShape: ISubShape | undefined = undefined;
169+
let transform: Matrix4 | undefined = undefined;
168170
let index: number = -1;
169171
let groups: ShapeMeshRange[] | undefined = undefined;
170172
if (shapeType === "edge") {
171173
groups = this.geometryNode.mesh.edges?.range;
172174
if (groups) {
173175
index = ThreeHelper.findGroupIndex(groups, subVisualIndex)!;
174176
subShape = groups[index].shape;
177+
transform = groups[index].transform;
175178
}
176179
} else {
177180
groups = this.geometryNode.mesh.faces?.range;
178181
if (groups) {
179182
index = ThreeHelper.findGroupIndex(groups, subVisualIndex)!;
180183
subShape = groups[index].shape;
184+
transform = groups[index].transform;
181185
}
182186
}
183187

184188
let shape: IShape | undefined = subShape;
185189
if (this.geometryNode instanceof ShapeNode) {
186190
shape = this.geometryNode.shape.value;
187191
}
188-
return { shape, subShape, index, groups: groups ?? [] };
192+
return { transform, shape, subShape, index, groups: groups ?? [] };
189193
}
190194

191195
override subShapeVisual(shapeType: ShapeType): (Mesh | LineSegments2)[] {

packages/chili-three/src/threeView.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
ISubShape,
1010
IView,
1111
IVisualObject,
12+
Matrix4,
1213
MultiShapeNode,
1314
Observable,
1415
Plane,
@@ -353,6 +354,7 @@ export class ThreeView extends Observable implements IView {
353354
const addShape = (indexes: number[]) => {
354355
detecteds.push({
355356
shape,
357+
transform: ThreeHelper.toMatrix(obj.parent!.matrixWorld),
356358
owner: obj.parent as any,
357359
indexes,
358360
});
@@ -409,6 +411,7 @@ export class ThreeView extends Observable implements IView {
409411
{
410412
owner: parent,
411413
shape,
414+
transform: parent.worldTransform(),
412415
point: ThreeHelper.toXYZ(element.pointOnLine ?? element.point),
413416
indexes: [],
414417
},
@@ -426,13 +429,19 @@ export class ThreeView extends Observable implements IView {
426429
for (const intersected of intersections) {
427430
const visualShape = intersected.object.parent;
428431
if (visualShape instanceof ThreeVisualObject) {
429-
let { shape, indexes } = this.getSubShapeFromInsection(shapeType, visualShape, intersected);
432+
let { shape, indexes, transform } = this.getSubShapeFromInsection(
433+
shapeType,
434+
visualShape,
435+
intersected,
436+
);
430437
if (!shape || (shapeFilter && !shapeFilter.allow(shape))) {
431438
continue;
432439
}
440+
const nodeWorldTransform = visualShape.worldTransform();
433441
result.push({
434442
owner: visualShape,
435443
shape,
444+
transform: transform ? nodeWorldTransform.multiply(transform) : nodeWorldTransform,
436445
point: ThreeHelper.toXYZ(intersected.pointOnLine ?? intersected.point),
437446
indexes,
438447
});
@@ -447,17 +456,18 @@ export class ThreeView extends Observable implements IView {
447456
intersection: Intersection,
448457
): {
449458
shape: IShape | undefined;
459+
transform?: Matrix4;
450460
indexes: number[];
451461
} {
452-
let { shape: fromShape, subShape, index, groups } = this.findShapeAndIndex(parent, intersection);
453-
if (!subShape || !fromShape) return { shape: undefined, indexes: [] };
462+
let { shape, subShape, index, groups, transform } = this.findShapeAndIndex(parent, intersection);
463+
if (!subShape || !shape) return { shape: undefined, indexes: [] };
454464

455465
if (ShapeType.hasShell(shapeType) && subShape.shapeType === ShapeType.Face) {
456-
let shell = this.getAncestorAndIndex(ShapeType.Shell, subShape, fromShape, groups);
466+
let shell = this.getAncestorAndIndex(ShapeType.Shell, subShape, shape, groups);
457467
if (shell.shape) return shell;
458468
}
459469
if (ShapeType.hasWire(shapeType) && subShape.shapeType === ShapeType.Edge) {
460-
let wire = this.getAncestorAndIndex(ShapeType.Wire, subShape, fromShape, groups);
470+
let wire = this.getAncestorAndIndex(ShapeType.Wire, subShape, shape, groups);
461471
if (wire.shape) return wire;
462472
}
463473
if (!ShapeType.hasFace(shapeType) && subShape.shapeType === ShapeType.Face) {
@@ -467,7 +477,7 @@ export class ThreeView extends Observable implements IView {
467477
return { shape: undefined, indexes: [index] };
468478
}
469479

470-
return { shape: subShape, indexes: [index] };
480+
return { shape: subShape, indexes: [index], transform };
471481
}
472482

473483
private getAncestorAndIndex(
@@ -483,7 +493,7 @@ export class ThreeView extends Observable implements IView {
483493
for (const sub of ancestor.findSubShapes(subShape.shapeType)) {
484494
this.findIndex(groups, sub, indexes);
485495
}
486-
return { shape: ancestor, indexes, subShape };
496+
return { shape: ancestor, indexes, subShape, transform: groups.at(0)?.transform };
487497
}
488498

489499
private findIndex(groups: ShapeMeshRange[], shape: IShape, indexes: number[]) {

packages/chili-three/src/threeVisualObject.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export abstract class ThreeVisualObject extends Object3D implements IVisualObjec
9191
shape: IShape | undefined;
9292
subShape: ISubShape | undefined;
9393
index: number;
94+
transform?: Matrix4;
9495
groups: ShapeMeshRange[];
9596
};
9697

@@ -375,6 +376,7 @@ export class ThreeComponentObject extends ThreeVisualObject implements IHighligh
375376
return {
376377
shape: range[index].shape,
377378
subShape: range[index].shape,
379+
transform: range[index].transform,
378380
index,
379381
groups: range,
380382
};
@@ -383,6 +385,7 @@ export class ThreeComponentObject extends ThreeVisualObject implements IHighligh
383385
return {
384386
shape: undefined,
385387
subShape: undefined,
388+
transform: undefined,
386389
index: -1,
387390
groups: [],
388391
};

packages/chili/src/commands/create/revolve.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class Revolve extends CreateCommand {
3434
protected override geometryNode(): GeometryNode {
3535
const shape = this.transformdFirstShape(this.stepDatas[0], false);
3636
const edge = (this.stepDatas[1].shapes[0].shape as IEdge).curve.basisCurve as ILine;
37-
const transform = this.stepDatas[1].shapes[0].owner.node.worldTransform();
37+
const transform = this.stepDatas[1].shapes[0].transform;
3838
const axis = new Ray(transform.ofPoint(edge.value(0)), transform.ofVector(edge.direction));
3939
return new RevolvedNode(this.document, shape, axis, this.angle);
4040
}

packages/chili/src/commands/modify/break.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class Break extends MultistepCommand {
6161
private readonly handlePointData = () => {
6262
const edge = this.stepDatas[0].shapes[0].shape as IEdge;
6363
const curve = edge.curve.transformed(
64-
edge.matrix.multiply(this.stepDatas[0].shapes[0].owner.node.worldTransform()),
64+
edge.matrix.multiply(this.stepDatas[0].shapes[0].transform),
6565
) as ITrimmedCurve;
6666
this.disposeStack.add(curve);
6767

packages/chili/src/commands/modify/split.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import { MultistepCommand } from "../multistepCommand";
2121
export class Split extends MultistepCommand {
2222
private splitedShape() {
2323
const shape1 = this.stepDatas[0].shapes[0].shape;
24-
const invertTransform = this.stepDatas[0].shapes[0].owner.node.worldTransform().invert()!;
24+
const invertTransform = this.stepDatas[0].shapes[0].transform.invert()!;
2525
const edges = this.stepDatas[1].shapes.map((x) =>
26-
x.shape.transformedMul(x.owner.node.worldTransform().multiply(invertTransform)),
26+
x.shape.transformedMul(x.transform.multiply(invertTransform)),
2727
) as IEdge[];
2828
const result = shape1.split(edges);
2929

packages/chili/src/commands/modify/trim.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,9 @@ export class PickTrimEdgeEventHandler extends ShapeSelectionHandler {
116116
this.cleanHighlights();
117117
if (detecteds.length !== 1 || detecteds[0].shape.shapeType !== ShapeType.Edge) return;
118118

119-
const box = BoundingBox.transformed(
120-
detecteds[0].owner.boundingBox()!,
121-
detecteds[0].owner.node.worldTransform(),
122-
);
119+
const box = BoundingBox.transformed(detecteds[0].owner.boundingBox()!, detecteds[0].transform);
123120
const edges = this.filterByBoundingBox(box, view, detecteds[0].shape.id);
124-
const edge = detecteds[0].shape.transformedMul(detecteds[0].owner.node.worldTransform()) as IEdge;
121+
const edge = detecteds[0].shape.transformedMul(detecteds[0].transform) as IEdge;
125122
this.releaseStack.add(edge);
126123

127124
let segments = findSegments(edge.curve, edge, edges, detecteds);

packages/chili/src/commands/multistepCommand.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export abstract class MultistepCommand extends CancelableCommand {
110110
};
111111

112112
protected transformdFirstShape(step: SnapResult, shouldDispose = true) {
113-
const shape = step.shapes[0].shape.transformedMul(step.shapes[0].owner.node.worldTransform());
113+
const shape = step.shapes[0].shape.transformedMul(step.shapes[0].transform);
114114
if (shouldDispose) this.disposeStack.add(shape);
115115
return shape;
116116
}

packages/chili/src/commands/workingPlane.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ export class AlignToPlane implements ICommand {
7878
controller.dispose();
7979
if (!data || data.shapes.length === 0) return;
8080
view.document.visual.highlighter.clear();
81-
const face = data.shapes[0].shape.transformedMul(
82-
data.shapes[0].owner.node.worldTransform(),
83-
) as IFace;
81+
const face = data.shapes[0].shape.transformedMul(data.shapes[0].transform) as IFace;
8482
const [point, normal] = face.normal(0, 0);
8583
face.dispose();
8684
let xvec = XYZ.unitX;
@@ -131,7 +129,7 @@ export class FromSection extends MultistepCommand {
131129

132130
private transformedCurve() {
133131
const shape = this.stepDatas[0].shapes[0].shape as IEdge;
134-
const matrix = shape.matrix.multiply(this.stepDatas[0].shapes[0].owner.node.worldTransform());
132+
const matrix = shape.matrix.multiply(this.stepDatas[0].shapes[0].transform);
135133
const curve = shape.curve.transformed(matrix) as ICurve;
136134
this.disposeStack.add(curve);
137135
return curve;

packages/chili/src/snap/snaps/featurePointStrategy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class FeaturePointStrategy {
3030
const addPoint = (point: XYZ, info: string) =>
3131
infos.push({
3232
view,
33-
point: shape.owner.node.worldTransform().ofPoint(point),
33+
point: shape.transform.ofPoint(point),
3434
info,
3535
shapes: [shape],
3636
});

packages/chili/src/snap/snaps/objectSnap.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ export class ObjectSnap extends BaseSnap {
169169
}
170170

171171
private showCircleCenter(curve: ICircle, view: IView, shape: VisualShapeData) {
172-
const center = shape.owner.node.worldTransform().ofPoint(curve.center);
172+
const center = shape.transform.ofPoint(curve.center);
173173
let temporary = VertexMeshData.from(
174174
center,
175175
VisualConfig.hintVertexSize,
@@ -208,7 +208,7 @@ export class ObjectSnap extends BaseSnap {
208208
}
209209

210210
let curve = (shape.shape as IEdge).curve;
211-
const transform = shape.owner.node.worldTransform();
211+
const transform = shape.transform;
212212
let point = curve.project(transform.invert()!.ofPoint(this.referencePoint())).at(0);
213213
if (point === undefined) return result;
214214
result.push({
@@ -247,8 +247,8 @@ export class ObjectSnap extends BaseSnap {
247247
}
248248

249249
private findIntersections(view: IView, s1: VisualShapeData, s2: VisualShapeData): SnapResult[] {
250-
const e1 = s1.shape.transformedMul(s1.owner.node.worldTransform()) as IEdge;
251-
const e2 = s2.shape.transformedMul(s2.owner.node.worldTransform()) as IEdge;
250+
const e1 = s1.shape.transformedMul(s1.transform) as IEdge;
251+
const e2 = s2.shape.transformedMul(s2.transform) as IEdge;
252252
let intersections = e1.intersect(e2);
253253
e1.dispose();
254254
e2.dispose();

0 commit comments

Comments
 (0)