From 58cfc7a589cd04094f99ebcc57db0cc60acf4edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Gonz=C3=A1lez=20Viegas?= Date: Tue, 1 Oct 2024 10:53:20 +0200 Subject: [PATCH] feat: add offset to corners --- .../SimpleWall/src/simple-wall-cornerer.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/clay/src/elements/Walls/SimpleWall/src/simple-wall-cornerer.ts b/packages/clay/src/elements/Walls/SimpleWall/src/simple-wall-cornerer.ts index 000b613..cdf973b 100644 --- a/packages/clay/src/elements/Walls/SimpleWall/src/simple-wall-cornerer.ts +++ b/packages/clay/src/elements/Walls/SimpleWall/src/simple-wall-cornerer.ts @@ -8,11 +8,13 @@ export interface WallCornerConfig { priority?: WallEndPointType; cut?: "exterior" | "interior"; cutDirection?: "exterior" | "interior"; + offset?: number | "auto"; } interface WallCorner extends WallCornerConfig { to: WallPlaneType; priority: WallEndPointType; + offset: number | "auto"; } export class SimpleWallCornerer { @@ -30,7 +32,8 @@ export class SimpleWallCornerer { const to = config.to || "center"; const priority = config.priority || "end"; - corners.set(id2, { ...config, to, priority }); + const offset = config.offset || "auto"; + corners.set(id2, { ...config, to, priority, offset }); } update(ids: Iterable = this.list.keys()) { @@ -45,15 +48,17 @@ export class SimpleWallCornerer { } } - extend(corner: WallCornerConfig) { - const { wall1, wall2, to, priority } = corner; + extend(corner: WallCorner) { + const { wall1, wall2, to, priority, offset } = corner; // Strategy: there are 2 cases // A) Both points of the wall are on one side of this wall // In this case, extend its closest point to this wall // B) Each point of the wall are on one side of this wall // In that case, keep the point specified in priority - if (wall1.direction.equals(wall2.direction)) { + const dir1 = wall1.direction; + const dir2 = wall2.direction; + if (dir1.equals(dir2)) { // Same direction, so walls can't intersect return; } @@ -100,6 +105,11 @@ export class SimpleWallCornerer { return; } + const offsetDist = offset === "auto" ? wall2.type.width : offset; + const factor = extendStart ? -1 : 1; + const offsetVec = dir2.multiplyScalar(offsetDist * factor); + intersection.add(offsetVec); + if (corner.cut && corner.cutDirection) { const planeCut = wall1.planes.get(corner.cut, corner.cutDirection); wall2.addSubtraction(planeCut);