From 00ce57dc1566ff2988fd87ec6a3ca723259b9127 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sun, 12 Apr 2026 00:42:36 +0200 Subject: [PATCH] Enhance viewport host for local axis constraint and rotation preview --- src/viewport-three/viewport-host.ts | 46 +++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/viewport-three/viewport-host.ts b/src/viewport-three/viewport-host.ts index 6fe5734e..b37c2b43 100644 --- a/src/viewport-three/viewport-host.ts +++ b/src/viewport-three/viewport-host.ts @@ -1399,7 +1399,11 @@ export class ViewportHost { case "brushFace": case "brushEdge": case "brushVertex": - return null; + if (session.preview.kind !== "brush") { + return null; + } + + return this.createRotationQuaternion(session.preview.rotationDegrees); } } @@ -2117,7 +2121,8 @@ export class ViewportHost { session, origin, current, - axisConstraint + axisConstraint, + axisConstraintSpace ); } @@ -2684,7 +2689,8 @@ export class ViewportHost { session: ActiveTransformSession, origin: { x: number; y: number }, current: { x: number; y: number }, - axisConstraint: TransformAxis | null + axisConstraint: TransformAxis | null, + axisConstraintSpace: TransformAxisSpace ) { const initialBrush = this.createTargetPreviewBrush(session); @@ -2732,6 +2738,40 @@ export class ViewportHost { }; } } else { + if ( + axisConstraintSpace === "local" && + supportsLocalTransformAxisConstraint(session, axisConstraint) + ) { + const axisVector = this.getConstraintAxisWorldVector( + session, + axisConstraint, + axisConstraintSpace + ); + const axisDelta = this.getMovementDistanceAlongWorldAxis( + axisVector, + initialPivot, + origin, + current + ); + const snappedAxisDelta = this.whiteboxSnapEnabled + ? snapValueToGrid(axisDelta, this.whiteboxSnapStep) + : axisDelta; + const localDelta = { + x: 0, + y: 0, + z: 0 + }; + localDelta[axisConstraint] = snappedAxisDelta; + const vertexIds = this.getComponentTargetVertexIds(session.target); + const nextGeometry = this.applyDeltaToVertices( + initialBrush, + vertexIds, + localDelta + ); + + return this.createBrushPreviewFromGeometry(initialBrush, nextGeometry); + } + const axisDelta = this.getAxisMovementDistance( axisConstraint, initialPivot,