@vertexvis/viewer 0.17.2-canary.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/cjs/controller-b93c925e.js +126 -0
  2. package/dist/cjs/controller-b93c925e.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +79 -7
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +18 -121
  6. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  7. package/dist/collection/components/viewer-transform-widget/util.js +9 -2
  8. package/dist/collection/components/viewer-transform-widget/util.js.map +1 -1
  9. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +7 -2
  10. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
  11. package/dist/collection/index.js +1 -0
  12. package/dist/collection/index.js.map +1 -1
  13. package/dist/collection/lib/transforms/index.js +7 -0
  14. package/dist/collection/lib/transforms/index.js.map +1 -0
  15. package/dist/collection/lib/transforms/transformation-delta.js +67 -0
  16. package/dist/collection/lib/transforms/transformation-delta.js.map +1 -0
  17. package/dist/collection/testing/random.js +12 -0
  18. package/dist/collection/testing/random.js.map +1 -1
  19. package/dist/custom-elements/index.js +204 -121
  20. package/dist/custom-elements/index.js.map +1 -1
  21. package/dist/esm/controller-bf3848bf.js +124 -0
  22. package/dist/esm/controller-bf3848bf.js.map +1 -0
  23. package/dist/esm/index.js +75 -1
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/index.mjs +75 -1
  26. package/dist/esm/vertex-viewer-transform-widget.entry.js +18 -121
  27. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  28. package/dist/types/components/viewer-transform-widget/util.d.ts +8 -1
  29. package/dist/types/components/viewer-transform-widget/viewer-transform-widget.d.ts +1 -1
  30. package/dist/types/index.d.ts +1 -0
  31. package/dist/types/lib/transforms/index.d.ts +3 -0
  32. package/dist/types/lib/transforms/transformation-delta.d.ts +34 -0
  33. package/dist/types/testing/random.d.ts +1 -0
  34. package/dist/viewer/index.esm.js +1 -1
  35. package/dist/viewer/index.esm.js.map +1 -1
  36. package/dist/viewer/p-4025ad8d.js +5 -0
  37. package/dist/viewer/p-4025ad8d.js.map +1 -0
  38. package/dist/viewer/p-839064b7.entry.js +5 -0
  39. package/dist/viewer/p-839064b7.entry.js.map +1 -0
  40. package/dist/viewer/viewer.esm.js +1 -1
  41. package/package.json +7 -7
  42. package/readme.md +4 -4
  43. package/dist/viewer/p-844f80b3.entry.js +0 -5
  44. package/dist/viewer/p-844f80b3.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"file":"vertex-viewer-transform-widget.entry.js","mappings":"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","names":["Matrix4","point","Point","Vector3","ray","Ray","Plane","Quaternion","Angle","BoundingBox","Rectangle","angle","classNames"],"sources":["./src/lib/transforms/controller.ts","./src/components/viewer-transform-widget/util.ts","./src/lib/transforms/axis-rotation.ts","./src/lib/transforms/hits.ts","./src/components/viewer-transform-widget/widget.ts","./src/components/viewer-transform-widget/viewer-transform-widget.css?tag=vertex-viewer-transform-widget&encapsulation=shadow","./src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Matrix4, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nexport class TransformController {\n private isTransforming = false;\n private currentDelta: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n public constructor(private stream: StreamApi) {}\n\n public async dispose(): Promise<void> {\n if (this.isTransforming) {\n this.endTransform();\n }\n }\n\n public async beginTransform(\n delta: Matrix4.Matrix4 = Matrix4.makeIdentity()\n ): Promise<void> {\n if (!this.isTransforming) {\n this.currentDelta = delta;\n this.isTransforming = true;\n\n console.debug('Beginning transform interaction');\n\n await this.stream.beginInteraction({\n transform: {\n delta: this.toDeltaTransform(delta),\n },\n });\n }\n }\n\n public async updateTransform(delta: Matrix4.Matrix4): Promise<void> {\n this.currentDelta = delta;\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta, true),\n },\n });\n }\n\n public async updateTranslation(delta: Vector3.Vector3): Promise<void> {\n this.currentDelta = Matrix4.makeTranslation(delta);\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n }\n\n public getCurrentDelta(): Matrix4.Matrix4 | undefined {\n return this.currentDelta;\n }\n\n public async endTransform(): Promise<void> {\n if (this.isTransforming) {\n console.debug(\n `Ending transform interaction [delta=${this.currentDelta}]`\n );\n\n await this.stream.endInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n this.isTransforming = false;\n this.currentDelta = Matrix4.makeIdentity();\n }\n }\n\n public async endInteraction(): Promise<void> {\n if (this.isTransforming) {\n await this.stream.endInteraction();\n this.isTransforming = false;\n this.currentDelta = Matrix4.makeIdentity();\n }\n }\n\n public clearTransform(): void {\n this.currentDelta = Matrix4.makeIdentity();\n this.endTransform();\n }\n\n private toDeltaTransform(\n delta: Matrix4.Matrix4,\n columnMajor = false\n ): vertexvis.protobuf.core.IAffineMatrix4f {\n const asObject = Matrix4.toObject(delta);\n\n // TODO: update this to pass a single order for the\n // transform matrix after work in https://vertexvis.atlassian.net/browse/PLAT-1582\n const basisX = columnMajor\n ? {\n x: asObject.m11,\n y: asObject.m21,\n z: asObject.m31,\n }\n : {\n x: asObject.m11,\n y: asObject.m12,\n z: asObject.m13,\n };\n const basisY = columnMajor\n ? {\n x: asObject.m12,\n y: asObject.m22,\n z: asObject.m32,\n }\n : {\n x: asObject.m21,\n y: asObject.m22,\n z: asObject.m23,\n };\n const basisZ = columnMajor\n ? {\n x: asObject.m13,\n y: asObject.m23,\n z: asObject.m33,\n }\n : {\n x: asObject.m31,\n y: asObject.m32,\n z: asObject.m33,\n };\n\n return {\n basisX,\n basisY,\n basisZ,\n xlate: {\n x: asObject.m14,\n y: asObject.m24,\n z: asObject.m34,\n },\n scale: asObject.m44,\n };\n }\n}\n","import {\n Matrix4,\n Plane,\n Point,\n Quaternion,\n Ray,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport { Frame, Viewport } from '../../lib/types';\n\nexport function convertPointToCanvas(\n point: Point.Point,\n bounds?: DOMRect\n): Point.Point | undefined {\n return bounds != null\n ? Point.create(point.x - bounds.left, point.y - bounds.top)\n : undefined;\n}\n\nexport function convertCanvasPointToWorld(\n point?: Point.Point,\n frame?: Frame,\n viewport?: Viewport,\n transform?: Matrix4.Matrix4\n): Vector3.Vector3 | undefined {\n const position =\n transform != null ? Vector3.fromMatrixPosition(transform) : undefined;\n\n if (point != null && frame != null && viewport != null && position != null) {\n if (frame.scene.camera.isOrthographic()) {\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n );\n // Offset the point to past the bounding sphere of the model to\n // adjust the position plane location.\n const offsetPoint = Ray.at(\n Ray.create({\n origin: position,\n direction: frame.scene.camera.direction,\n }),\n Vector3.magnitude(frame.scene.camera.viewVector) * 2\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(\n frame.scene.camera.direction,\n offsetPoint\n )\n );\n } else {\n const ray = viewport.transformPointToRay(\n point,\n frame.image,\n frame.scene.camera\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(frame.scene.camera.direction, position)\n );\n }\n }\n return undefined;\n}\n\nexport function computeUpdatedTransform(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n viewVector: Vector3.Vector3,\n angle: number,\n identifier: string\n): Matrix4.Matrix4 {\n switch (identifier) {\n case 'x-translate': {\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n computeTranslation(current, previous, next, Vector3.right()),\n 0,\n 0\n )\n )\n );\n }\n case 'y-translate':\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n 0,\n computeTranslation(current, previous, next, Vector3.up()),\n 0\n )\n )\n );\n case 'z-translate':\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n 0,\n 0,\n computeTranslation(current, previous, next, Vector3.back())\n )\n )\n );\n case 'x-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedRight = Vector3.transformMatrix(\n Vector3.right(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedLeft = Vector3.transformMatrix(\n Vector3.left(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedRight) >\n Vector3.dot(viewVector, rotatedLeft)\n ? rotatedRight\n : rotatedLeft;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n case 'y-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedUp = Vector3.transformMatrix(\n Vector3.up(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedDown = Vector3.transformMatrix(\n Vector3.down(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedUp) >\n Vector3.dot(viewVector, rotatedDown)\n ? rotatedUp\n : rotatedDown;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n case 'z-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedForward = Vector3.transformMatrix(\n Vector3.forward(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedBack = Vector3.transformMatrix(\n Vector3.back(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedForward) >\n Vector3.dot(viewVector, rotatedBack)\n ? rotatedForward\n : rotatedBack;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n default:\n return current;\n }\n}\n\nfunction computeTranslation(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n direction: Vector3.Vector3\n): number {\n const rotatedTranslationAxis = Vector3.transformMatrix(\n direction,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(current))\n );\n const rotatedDelta = Vector3.multiply(\n rotatedTranslationAxis,\n Vector3.subtract(next, previous)\n );\n\n return rotatedDelta.x + rotatedDelta.y + rotatedDelta.z;\n}\n\nexport function computeRotation(\n rotationAxis: Quaternion.Quaternion,\n current: Matrix4.Matrix4\n): Matrix4.Matrix4 {\n return Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.makeTranslation(Vector3.fromMatrixPosition(current)),\n Matrix4.makeRotation(rotationAxis)\n ),\n Matrix4.makeTranslation(\n Vector3.negate(Vector3.fromMatrixPosition(current))\n )\n ),\n current\n );\n}\n","import { Angle, Matrix4, Quaternion, Ray, Vector3 } from '@vertexvis/geometry';\n\nimport { FrameCameraBase } from '../types';\nimport { TriangleMeshPoints } from './mesh';\n\nexport function xAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.back(),\n Vector3.up(),\n triangleSize\n );\n}\n\nexport function yAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.right(),\n Vector3.back(),\n triangleSize\n );\n}\n\nexport function zAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.right(),\n Vector3.up(),\n triangleSize\n );\n}\n\nfunction computeRotationNdcValues(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n xDirection: Vector3.Vector3,\n yDirection: Vector3.Vector3,\n triangleSize: number\n): TriangleMeshPoints {\n const transformedDirection = Vector3.transformMatrix(\n Vector3.add(xDirection, yDirection),\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const transformedX = Vector3.transformMatrix(\n xDirection,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const transformedY = Vector3.transformMatrix(\n yDirection,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const basePosition = Vector3.fromMatrixPosition(widgetTransform);\n const position = Vector3.add(\n basePosition,\n Vector3.scale(triangleSize * 10, transformedDirection)\n );\n\n const xRay = Ray.create({\n origin: position,\n direction: transformedX,\n });\n const yRay = Ray.create({\n origin: position,\n direction: transformedY,\n });\n const rotationAxis = Vector3.cross(transformedX, transformedY);\n\n const base = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(yRay, -triangleSize),\n rotationAxis,\n position\n );\n const right = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(xRay, triangleSize),\n rotationAxis,\n position\n );\n const up = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(yRay, triangleSize),\n rotationAxis,\n position\n );\n const left = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(xRay, -triangleSize),\n rotationAxis,\n position\n );\n\n return new TriangleMeshPoints(\n Vector3.dot(transformedX, camera.direction) !== -1 &&\n Vector3.dot(transformedY, camera.direction) !== -1,\n base,\n left,\n right,\n up,\n Vector3.transformMatrix(base, camera.projectionViewMatrix),\n Vector3.transformMatrix(left, camera.projectionViewMatrix),\n Vector3.transformMatrix(right, camera.projectionViewMatrix),\n Vector3.transformMatrix(up, camera.projectionViewMatrix)\n );\n}\n","import { BoundingBox, Point, Vector3 } from '@vertexvis/geometry';\n\nimport { Frame, Viewport } from '../../lib/types';\nimport { Drawable } from './drawable';\nimport { TriangleMesh } from './mesh';\n\nexport function testDrawable(\n drawable: Drawable,\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n if (drawable instanceof TriangleMesh) {\n return testTriangleMesh(drawable, frame, viewport, point);\n }\n return false;\n}\n\nexport function testTriangleMesh(\n mesh: TriangleMesh,\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n return (\n testTriangle(\n [mesh.points.worldLeft, mesh.points.worldRight, mesh.points.worldTip],\n frame,\n viewport,\n point\n ) ||\n testTriangle(\n [mesh.points.worldLeft, mesh.points.worldRight, mesh.points.worldBase],\n frame,\n viewport,\n point\n )\n );\n}\n\n/**\n * Adapted from https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm.\n */\nexport function testTriangle(\n points: Vector3.Vector3[],\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n if (points.length === 3) {\n const ray = frame.scene.camera.isOrthographic()\n ? viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n )\n : viewport.transformPointToRay(point, frame.image, frame.scene.camera);\n\n const edge1 = Vector3.subtract(points[1], points[0]);\n const edge2 = Vector3.subtract(points[2], points[0]);\n\n const epsilon = BoundingBox.epsilon(\n BoundingBox.fromVectors([ray.direction, ray.origin, edge1, edge2]) ??\n BoundingBox.create(edge1, edge2)\n );\n\n const p = Vector3.cross(ray.direction, edge2);\n const det = Vector3.dot(edge1, p);\n\n // This check causes a `det` of NaN or 0 to return false\n // without needing to perform the subsequent calculations.\n if (!(Math.abs(det) >= epsilon)) {\n return false;\n }\n\n const t = Vector3.subtract(ray.origin, points[0]);\n const u = Vector3.dot(t, p) / det;\n\n if (u < 0 || u > 1) {\n return false;\n }\n\n const q = Vector3.cross(t, edge1);\n const v = Vector3.dot(ray.direction, q) / det;\n\n if (v < 0 || u + v > 1) {\n return false;\n }\n\n const r = Vector3.dot(edge2, q) / det;\n\n // Ignore the case where the computed hit position is negative\n // if in orthographic to correctly return hit results when close\n // to the camera.\n // TODO: revisit with https://vertexvis.atlassian.net/browse/PLAT-1549\n return !isNaN(r) && (r > 0 || frame.scene.camera.isOrthographic());\n }\n return false;\n}\n","import { Matrix4 } from '@vertexvis/geometry';\nimport { Point, Rectangle, Vector3 } from '@vertexvis/geometry';\nimport { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\nimport regl from 'regl';\nimport shapeBuilder from 'regl-shape';\n\nimport {\n axisPositions,\n rotationAxisPositions,\n} from '../../lib/transforms/axis-lines';\nimport {\n xAxisRotationPositions,\n yAxisRotationPositions,\n zAxisRotationPositions,\n} from '../../lib/transforms/axis-rotation';\nimport {\n xAxisArrowPositions,\n yAxisArrowPositions,\n zAxisArrowPositions,\n} from '../../lib/transforms/axis-translation';\nimport {\n computeDrawable2dBounds,\n Drawable,\n} from '../../lib/transforms/drawable';\nimport { testDrawable } from '../../lib/transforms/hits';\nimport { AxisLine, RotationLine } from '../../lib/transforms/line';\nimport { TriangleMesh } from '../../lib/transforms/mesh';\nimport { CreateShape } from '../../lib/transforms/shape';\nimport { Frame } from '../../lib/types';\nimport { ReglComponent } from '../../lib/webgl/regl-component';\n\nexport interface DrawableElementColors {\n xArrow?: Color.Color | string;\n yArrow?: Color.Color | string;\n zArrow?: Color.Color | string;\n hovered?: Color.Color | string;\n outline?: Color.Color | string;\n disabledColor?: Color.Color | string;\n}\n\nexport interface DisabledAxis {\n xRotation: boolean;\n yRotation: boolean;\n zRotation: boolean;\n xTranslation: boolean;\n yTranslation: boolean;\n zTranslation: boolean;\n}\n\nexport class TransformWidget extends ReglComponent {\n private cursor?: Point.Point;\n\n private xAxis?: AxisLine;\n private yAxis?: AxisLine;\n private zAxis?: AxisLine;\n private xArrow?: TriangleMesh;\n private yArrow?: TriangleMesh;\n private zArrow?: TriangleMesh;\n private xRotation?: TriangleMesh;\n private xyRotationLine?: RotationLine;\n private xzRotationLine?: RotationLine;\n private yRotation?: TriangleMesh;\n private yxRotationLine?: RotationLine;\n private yzRotationLine?: RotationLine;\n private zRotation?: TriangleMesh;\n private zxRotationLine?: RotationLine;\n private zyRotationLine?: RotationLine;\n\n private disabledAxis: DisabledAxis = {\n xTranslation: false,\n yTranslation: false,\n zTranslation: false,\n xRotation: false,\n yRotation: false,\n zRotation: false,\n };\n\n private axisLines: AxisLine[] = [];\n private rotationLines: RotationLine[] = [];\n private translationMeshes: TriangleMesh[] = [];\n private rotationMeshes: TriangleMesh[] = [];\n private hoveredElement?: Drawable;\n\n private transform?: Matrix4.Matrix4;\n private bounds?: Rectangle.Rectangle;\n\n private hoveredChanged = new EventDispatcher<Drawable | undefined>();\n\n private xArrowFillColor?: Color.Color | string;\n private yArrowFillColor?: Color.Color | string;\n private zArrowFillColor?: Color.Color | string;\n\n private hoveredArrowFillColor?: Color.Color | string;\n private outlineColor?: Color.Color | string;\n\n private disabledColor: Color.Color | string;\n\n public constructor(\n canvasElement: HTMLCanvasElement,\n colors: DrawableElementColors = {}\n ) {\n super(canvasElement);\n\n this.xArrowFillColor = colors.xArrow;\n this.yArrowFillColor = colors.yArrow;\n this.zArrowFillColor = colors.zArrow;\n this.hoveredArrowFillColor = colors.hovered;\n this.outlineColor = colors.outline;\n this.disabledColor = colors.disabledColor ?? '#cccccc';\n }\n\n public dispose(): void {\n this.reglFrameDisposable?.cancel();\n }\n\n /**\n * @internal - visible for testing\n */\n public getDrawableElements(): Drawable[] {\n return this.drawableElements;\n }\n\n public boundsContainsPoint(point: Point.Point): boolean {\n return (\n this.bounds != null &&\n this.frame != null &&\n Rectangle.containsPoints(this.bounds, point)\n );\n }\n\n public updateDisabledAxis(axis: Partial<DisabledAxis>): void {\n this.disabledAxis = {\n ...this.disabledAxis,\n ...axis,\n };\n this.updateDisabledOnTriangles();\n }\n\n public updateCursor(cursor?: Point.Point): void {\n this.cursor = cursor;\n\n if (cursor != null && this.frame != null) {\n this.updateHovered();\n } else {\n this.clearHovered();\n }\n }\n\n public updateTransform(transform?: Matrix4.Matrix4): void {\n this.transform = transform;\n\n if (transform != null && this.frame != null) {\n this.updateAndDraw();\n } else {\n this.clear();\n this.reglFrameDisposable?.cancel();\n this.reglFrameDisposable = undefined;\n }\n }\n\n public updateColors(colors: DrawableElementColors = {}): void {\n this.xArrowFillColor = colors.xArrow ?? this.xArrowFillColor;\n this.yArrowFillColor = colors.yArrow ?? this.yArrowFillColor;\n this.zArrowFillColor = colors.zArrow ?? this.zArrowFillColor;\n this.hoveredArrowFillColor = colors.hovered ?? this.hoveredArrowFillColor;\n this.outlineColor = colors.outline ?? this.outlineColor;\n\n this.xAxis?.updateFillColor(this.disabledColor);\n this.yAxis?.updateFillColor(this.disabledColor);\n this.zAxis?.updateFillColor(this.disabledColor);\n\n this.xArrow?.updateFillColor(this.getXTranslationColor());\n this.yArrow?.updateFillColor(this.getYTranslationColor());\n this.zArrow?.updateFillColor(this.getZTranslationColor());\n this.xRotation?.updateFillColor(this.getXRotationColor());\n this.yRotation?.updateFillColor(this.getYRotationColor());\n this.zRotation?.updateFillColor(this.getZRotationColor());\n this.hoveredElement?.updateFillColor(this.hoveredArrowFillColor);\n }\n\n public onHoveredChanged(\n listener: Listener<Drawable | undefined>\n ): Disposable {\n return this.hoveredChanged.on(listener);\n }\n\n private updateDisabledOnTriangles(): void {\n this.xRotation?.setDisabled(this.disabledAxis.xRotation);\n this.yRotation?.setDisabled(this.disabledAxis.yRotation);\n this.zRotation?.setDisabled(this.disabledAxis.zRotation);\n this.xArrow?.setDisabled(this.disabledAxis.xTranslation);\n this.yArrow?.setDisabled(this.disabledAxis.yTranslation);\n this.zArrow?.setDisabled(this.disabledAxis.zTranslation);\n\n this.updateColors();\n }\n\n private updateHovered(): void {\n const previousHovered = this.hoveredElement;\n const currentFrame = this.frame;\n\n if (currentFrame != null) {\n this.hoveredElement = [...this.translationMeshes, ...this.rotationMeshes]\n .filter((el) => el.points.valid && !el.isDisabled())\n .find((m) =>\n this.cursor != null\n ? testDrawable(m, currentFrame, this.viewport, this.cursor)\n : false\n );\n\n if (this.hoveredElement !== previousHovered) {\n this.hoveredChanged.emit(this.hoveredElement);\n this.hoveredElement?.updateFillColor(this.hoveredArrowFillColor);\n previousHovered?.updateFillColor(previousHovered?.initialFillColor);\n }\n }\n }\n\n private clearHovered(): void {\n const previousHovered = this.hoveredElement;\n this.hoveredElement = undefined;\n\n if (this.hoveredElement !== previousHovered) {\n this.hoveredChanged.emit(this.hoveredElement);\n previousHovered.updateFillColor(previousHovered.initialFillColor);\n }\n }\n\n protected hasData(): boolean {\n return this.transform != null;\n }\n\n protected createOrUpdateElements(): void {\n if (this.transform != null && this.frame != null) {\n if (this.xArrow == null || this.yArrow == null || this.zArrow == null) {\n this.createElements(this.transform, this.frame);\n } else {\n this.updateElements(this.transform, this.frame);\n }\n\n this.bounds = computeDrawable2dBounds(\n this.viewport,\n ...this.rotationMeshes,\n ...this.translationMeshes\n );\n }\n }\n\n private createElements(transform: Matrix4.Matrix4, frame: Frame): void {\n this.reglCommand = regl({\n canvas: this.canvasElement,\n extensions: 'angle_instanced_arrays',\n });\n const { createShape } = shapeBuilder(this.reglCommand);\n\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n this.xArrow = new TriangleMesh(\n createShape,\n 'x-translate',\n xAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getXTranslationColor()\n );\n\n this.xRotation = new TriangleMesh(\n createShape,\n 'x-rotate',\n xAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getXRotationColor()\n );\n this.xAxis = new AxisLine(\n createShape,\n 'x-axis',\n axisPositions(transform, frame.scene.camera, this.xArrow),\n this.outlineColor,\n this.getXTranslationColor()\n );\n this.yArrow = new TriangleMesh(\n createShape,\n 'y-translate',\n yAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getYTranslationColor()\n );\n\n this.yRotation = new TriangleMesh(\n createShape,\n 'y-rotate',\n yAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getYRotationColor()\n );\n this.yAxis = new AxisLine(\n createShape,\n 'y-axis',\n axisPositions(transform, frame.scene.camera, this.yArrow),\n this.outlineColor,\n this.getYTranslationColor()\n );\n this.zArrow = new TriangleMesh(\n createShape,\n 'z-translate',\n zAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getZTranslationColor()\n );\n this.zAxis = new AxisLine(\n createShape,\n 'z-axis',\n axisPositions(transform, frame.scene.camera, this.zArrow),\n this.outlineColor,\n this.getZTranslationColor()\n );\n this.zRotation = new TriangleMesh(\n createShape,\n 'z-rotate',\n zAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getZRotationColor()\n );\n\n this.createRotationLines(createShape, transform, frame);\n\n this.axisLines = [this.xAxis, this.yAxis, this.zAxis];\n this.translationMeshes = [this.xArrow, this.yArrow, this.zArrow];\n this.rotationMeshes = [this.xRotation, this.yRotation, this.zRotation];\n this.updateDisabledOnTriangles();\n\n this.availableElements = [\n ...this.axisLines,\n ...this.rotationLines,\n ...this.translationMeshes,\n ...this.rotationMeshes,\n ];\n }\n\n private getXRotationColor(): Color.Color | string | undefined {\n return this.xRotation?.isDisabled()\n ? this.disabledColor\n : this.xArrowFillColor;\n }\n\n private getYRotationColor(): Color.Color | string | undefined {\n return this.yRotation?.isDisabled()\n ? this.disabledColor\n : this.yArrowFillColor;\n }\n\n private getZRotationColor(): Color.Color | string | undefined {\n return this.zRotation?.isDisabled()\n ? this.disabledColor\n : this.zArrowFillColor;\n }\n\n private getXTranslationColor(): Color.Color | string | undefined {\n return this.xArrow?.isDisabled()\n ? this.disabledColor\n : this.xArrowFillColor;\n }\n\n private getYTranslationColor(): Color.Color | string | undefined {\n return this.yArrow?.isDisabled()\n ? this.disabledColor\n : this.yArrowFillColor;\n }\n\n private getZTranslationColor(): Color.Color | string | undefined {\n return this.zArrow?.isDisabled()\n ? this.disabledColor\n : this.zArrowFillColor;\n }\n\n private createRotationLines(\n createShape: CreateShape,\n transform: Matrix4.Matrix4,\n frame: Frame\n ): void {\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n const xyRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n );\n const xzRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n );\n const yxRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n );\n const yzRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n );\n const zxRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n );\n const zyRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n );\n\n if (xyRotationLinePoints != null) {\n this.xyRotationLine = new RotationLine(\n createShape,\n 'xy-rotation-line',\n xyRotationLinePoints,\n this.outlineColor\n );\n }\n if (xzRotationLinePoints != null) {\n this.xzRotationLine = new RotationLine(\n createShape,\n 'xz-rotation-line',\n xzRotationLinePoints,\n this.outlineColor\n );\n }\n if (yxRotationLinePoints != null) {\n this.yxRotationLine = new RotationLine(\n createShape,\n 'yx-rotation-line',\n yxRotationLinePoints,\n this.outlineColor\n );\n }\n if (yzRotationLinePoints != null) {\n this.yzRotationLine = new RotationLine(\n createShape,\n 'yz-rotation-line',\n yzRotationLinePoints,\n this.outlineColor\n );\n }\n if (zxRotationLinePoints != null) {\n this.zxRotationLine = new RotationLine(\n createShape,\n 'zx-rotation-line',\n zxRotationLinePoints,\n this.outlineColor\n );\n }\n if (zyRotationLinePoints != null) {\n this.zyRotationLine = new RotationLine(\n createShape,\n 'zy-rotation-line',\n zyRotationLinePoints,\n this.outlineColor\n );\n }\n\n this.rotationLines = [\n this.xyRotationLine,\n this.xzRotationLine,\n this.yxRotationLine,\n this.yzRotationLine,\n this.zxRotationLine,\n this.zyRotationLine,\n ].filter((l) => l != null) as RotationLine[];\n }\n\n private updateElements(transform: Matrix4.Matrix4, frame: Frame): void {\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n if (this.xArrow != null) {\n this.xArrow.updatePoints(\n xAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.xAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.xArrow)\n );\n }\n this.xRotation?.updatePoints(\n xAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n if (this.yArrow != null) {\n this.yArrow.updatePoints(\n yAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.yAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.yArrow)\n );\n }\n this.yRotation?.updatePoints(\n yAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n if (this.zArrow != null) {\n this.zArrow.updatePoints(\n zAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.zAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.zArrow)\n );\n }\n this.zRotation?.updatePoints(\n zAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n this.xyRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n )\n );\n this.xzRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n )\n );\n this.yxRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n )\n );\n this.yzRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n )\n );\n this.zxRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n )\n );\n this.zyRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n )\n );\n }\n}\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-transform-widget-x-axis-arrow-color: A CSS color for the arrow\n * at the end of the X axis on this widget. Defaults to `#ea3324`.\n */\n --viewer-transform-widget-x-axis-arrow-color: var(--x-axis-color);\n\n /**\n * @prop --viewer-transform-widget-y-axis-arrow-color: A CSS color for the arrow\n * at the end of the Y axis on this widget. Defaults to `#4faf32`.\n */\n --viewer-transform-widget-y-axis-arrow-color: var(--y-axis-color);\n\n /**\n * @prop --viewer-transform-widget-z-axis-arrow-color: A CSS color for the arrow\n * at the end of the Z axis on this widget. Defaults to `#0000ff`.\n */\n --viewer-transform-widget-z-axis-arrow-color: var(--z-axis-color);\n\n\n /**\n * @prop --viewer-transform-widget-hovered-arrow-color: A CSS color for the arrow\n * when it is hovered. Defaults to `#ffff00`.\n */\n --viewer-transform-widget-hovered-arrow-color: #ffff00;\n\n /**\n * @prop --viewer-transform-widget-disabled-arrow-color: A CSS color for the arrow\n * when it is disabled. Defaults to `#cccccc`.\n */\n --viewer-transform-widget-disabled-arrow-color: #cccccc;\n}\n\n.widget {\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.widget.hovered {\n pointer-events: auto;\n}","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport {\n computeUpdatedTransform,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n} from './util';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether or not the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether or not the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether or not the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether or not the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether or not the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether or not the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private hoveredColor: Color.Color | string = '#ffff00';\n private disabledColor: Color.Color | string = '#cccccc';\n\n private widget?: TransformWidget;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n\n private canvasBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private canvasRef?: HTMLCanvasElement;\n\n private hoveredChangeDisposable?: Disposable;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.handleViewerChanged(this.viewer, undefined);\n\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n this.disabledColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-disabled-arrow-color')\n .trim();\n });\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n this.currentTransform = this.getTransformForHewRotation(newRotation);\n this.startingTransform = this.currentTransform;\n this.widget?.updateTransform(this.currentTransform);\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n />\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.controller?.beginTransform();\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDrag = async (event: PointerEvent): Promise<void> => {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null\n ) {\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angle - this.lastAngle\n );\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angle;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n this.lastAngle = 0;\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n });\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeUpdatedTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n this.widget = new TransformWidget(canvasRef, {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n disabledColor: this.disabledColor,\n });\n\n if (this.position != null) {\n this.currentTransform = Matrix4.makeTranslation(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n } else if (newPosition != null) {\n return Matrix4.makeTranslation(newPosition);\n }\n };\n\n private getTransformForHewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"],"version":3}
1
+ {"file":"vertex-viewer-transform-widget.entry.js","mappings":"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","names":["point","Point","Vector3","ray","Ray","Plane","Matrix4","Quaternion","Angle","BoundingBox","Rectangle","angle","classNames"],"sources":["./src/components/viewer-transform-widget/util.ts","./src/lib/transforms/axis-rotation.ts","./src/lib/transforms/hits.ts","./src/components/viewer-transform-widget/widget.ts","./src/components/viewer-transform-widget/viewer-transform-widget.css?tag=vertex-viewer-transform-widget&encapsulation=shadow","./src/components/viewer-transform-widget/viewer-transform-widget.tsx"],"sourcesContent":["import {\n Matrix4,\n Plane,\n Point,\n Quaternion,\n Ray,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport { Frame, Viewport } from '../../lib/types';\n\nexport function convertPointToCanvas(\n point: Point.Point,\n bounds?: DOMRect\n): Point.Point | undefined {\n return bounds != null\n ? Point.create(point.x - bounds.left, point.y - bounds.top)\n : undefined;\n}\n\nexport function convertCanvasPointToWorld(\n point?: Point.Point,\n frame?: Frame,\n viewport?: Viewport,\n transform?: Matrix4.Matrix4\n): Vector3.Vector3 | undefined {\n const position =\n transform != null ? Vector3.fromMatrixPosition(transform) : undefined;\n\n if (point != null && frame != null && viewport != null && position != null) {\n if (frame.scene.camera.isOrthographic()) {\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n );\n // Offset the point to past the bounding sphere of the model to\n // adjust the position plane location.\n const offsetPoint = Ray.at(\n Ray.create({\n origin: position,\n direction: frame.scene.camera.direction,\n }),\n Vector3.magnitude(frame.scene.camera.viewVector) * 2\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(\n frame.scene.camera.direction,\n offsetPoint\n )\n );\n } else {\n const ray = viewport.transformPointToRay(\n point,\n frame.image,\n frame.scene.camera\n );\n\n return Ray.intersectPlane(\n ray,\n Plane.fromNormalAndCoplanarPoint(frame.scene.camera.direction, position)\n );\n }\n }\n return undefined;\n}\n\nexport function computeUpdatedTransform(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n viewVector: Vector3.Vector3,\n angle: number,\n identifier: string\n): Matrix4.Matrix4 {\n switch (identifier) {\n case 'x-translate': {\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n computeTranslation(current, previous, next, Vector3.right()),\n 0,\n 0\n )\n )\n );\n }\n case 'y-translate':\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n 0,\n computeTranslation(current, previous, next, Vector3.up()),\n 0\n )\n )\n );\n case 'z-translate':\n return Matrix4.multiply(\n current,\n Matrix4.makeTranslation(\n Vector3.create(\n 0,\n 0,\n computeTranslation(current, previous, next, Vector3.back())\n )\n )\n );\n case 'x-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedRight = Vector3.transformMatrix(\n Vector3.right(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedLeft = Vector3.transformMatrix(\n Vector3.left(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedRight) >\n Vector3.dot(viewVector, rotatedLeft)\n ? rotatedRight\n : rotatedLeft;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n case 'y-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedUp = Vector3.transformMatrix(\n Vector3.up(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedDown = Vector3.transformMatrix(\n Vector3.down(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedUp) >\n Vector3.dot(viewVector, rotatedDown)\n ? rotatedUp\n : rotatedDown;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n case 'z-rotate': {\n const rotation = Quaternion.fromMatrixRotation(current);\n const rotatedForward = Vector3.transformMatrix(\n Vector3.forward(),\n Matrix4.makeRotation(rotation)\n );\n const rotatedBack = Vector3.transformMatrix(\n Vector3.back(),\n Matrix4.makeRotation(rotation)\n );\n\n const rotationAxis =\n Vector3.dot(viewVector, rotatedForward) >\n Vector3.dot(viewVector, rotatedBack)\n ? rotatedForward\n : rotatedBack;\n\n return computeRotation(\n Quaternion.fromAxisAngle(rotationAxis, angle),\n current\n );\n }\n default:\n return current;\n }\n}\n\nfunction computeTranslation(\n current: Matrix4.Matrix4,\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n direction: Vector3.Vector3\n): number {\n const rotatedTranslationAxis = Vector3.transformMatrix(\n direction,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(current))\n );\n const rotatedDelta = Vector3.multiply(\n rotatedTranslationAxis,\n Vector3.subtract(next, previous)\n );\n\n return rotatedDelta.x + rotatedDelta.y + rotatedDelta.z;\n}\n\n/**\n * Computes a rotation Matrix4 by applying the rotation at the given position,\n * then translating it back to convert it to a world delta.\n * @param rotation\n * @param current\n * @returns\n */\nexport function computeRotation(\n rotation: Quaternion.Quaternion,\n current: Matrix4.Matrix4\n): Matrix4.Matrix4 {\n return Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.multiply(\n Matrix4.makeTranslation(Vector3.fromMatrixPosition(current)),\n Matrix4.makeRotation(rotation)\n ),\n Matrix4.makeTranslation(\n Vector3.negate(Vector3.fromMatrixPosition(current))\n )\n ),\n current\n );\n}\n","import { Angle, Matrix4, Quaternion, Ray, Vector3 } from '@vertexvis/geometry';\n\nimport { FrameCameraBase } from '../types';\nimport { TriangleMeshPoints } from './mesh';\n\nexport function xAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.back(),\n Vector3.up(),\n triangleSize\n );\n}\n\nexport function yAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.right(),\n Vector3.back(),\n triangleSize\n );\n}\n\nexport function zAxisRotationPositions(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n triangleSize = 3\n): TriangleMeshPoints {\n return computeRotationNdcValues(\n widgetTransform,\n camera,\n Vector3.right(),\n Vector3.up(),\n triangleSize\n );\n}\n\nfunction computeRotationNdcValues(\n widgetTransform: Matrix4.Matrix4,\n camera: FrameCameraBase,\n xDirection: Vector3.Vector3,\n yDirection: Vector3.Vector3,\n triangleSize: number\n): TriangleMeshPoints {\n const transformedDirection = Vector3.transformMatrix(\n Vector3.add(xDirection, yDirection),\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const transformedX = Vector3.transformMatrix(\n xDirection,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const transformedY = Vector3.transformMatrix(\n yDirection,\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(widgetTransform))\n );\n const basePosition = Vector3.fromMatrixPosition(widgetTransform);\n const position = Vector3.add(\n basePosition,\n Vector3.scale(triangleSize * 10, transformedDirection)\n );\n\n const xRay = Ray.create({\n origin: position,\n direction: transformedX,\n });\n const yRay = Ray.create({\n origin: position,\n direction: transformedY,\n });\n const rotationAxis = Vector3.cross(transformedX, transformedY);\n\n const base = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(yRay, -triangleSize),\n rotationAxis,\n position\n );\n const right = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(xRay, triangleSize),\n rotationAxis,\n position\n );\n const up = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(yRay, triangleSize),\n rotationAxis,\n position\n );\n const left = Vector3.rotateAboutAxis(\n Angle.toRadians(45),\n Ray.at(xRay, -triangleSize),\n rotationAxis,\n position\n );\n\n return new TriangleMeshPoints(\n Vector3.dot(transformedX, camera.direction) !== -1 &&\n Vector3.dot(transformedY, camera.direction) !== -1,\n base,\n left,\n right,\n up,\n Vector3.transformMatrix(base, camera.projectionViewMatrix),\n Vector3.transformMatrix(left, camera.projectionViewMatrix),\n Vector3.transformMatrix(right, camera.projectionViewMatrix),\n Vector3.transformMatrix(up, camera.projectionViewMatrix)\n );\n}\n","import { BoundingBox, Point, Vector3 } from '@vertexvis/geometry';\n\nimport { Frame, Viewport } from '../../lib/types';\nimport { Drawable } from './drawable';\nimport { TriangleMesh } from './mesh';\n\nexport function testDrawable(\n drawable: Drawable,\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n if (drawable instanceof TriangleMesh) {\n return testTriangleMesh(drawable, frame, viewport, point);\n }\n return false;\n}\n\nexport function testTriangleMesh(\n mesh: TriangleMesh,\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n return (\n testTriangle(\n [mesh.points.worldLeft, mesh.points.worldRight, mesh.points.worldTip],\n frame,\n viewport,\n point\n ) ||\n testTriangle(\n [mesh.points.worldLeft, mesh.points.worldRight, mesh.points.worldBase],\n frame,\n viewport,\n point\n )\n );\n}\n\n/**\n * Adapted from https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm.\n */\nexport function testTriangle(\n points: Vector3.Vector3[],\n frame: Frame,\n viewport: Viewport,\n point: Point.Point\n): boolean {\n if (points.length === 3) {\n const ray = frame.scene.camera.isOrthographic()\n ? viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frame.scene.camera\n )\n : viewport.transformPointToRay(point, frame.image, frame.scene.camera);\n\n const edge1 = Vector3.subtract(points[1], points[0]);\n const edge2 = Vector3.subtract(points[2], points[0]);\n\n const epsilon = BoundingBox.epsilon(\n BoundingBox.fromVectors([ray.direction, ray.origin, edge1, edge2]) ??\n BoundingBox.create(edge1, edge2)\n );\n\n const p = Vector3.cross(ray.direction, edge2);\n const det = Vector3.dot(edge1, p);\n\n // This check causes a `det` of NaN or 0 to return false\n // without needing to perform the subsequent calculations.\n if (!(Math.abs(det) >= epsilon)) {\n return false;\n }\n\n const t = Vector3.subtract(ray.origin, points[0]);\n const u = Vector3.dot(t, p) / det;\n\n if (u < 0 || u > 1) {\n return false;\n }\n\n const q = Vector3.cross(t, edge1);\n const v = Vector3.dot(ray.direction, q) / det;\n\n if (v < 0 || u + v > 1) {\n return false;\n }\n\n const r = Vector3.dot(edge2, q) / det;\n\n // Ignore the case where the computed hit position is negative\n // if in orthographic to correctly return hit results when close\n // to the camera.\n // TODO: revisit with https://vertexvis.atlassian.net/browse/PLAT-1549\n return !isNaN(r) && (r > 0 || frame.scene.camera.isOrthographic());\n }\n return false;\n}\n","import { Matrix4 } from '@vertexvis/geometry';\nimport { Point, Rectangle, Vector3 } from '@vertexvis/geometry';\nimport { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\nimport regl from 'regl';\nimport shapeBuilder from 'regl-shape';\n\nimport {\n axisPositions,\n rotationAxisPositions,\n} from '../../lib/transforms/axis-lines';\nimport {\n xAxisRotationPositions,\n yAxisRotationPositions,\n zAxisRotationPositions,\n} from '../../lib/transforms/axis-rotation';\nimport {\n xAxisArrowPositions,\n yAxisArrowPositions,\n zAxisArrowPositions,\n} from '../../lib/transforms/axis-translation';\nimport {\n computeDrawable2dBounds,\n Drawable,\n} from '../../lib/transforms/drawable';\nimport { testDrawable } from '../../lib/transforms/hits';\nimport { AxisLine, RotationLine } from '../../lib/transforms/line';\nimport { TriangleMesh } from '../../lib/transforms/mesh';\nimport { CreateShape } from '../../lib/transforms/shape';\nimport { Frame } from '../../lib/types';\nimport { ReglComponent } from '../../lib/webgl/regl-component';\n\nexport interface DrawableElementColors {\n xArrow?: Color.Color | string;\n yArrow?: Color.Color | string;\n zArrow?: Color.Color | string;\n hovered?: Color.Color | string;\n outline?: Color.Color | string;\n disabledColor?: Color.Color | string;\n}\n\nexport interface DisabledAxis {\n xRotation: boolean;\n yRotation: boolean;\n zRotation: boolean;\n xTranslation: boolean;\n yTranslation: boolean;\n zTranslation: boolean;\n}\n\nexport class TransformWidget extends ReglComponent {\n private cursor?: Point.Point;\n\n private xAxis?: AxisLine;\n private yAxis?: AxisLine;\n private zAxis?: AxisLine;\n private xArrow?: TriangleMesh;\n private yArrow?: TriangleMesh;\n private zArrow?: TriangleMesh;\n private xRotation?: TriangleMesh;\n private xyRotationLine?: RotationLine;\n private xzRotationLine?: RotationLine;\n private yRotation?: TriangleMesh;\n private yxRotationLine?: RotationLine;\n private yzRotationLine?: RotationLine;\n private zRotation?: TriangleMesh;\n private zxRotationLine?: RotationLine;\n private zyRotationLine?: RotationLine;\n\n private disabledAxis: DisabledAxis = {\n xTranslation: false,\n yTranslation: false,\n zTranslation: false,\n xRotation: false,\n yRotation: false,\n zRotation: false,\n };\n\n private axisLines: AxisLine[] = [];\n private rotationLines: RotationLine[] = [];\n private translationMeshes: TriangleMesh[] = [];\n private rotationMeshes: TriangleMesh[] = [];\n private hoveredElement?: Drawable;\n\n private transform?: Matrix4.Matrix4;\n private bounds?: Rectangle.Rectangle;\n\n private hoveredChanged = new EventDispatcher<Drawable | undefined>();\n\n private xArrowFillColor?: Color.Color | string;\n private yArrowFillColor?: Color.Color | string;\n private zArrowFillColor?: Color.Color | string;\n\n private hoveredArrowFillColor?: Color.Color | string;\n private outlineColor?: Color.Color | string;\n\n private disabledColor: Color.Color | string;\n\n public constructor(\n canvasElement: HTMLCanvasElement,\n colors: DrawableElementColors = {}\n ) {\n super(canvasElement);\n\n this.xArrowFillColor = colors.xArrow;\n this.yArrowFillColor = colors.yArrow;\n this.zArrowFillColor = colors.zArrow;\n this.hoveredArrowFillColor = colors.hovered;\n this.outlineColor = colors.outline;\n this.disabledColor = colors.disabledColor ?? '#cccccc';\n }\n\n public dispose(): void {\n this.reglFrameDisposable?.cancel();\n }\n\n /**\n * @internal - visible for testing\n */\n public getDrawableElements(): Drawable[] {\n return this.drawableElements;\n }\n\n public boundsContainsPoint(point: Point.Point): boolean {\n return (\n this.bounds != null &&\n this.frame != null &&\n Rectangle.containsPoints(this.bounds, point)\n );\n }\n\n public updateDisabledAxis(axis: Partial<DisabledAxis>): void {\n this.disabledAxis = {\n ...this.disabledAxis,\n ...axis,\n };\n this.updateDisabledOnTriangles();\n }\n\n public updateCursor(cursor?: Point.Point): void {\n this.cursor = cursor;\n\n if (cursor != null && this.frame != null) {\n this.updateHovered();\n } else {\n this.clearHovered();\n }\n }\n\n public updateTransform(transform?: Matrix4.Matrix4): void {\n this.transform = transform;\n\n if (transform != null && this.frame != null) {\n this.updateAndDraw();\n } else {\n this.clear();\n this.reglFrameDisposable?.cancel();\n this.reglFrameDisposable = undefined;\n }\n }\n\n public updateColors(colors: DrawableElementColors = {}): void {\n this.xArrowFillColor = colors.xArrow ?? this.xArrowFillColor;\n this.yArrowFillColor = colors.yArrow ?? this.yArrowFillColor;\n this.zArrowFillColor = colors.zArrow ?? this.zArrowFillColor;\n this.hoveredArrowFillColor = colors.hovered ?? this.hoveredArrowFillColor;\n this.outlineColor = colors.outline ?? this.outlineColor;\n\n this.xAxis?.updateFillColor(this.disabledColor);\n this.yAxis?.updateFillColor(this.disabledColor);\n this.zAxis?.updateFillColor(this.disabledColor);\n\n this.xArrow?.updateFillColor(this.getXTranslationColor());\n this.yArrow?.updateFillColor(this.getYTranslationColor());\n this.zArrow?.updateFillColor(this.getZTranslationColor());\n this.xRotation?.updateFillColor(this.getXRotationColor());\n this.yRotation?.updateFillColor(this.getYRotationColor());\n this.zRotation?.updateFillColor(this.getZRotationColor());\n this.hoveredElement?.updateFillColor(this.hoveredArrowFillColor);\n }\n\n public onHoveredChanged(\n listener: Listener<Drawable | undefined>\n ): Disposable {\n return this.hoveredChanged.on(listener);\n }\n\n private updateDisabledOnTriangles(): void {\n this.xRotation?.setDisabled(this.disabledAxis.xRotation);\n this.yRotation?.setDisabled(this.disabledAxis.yRotation);\n this.zRotation?.setDisabled(this.disabledAxis.zRotation);\n this.xArrow?.setDisabled(this.disabledAxis.xTranslation);\n this.yArrow?.setDisabled(this.disabledAxis.yTranslation);\n this.zArrow?.setDisabled(this.disabledAxis.zTranslation);\n\n this.updateColors();\n }\n\n private updateHovered(): void {\n const previousHovered = this.hoveredElement;\n const currentFrame = this.frame;\n\n if (currentFrame != null) {\n this.hoveredElement = [...this.translationMeshes, ...this.rotationMeshes]\n .filter((el) => el.points.valid && !el.isDisabled())\n .find((m) =>\n this.cursor != null\n ? testDrawable(m, currentFrame, this.viewport, this.cursor)\n : false\n );\n\n if (this.hoveredElement !== previousHovered) {\n this.hoveredChanged.emit(this.hoveredElement);\n this.hoveredElement?.updateFillColor(this.hoveredArrowFillColor);\n previousHovered?.updateFillColor(previousHovered?.initialFillColor);\n }\n }\n }\n\n private clearHovered(): void {\n const previousHovered = this.hoveredElement;\n this.hoveredElement = undefined;\n\n if (this.hoveredElement !== previousHovered) {\n this.hoveredChanged.emit(this.hoveredElement);\n previousHovered.updateFillColor(previousHovered.initialFillColor);\n }\n }\n\n protected hasData(): boolean {\n return this.transform != null;\n }\n\n protected createOrUpdateElements(): void {\n if (this.transform != null && this.frame != null) {\n if (this.xArrow == null || this.yArrow == null || this.zArrow == null) {\n this.createElements(this.transform, this.frame);\n } else {\n this.updateElements(this.transform, this.frame);\n }\n\n this.bounds = computeDrawable2dBounds(\n this.viewport,\n ...this.rotationMeshes,\n ...this.translationMeshes\n );\n }\n }\n\n private createElements(transform: Matrix4.Matrix4, frame: Frame): void {\n this.reglCommand = regl({\n canvas: this.canvasElement,\n extensions: 'angle_instanced_arrays',\n });\n const { createShape } = shapeBuilder(this.reglCommand);\n\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n this.xArrow = new TriangleMesh(\n createShape,\n 'x-translate',\n xAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getXTranslationColor()\n );\n\n this.xRotation = new TriangleMesh(\n createShape,\n 'x-rotate',\n xAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getXRotationColor()\n );\n this.xAxis = new AxisLine(\n createShape,\n 'x-axis',\n axisPositions(transform, frame.scene.camera, this.xArrow),\n this.outlineColor,\n this.getXTranslationColor()\n );\n this.yArrow = new TriangleMesh(\n createShape,\n 'y-translate',\n yAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getYTranslationColor()\n );\n\n this.yRotation = new TriangleMesh(\n createShape,\n 'y-rotate',\n yAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getYRotationColor()\n );\n this.yAxis = new AxisLine(\n createShape,\n 'y-axis',\n axisPositions(transform, frame.scene.camera, this.yArrow),\n this.outlineColor,\n this.getYTranslationColor()\n );\n this.zArrow = new TriangleMesh(\n createShape,\n 'z-translate',\n zAxisArrowPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getZTranslationColor()\n );\n this.zAxis = new AxisLine(\n createShape,\n 'z-axis',\n axisPositions(transform, frame.scene.camera, this.zArrow),\n this.outlineColor,\n this.getZTranslationColor()\n );\n this.zRotation = new TriangleMesh(\n createShape,\n 'z-rotate',\n zAxisRotationPositions(transform, frame.scene.camera, triangleSize),\n this.outlineColor,\n this.getZRotationColor()\n );\n\n this.createRotationLines(createShape, transform, frame);\n\n this.axisLines = [this.xAxis, this.yAxis, this.zAxis];\n this.translationMeshes = [this.xArrow, this.yArrow, this.zArrow];\n this.rotationMeshes = [this.xRotation, this.yRotation, this.zRotation];\n this.updateDisabledOnTriangles();\n\n this.availableElements = [\n ...this.axisLines,\n ...this.rotationLines,\n ...this.translationMeshes,\n ...this.rotationMeshes,\n ];\n }\n\n private getXRotationColor(): Color.Color | string | undefined {\n return this.xRotation?.isDisabled()\n ? this.disabledColor\n : this.xArrowFillColor;\n }\n\n private getYRotationColor(): Color.Color | string | undefined {\n return this.yRotation?.isDisabled()\n ? this.disabledColor\n : this.yArrowFillColor;\n }\n\n private getZRotationColor(): Color.Color | string | undefined {\n return this.zRotation?.isDisabled()\n ? this.disabledColor\n : this.zArrowFillColor;\n }\n\n private getXTranslationColor(): Color.Color | string | undefined {\n return this.xArrow?.isDisabled()\n ? this.disabledColor\n : this.xArrowFillColor;\n }\n\n private getYTranslationColor(): Color.Color | string | undefined {\n return this.yArrow?.isDisabled()\n ? this.disabledColor\n : this.yArrowFillColor;\n }\n\n private getZTranslationColor(): Color.Color | string | undefined {\n return this.zArrow?.isDisabled()\n ? this.disabledColor\n : this.zArrowFillColor;\n }\n\n private createRotationLines(\n createShape: CreateShape,\n transform: Matrix4.Matrix4,\n frame: Frame\n ): void {\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n const xyRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n );\n const xzRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n );\n const yxRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n );\n const yzRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n );\n const zxRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n );\n const zyRotationLinePoints = rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n );\n\n if (xyRotationLinePoints != null) {\n this.xyRotationLine = new RotationLine(\n createShape,\n 'xy-rotation-line',\n xyRotationLinePoints,\n this.outlineColor\n );\n }\n if (xzRotationLinePoints != null) {\n this.xzRotationLine = new RotationLine(\n createShape,\n 'xz-rotation-line',\n xzRotationLinePoints,\n this.outlineColor\n );\n }\n if (yxRotationLinePoints != null) {\n this.yxRotationLine = new RotationLine(\n createShape,\n 'yx-rotation-line',\n yxRotationLinePoints,\n this.outlineColor\n );\n }\n if (yzRotationLinePoints != null) {\n this.yzRotationLine = new RotationLine(\n createShape,\n 'yz-rotation-line',\n yzRotationLinePoints,\n this.outlineColor\n );\n }\n if (zxRotationLinePoints != null) {\n this.zxRotationLine = new RotationLine(\n createShape,\n 'zx-rotation-line',\n zxRotationLinePoints,\n this.outlineColor\n );\n }\n if (zyRotationLinePoints != null) {\n this.zyRotationLine = new RotationLine(\n createShape,\n 'zy-rotation-line',\n zyRotationLinePoints,\n this.outlineColor\n );\n }\n\n this.rotationLines = [\n this.xyRotationLine,\n this.xzRotationLine,\n this.yxRotationLine,\n this.yzRotationLine,\n this.zxRotationLine,\n this.zyRotationLine,\n ].filter((l) => l != null) as RotationLine[];\n }\n\n private updateElements(transform: Matrix4.Matrix4, frame: Frame): void {\n const triangleSize = this.computeTriangleSize(\n Vector3.fromMatrixPosition(transform),\n frame\n );\n\n if (this.xArrow != null) {\n this.xArrow.updatePoints(\n xAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.xAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.xArrow)\n );\n }\n this.xRotation?.updatePoints(\n xAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n if (this.yArrow != null) {\n this.yArrow.updatePoints(\n yAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.yAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.yArrow)\n );\n }\n this.yRotation?.updatePoints(\n yAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n if (this.zArrow != null) {\n this.zArrow.updatePoints(\n zAxisArrowPositions(transform, frame.scene.camera, triangleSize)\n );\n this.zAxis?.updatePoints(\n axisPositions(transform, frame.scene.camera, this.zArrow)\n );\n }\n this.zRotation?.updatePoints(\n zAxisRotationPositions(transform, frame.scene.camera, triangleSize)\n );\n\n this.xyRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n )\n );\n this.xzRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.xRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n )\n );\n this.yxRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n )\n );\n this.yzRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.yRotation,\n this.zArrow?.points.worldTip,\n triangleSize\n )\n );\n this.zxRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.xArrow?.points.worldTip,\n triangleSize\n )\n );\n this.zyRotationLine?.updatePoints(\n rotationAxisPositions(\n frame.scene.camera,\n this.zRotation,\n this.yArrow?.points.worldTip,\n triangleSize\n )\n );\n }\n}\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-transform-widget-x-axis-arrow-color: A CSS color for the arrow\n * at the end of the X axis on this widget. Defaults to `#ea3324`.\n */\n --viewer-transform-widget-x-axis-arrow-color: var(--x-axis-color);\n\n /**\n * @prop --viewer-transform-widget-y-axis-arrow-color: A CSS color for the arrow\n * at the end of the Y axis on this widget. Defaults to `#4faf32`.\n */\n --viewer-transform-widget-y-axis-arrow-color: var(--y-axis-color);\n\n /**\n * @prop --viewer-transform-widget-z-axis-arrow-color: A CSS color for the arrow\n * at the end of the Z axis on this widget. Defaults to `#0000ff`.\n */\n --viewer-transform-widget-z-axis-arrow-color: var(--z-axis-color);\n\n\n /**\n * @prop --viewer-transform-widget-hovered-arrow-color: A CSS color for the arrow\n * when it is hovered. Defaults to `#ffff00`.\n */\n --viewer-transform-widget-hovered-arrow-color: #ffff00;\n\n /**\n * @prop --viewer-transform-widget-disabled-arrow-color: A CSS color for the arrow\n * when it is disabled. Defaults to `#cccccc`.\n */\n --viewer-transform-widget-disabled-arrow-color: #cccccc;\n}\n\n.widget {\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.widget.hovered {\n pointer-events: auto;\n}","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport {\n Angle,\n Euler,\n Matrix4,\n Point,\n Quaternion,\n Vector3,\n} from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { readDOM, writeDOM } from '../../lib/stencil';\nimport { TransformController } from '../../lib/transforms/controller';\nimport { Drawable } from '../../lib/transforms/drawable';\nimport {\n computeUpdatedTransform,\n convertCanvasPointToWorld,\n convertPointToCanvas,\n} from './util';\nimport { TransformWidget } from './widget';\n\n@Component({\n tag: 'vertex-viewer-transform-widget',\n styleUrl: 'viewer-transform-widget.css',\n shadow: true,\n})\nexport class ViewerTransformWidget {\n /**\n * An event that is emitted when the position of the widget changes.\n */\n @Event({ bubbles: true })\n public positionChanged!: EventEmitter<Vector3.Vector3 | undefined>;\n\n /**\n * An event that is emitted when the rotation of the widget changes.\n */\n @Event({ bubbles: true })\n public rotationChanged!: EventEmitter<Euler.Euler | undefined>;\n\n /**\n * An event that is emitted when the interaction has ended\n */\n @Event({ bubbles: true })\n public interactionEnded!: EventEmitter<Matrix4.Matrix4 | undefined>;\n\n /**\n * An event that is emitted an interaction with the widget has started\n */\n @Event({ bubbles: true })\n public interactionStarted!: EventEmitter<void>;\n\n /**\n * The viewer to connect to transforms. If nested within a <vertex-viewer>,\n * this property will be populated automatically.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The starting position of this transform widget. This position will be updated\n * as transforms occur. Setting this value to `undefined` will remove the widget.\n */\n @Prop({ mutable: true })\n public position?: Vector3.Vector3;\n\n /**\n * The starting angle for the transform widget. This rotation will be updated\n * as the rotations occur.\n */\n @Prop({ mutable: true })\n public rotation?: Euler.Euler;\n\n /**\n * The controller that is responsible for performing transforms.\n */\n @Prop({ mutable: true })\n public controller?: TransformController;\n\n /**\n * Determines whether or not the x-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xRotationDisabled = false;\n\n /**\n * Determines whether or not the y-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yRotationDisabled = false;\n\n /**\n * Determines whether or not the z-rotation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zRotationDisabled = false;\n\n /**\n * Determines whether or not the x-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public xTranslationDisabled = false;\n\n /**\n * Determines whether or not the y-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public yTranslationDisabled = false;\n\n /**\n * Determines whether or not the z-translation is disabled on the widget\n */\n @Prop({ mutable: true })\n public zTranslationDisabled = false;\n\n /**\n * @internal\n * @ignore\n *\n * Visible for testing.\n */\n @Prop({ mutable: true })\n public hovered?: Drawable;\n\n @Element()\n private hostEl!: HTMLElement;\n\n private startingTransform?: Matrix4.Matrix4;\n private currentTransform?: Matrix4.Matrix4;\n\n private xArrowColor: Color.Color | string = '#ea3324';\n private yArrowColor: Color.Color | string = '#4faf32';\n private zArrowColor: Color.Color | string = '#0000ff';\n private hoveredColor: Color.Color | string = '#ffff00';\n private disabledColor: Color.Color | string = '#cccccc';\n\n private widget?: TransformWidget;\n private dragging?: Drawable;\n private lastAngle = 0;\n private lastWorldPosition?: Vector3.Vector3;\n\n private canvasBounds?: DOMRect;\n private canvasResizeObserver?: ResizeObserver;\n private canvasRef?: HTMLCanvasElement;\n\n private hoveredChangeDisposable?: Disposable;\n\n protected componentDidLoad(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver = new ResizeObserver(this.handleResize);\n\n if (this.canvasRef != null) {\n this.canvasResizeObserver.observe(this.canvasRef);\n\n this.setupTransformWidget(this.canvasRef);\n }\n\n this.handleViewerChanged(this.viewer, undefined);\n\n readDOM(() => {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n this.xArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-x-axis-arrow-color')\n .trim();\n this.yArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-y-axis-arrow-color')\n .trim();\n this.zArrowColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-z-axis-arrow-color')\n .trim();\n this.hoveredColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-hovered-arrow-color')\n .trim();\n this.disabledColor = hostStyles\n .getPropertyValue('--viewer-transform-widget-disabled-arrow-color')\n .trim();\n });\n }\n\n protected disconnectedCallback(): void {\n window.removeEventListener('pointermove', this.handlePointerMove);\n\n this.canvasResizeObserver?.disconnect();\n\n this.hoveredChangeDisposable?.dispose();\n this.widget?.dispose();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n oldViewer?.removeEventListener('frameDrawn', this.handleViewerFrameDrawn);\n oldViewer?.removeEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n newViewer?.addEventListener('frameDrawn', this.handleViewerFrameDrawn);\n newViewer?.addEventListener(\n 'dimensionschange',\n this.handleViewerDimensionsChange\n );\n\n if (newViewer?.stream != null) {\n this.controller?.dispose();\n this.controller = new TransformController(newViewer.stream);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('xTranslationDisabled')\n @Watch('yTranslationDisabled')\n @Watch('zTranslationDisabled')\n @Watch('xRotationDisabled')\n @Watch('yRotationDisabled')\n @Watch('zRotationDisabled')\n protected handleDisabledPropertyChanged(): void {\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n }\n\n /**\n * @ignore\n */\n @Watch('rotation')\n protected handleRotationChanged(\n newRotation: Euler.Euler,\n oldRotation?: Euler.Euler\n ): void {\n this.currentTransform = this.getTransformForNewRotation(newRotation);\n this.startingTransform = this.currentTransform;\n this.widget?.updateTransform(this.currentTransform);\n console.debug(\n `Updating widget rotation [previous=${JSON.stringify(\n oldRotation\n )}, current=${JSON.stringify(newRotation)}]`\n );\n\n this.rotationChanged.emit(newRotation);\n }\n\n /**\n * @ignore\n */\n @Watch('position')\n protected handlePositionChanged(\n newPosition?: Vector3.Vector3,\n oldPosition?: Vector3.Vector3\n ): void {\n this.currentTransform = this.getTransformForNewPosition(newPosition);\n this.startingTransform = this.currentTransform;\n\n console.debug(\n `Updating widget position [previous=${JSON.stringify(\n oldPosition\n )}, current=${JSON.stringify(newPosition)}]`\n );\n this.widget?.updateTransform(this.currentTransform);\n\n if (newPosition == null) {\n this.controller?.clearTransform();\n }\n\n this.positionChanged.emit(newPosition);\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <canvas\n ref={(el) => {\n this.canvasRef = el;\n }}\n class={classNames('widget', {\n hovered: this.hovered != null,\n })}\n width={this.viewer?.viewport.width}\n height={this.viewer?.viewport.height}\n onPointerDown={this.handleBeginDrag}\n />\n </Host>\n );\n }\n\n private handleHoveredDrawableChanged = (drawable?: Drawable): void => {\n this.hovered = drawable;\n };\n\n private handleViewerFrameDrawn = (): void => {\n this.updatePropsFromViewer();\n };\n\n private handleViewerDimensionsChange = (): void => {\n writeDOM(() => {\n if (this.viewer != null && this.canvasRef != null) {\n this.canvasRef.width = this.viewer.viewport.width;\n this.canvasRef.height = this.viewer.viewport.height;\n\n this.updateCanvasBounds(this.canvasRef);\n }\n });\n };\n\n private handleResize = (): void => {\n if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n }\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (this.dragging == null) {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n if (canvasPoint != null && widget.boundsContainsPoint(canvasPoint)) {\n widget.updateCursor(canvasPoint);\n } else {\n widget.updateCursor(undefined);\n this.hovered = undefined;\n }\n }\n };\n\n private handleBeginDrag = async (event: PointerEvent): Promise<void> => {\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.hovered != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.position != null &&\n this.viewer.frame != null\n ) {\n this.dragging = this.hovered;\n\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n this.lastAngle =\n currentCanvas != null\n ? Angle.fromPoints(widgetCenter, currentCanvas)\n : 0;\n\n this.lastWorldPosition = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n this.controller?.beginTransform();\n this.interactionStarted.emit();\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleEndTransform);\n }\n };\n\n private handleDrag = async (event: PointerEvent): Promise<void> => {\n // Prevent selection of text and interaction with view cube while dragging the widget\n event.preventDefault();\n\n const canvasBounds = this.getCanvasBounds();\n\n if (\n this.dragging != null &&\n this.lastWorldPosition != null &&\n canvasBounds != null &&\n this.viewer != null &&\n this.viewer.frame != null &&\n this.position != null\n ) {\n const currentCanvas = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n canvasBounds\n );\n const widgetCenter = this.viewer.viewport.transformWorldToViewport(\n this.position,\n this.viewer.frame.scene.camera.projectionViewMatrix\n );\n\n const currentWorld = convertCanvasPointToWorld(\n currentCanvas,\n this.viewer?.frame,\n this.viewer?.viewport,\n this.currentTransform\n );\n\n if (\n currentWorld != null &&\n currentCanvas != null &&\n widgetCenter != null\n ) {\n const angle = Angle.fromPoints(widgetCenter, currentCanvas);\n\n this.transform(\n this.lastWorldPosition,\n currentWorld,\n angle - this.lastAngle\n );\n\n this.lastWorldPosition = currentWorld;\n this.lastAngle = angle;\n }\n }\n };\n\n private handleEndTransform = async (event: PointerEvent): Promise<void> => {\n const canvasPoint = convertPointToCanvas(\n Point.create(event.clientX, event.clientY),\n this.getCanvasBounds()\n );\n const widget = this.getTransformWidget();\n\n this.dragging = undefined;\n this.lastWorldPosition = undefined;\n this.position =\n this.currentTransform != null\n ? Vector3.fromMatrixPosition(this.currentTransform)\n : this.position;\n this.lastAngle = 0;\n\n widget.updateCursor(canvasPoint);\n widget.updateTransform(this.currentTransform);\n\n widget.updateDisabledAxis({\n xRotation: true,\n yRotation: true,\n zRotation: true,\n xTranslation: true,\n yTranslation: true,\n zTranslation: true,\n });\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleEndTransform);\n\n try {\n const delta = this.controller?.getCurrentDelta();\n\n await this.controller?.endTransform();\n\n this.interactionEnded.emit(delta);\n } catch (e) {\n console.error('Failed to end transform interaction', e);\n }\n\n window.addEventListener('pointermove', this.handlePointerMove);\n\n this.getTransformWidget().updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n };\n\n private updatePropsFromViewer = (): void => {\n const { frame } = this.viewer || {};\n\n if (frame != null) {\n const widget = this.getTransformWidget();\n\n widget.updateFrame(frame, this.dragging == null);\n }\n };\n\n private transform(\n previous: Vector3.Vector3,\n next: Vector3.Vector3,\n angle: number\n ): void {\n if (\n this.position != null &&\n this.startingTransform != null &&\n this.currentTransform != null &&\n this.dragging != null &&\n this.viewer != null &&\n this.viewer.frame != null\n ) {\n this.currentTransform = computeUpdatedTransform(\n this.currentTransform,\n previous,\n next,\n this.viewer?.frame.scene.camera.viewVector,\n angle,\n this.dragging.identifier\n );\n\n this.getTransformWidget().updateTransform(this.currentTransform);\n this.controller?.updateTransform(\n Matrix4.multiply(\n this.currentTransform,\n Matrix4.invert(this.startingTransform)\n )\n );\n }\n }\n\n private handleSettingDisabledAxis(): void {\n if (this.widget) {\n this.widget.updateDisabledAxis({\n xRotation: this.xRotationDisabled,\n yRotation: this.yRotationDisabled,\n zRotation: this.zRotationDisabled,\n xTranslation: this.xTranslationDisabled,\n yTranslation: this.yTranslationDisabled,\n zTranslation: this.zTranslationDisabled,\n });\n } else {\n console.warn('Cannot set disabled values - no widget defined');\n }\n }\n\n private setupTransformWidget = (\n canvasRef: HTMLCanvasElement\n ): TransformWidget => {\n console.debug(\n `Initializing transform widget. [initial-position=${JSON.stringify(\n this.position\n )}, has-initial-frame=${this.viewer?.frame != null}]`\n );\n\n this.widget = new TransformWidget(canvasRef, {\n xArrow: this.xArrowColor,\n yArrow: this.yArrowColor,\n zArrow: this.zArrowColor,\n hovered: this.hoveredColor,\n disabledColor: this.disabledColor,\n });\n\n if (this.rotation != null) {\n this.currentTransform = this.getTransformForNewRotation(this.rotation);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n\n if (this.position != null) {\n this.currentTransform = Matrix4.makeTranslation(this.position);\n this.startingTransform = this.currentTransform;\n this.widget.updateTransform(this.currentTransform);\n }\n if (this.viewer?.frame != null) {\n this.widget.updateFrame(this.viewer.frame, true);\n }\n\n this.handleSettingDisabledAxis();\n\n this.hoveredChangeDisposable = this.widget.onHoveredChanged(\n this.handleHoveredDrawableChanged\n );\n\n return this.widget;\n };\n\n private updateCanvasBounds = (canvasElement: HTMLCanvasElement): void => {\n readDOM(() => {\n this.canvasBounds = canvasElement.getBoundingClientRect();\n\n this.getTransformWidget().updateDimensions(canvasElement);\n });\n };\n\n private getTransformForNewPosition = (\n newPosition?: Vector3.Vector3\n ): Matrix4.Matrix4 | undefined => {\n if (newPosition != null) {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const currentRotation = Matrix4.makeRotation(\n Quaternion.fromMatrixRotation(c)\n );\n const position = Matrix4.makeTranslation(newPosition);\n\n return Matrix4.multiply(position, currentRotation);\n } else if (newPosition != null) {\n return Matrix4.makeTranslation(newPosition);\n }\n };\n\n private getTransformForNewRotation = (\n newRotationEuler: Euler.Euler\n ): Matrix4.Matrix4 | undefined => {\n const c =\n this.currentTransform != null\n ? this.currentTransform\n : Matrix4.makeIdentity();\n\n const oldRotation = Matrix4.invert(\n Matrix4.makeRotation(Quaternion.fromMatrixRotation(c))\n );\n\n const newRotation = Matrix4.makeRotation(\n Quaternion.fromEuler(newRotationEuler)\n );\n const oldTranslation = Matrix4.multiply(c, oldRotation);\n\n return Matrix4.multiply(oldTranslation, newRotation);\n };\n\n private getCanvasBounds = (): DOMRect | undefined => {\n if (this.canvasBounds != null) {\n return this.canvasBounds;\n } else if (this.canvasRef != null) {\n this.updateCanvasBounds(this.canvasRef);\n return this.canvasBounds;\n }\n };\n\n private getTransformWidget = (): TransformWidget => {\n if (this.widget == null && this.canvasRef != null) {\n return this.setupTransformWidget(this.canvasRef);\n } else if (this.widget != null) {\n return this.widget;\n } else {\n throw new Error(\n 'Transform widget was not initialized. The canvas element may not have been initialized.'\n );\n }\n };\n}\n"],"version":3}
@@ -3,4 +3,11 @@ import { Frame, Viewport } from '../../lib/types';
3
3
  export declare function convertPointToCanvas(point: Point.Point, bounds?: DOMRect): Point.Point | undefined;
4
4
  export declare function convertCanvasPointToWorld(point?: Point.Point, frame?: Frame, viewport?: Viewport, transform?: Matrix4.Matrix4): Vector3.Vector3 | undefined;
5
5
  export declare function computeUpdatedTransform(current: Matrix4.Matrix4, previous: Vector3.Vector3, next: Vector3.Vector3, viewVector: Vector3.Vector3, angle: number, identifier: string): Matrix4.Matrix4;
6
- export declare function computeRotation(rotationAxis: Quaternion.Quaternion, current: Matrix4.Matrix4): Matrix4.Matrix4;
6
+ /**
7
+ * Computes a rotation Matrix4 by applying the rotation at the given position,
8
+ * then translating it back to convert it to a world delta.
9
+ * @param rotation
10
+ * @param current
11
+ * @returns
12
+ */
13
+ export declare function computeRotation(rotation: Quaternion.Quaternion, current: Matrix4.Matrix4): Matrix4.Matrix4;
@@ -118,7 +118,7 @@ export declare class ViewerTransformWidget {
118
118
  private setupTransformWidget;
119
119
  private updateCanvasBounds;
120
120
  private getTransformForNewPosition;
121
- private getTransformForHewRotation;
121
+ private getTransformForNewRotation;
122
122
  private getCanvasBounds;
123
123
  private getTransformWidget;
124
124
  }
@@ -18,6 +18,7 @@ export * from './lib/interactions/keyInteraction';
18
18
  export * from './lib/measurement';
19
19
  export * from './lib/pins';
20
20
  export { Scene } from './lib/scenes';
21
+ export * from './lib/transforms';
21
22
  export { EntityType, FrameCameraBase, LoadableResource, Frame as ReceivedFrame, FrameImage as ReceivedFrameImage, FrameScene as ReceivedFrameScene, FrameOrthographicCamera as ReceivedOrthographicCamera, FramePerspectiveCamera as ReceivedPerspectiveCamera, SynchronizedClock, Viewport, } from './lib/types';
22
23
  export * from './lib/types/markup';
23
24
  export * from './lib/types/measurementUnits';
@@ -0,0 +1,3 @@
1
+ import * as TransformationDelta from './transformation-delta';
2
+ export { TransformationDelta };
3
+ export * from './controller';
@@ -0,0 +1,34 @@
1
+ import { Matrix4, Vector3 } from '@vertexvis/geometry';
2
+ export declare const ALMOST_ONE = 0.9999;
3
+ /**
4
+ * For any single vector, there are an infinite number of potential orthogonal vectors. This function will determine
5
+ * one orthogonal vector by crossing the provided vector with a unit vector in the positive X, Y, or Z directions.
6
+ * @param normal
7
+ * @returns
8
+ */
9
+ export declare function chooseOrthogonalVector(normal: Vector3.Vector3): Vector3.Vector3;
10
+ /**
11
+ * Computes the rotation matrix for two normals. If both normals are neither parallel or anti-parallel,
12
+ * this will compute the rotation matrix delta based on the angle from both normals.
13
+ * If the normals are anti-parallel, the identity matrix will be returned, as no rotation is necessary in this case.
14
+ * If the normals are parallel, an axis direction based on a chosen orthogonal vector will be used
15
+ * to compute the rotation matrix to rotate the plane 180 degrees.
16
+ * @param normal1
17
+ * @param normal2
18
+ * @returns an anti-parallel rotation Matrix4 betwen the given normals
19
+ */
20
+ export declare function computeRotationMatrix(normal1: Vector3.Vector3, normal2: Vector3.Vector3): Matrix4.Matrix4;
21
+ /**
22
+ * Computes the translation & rotation matrix delta between two world positions and two normals.
23
+ * such that the computed translation matrix will be the delta between position 1 and position 2,
24
+ * and the rotation will be rotated to be anti-parallel.
25
+ *
26
+ * @param normal1
27
+ * @param position1
28
+ * @param normal2
29
+ * @param position2
30
+ *
31
+ * @returns Matrix4 translation matrix delta from position1 to
32
+ * position2 & an anti-parallel rotation delta.
33
+ */
34
+ export declare function computeTransformationDelta(normal1: Vector3.Vector3, position1: Vector3.Vector3, normal2: Vector3.Vector3, position2: Vector3.Vector3): Matrix4.Matrix4;
@@ -3,3 +3,4 @@ import { Point, Vector3 } from '@vertexvis/geometry';
3
3
  export declare const random: Chance.Chance;
4
4
  export declare function randomPoint(): Point.Point;
5
5
  export declare function randomVector3(): Vector3.Vector3;
6
+ export declare function randomNormalVector3(): Vector3.Vector3;
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
3
  */
4
- export{c as ColorMaterial,l as LoadableResource,S as Scene,a as SynchronizedClock}from"./p-bfcc290d.js";export{S as SceneTreeController}from"./p-33db241f.js";export{f as fromNodeProto,i as isLoadedRow}from"./p-c5381b4a.js";export{C as CursorManager,b as boxQueryCursor,l as labelPinCursor,m as measurementCursor,a as measurementWithArrowCursor,p as pinCursor}from"./p-3a256fe9.js";export{M as MeasurementController,a as MeasurementEntity}from"./p-a5417053.js";export{M as MeasurementModel}from"./p-867331de.js";export{M as MeasurementOverlayManager}from"./p-db85855d.js";export{m as makeMinimumDistanceResult}from"./p-99f8e7e0.js";export{A as AngleUnits,f as AreaUnits,D as DistanceUnits,F as FrameCameraBase,a as ReceivedFrame,b as ReceivedFrameImage,c as ReceivedFrameScene,d as ReceivedOrthographicCamera,e as ReceivedPerspectiveCamera}from"./p-f12cfb57.js";export{E as EntityType}from"./p-e1d82323.js";export{A as ArrowMarkup,C as CircleMarkup,F as FreeformMarkup}from"./p-39d1f26c.js";export{V as Viewport}from"./p-1bb66e64.js";export{V as VolumeIntersectionQueryController}from"./p-c314d033.js";import"./p-7f54de9d.js";import"./p-71fbe522.js";import"./p-8d704c8e.js";import"./p-e8f14257.js";import"./p-6320532c.js";import"./p-9acf99ad.js";import"./p-518baeb0.js";
4
+ export{c as ColorMaterial,l as LoadableResource,S as Scene,a as SynchronizedClock}from"./p-bfcc290d.js";export{S as SceneTreeController}from"./p-33db241f.js";export{f as fromNodeProto,i as isLoadedRow}from"./p-c5381b4a.js";export{C as CursorManager,b as boxQueryCursor,l as labelPinCursor,m as measurementCursor,a as measurementWithArrowCursor,p as pinCursor}from"./p-3a256fe9.js";export{M as MeasurementController,a as MeasurementEntity}from"./p-a5417053.js";export{M as MeasurementModel}from"./p-867331de.js";export{M as MeasurementOverlayManager}from"./p-db85855d.js";export{m as makeMinimumDistanceResult}from"./p-99f8e7e0.js";export{A as AngleUnits,f as AreaUnits,D as DistanceUnits,F as FrameCameraBase,a as ReceivedFrame,b as ReceivedFrameImage,c as ReceivedFrameScene,d as ReceivedOrthographicCamera,e as ReceivedPerspectiveCamera}from"./p-f12cfb57.js";export{E as EntityType}from"./p-e1d82323.js";export{A as ArrowMarkup,C as CircleMarkup,F as FreeformMarkup}from"./p-39d1f26c.js";export{V as Viewport}from"./p-1bb66e64.js";import{v as r,q as o,m as s}from"./p-71fbe522.js";export{T as TransformController}from"./p-4025ad8d.js";export{V as VolumeIntersectionQueryController}from"./p-c314d033.js";import"./p-7f54de9d.js";import"./p-8d704c8e.js";import"./p-e8f14257.js";import"./p-6320532c.js";import"./p-9acf99ad.js";import"./p-518baeb0.js";const t=.9999;function n(e){const o=r.create(Math.abs(e.x),Math.abs(e.y),Math.abs(e.z));const s=o.x<o.y&&o.x<o.z?1:0;const a=o.y<=o.x&&o.y<o.z?1:0;const t=o.z<=o.x&&o.z<=o.y?1:0;const n=r.create(s,a,t);return r.normalize(r.cross(e,n))}function u(e,a){const p=r.dot(e,a);if(p>t){const r=n(e);const a=o.fromAxisAngle(r,Math.PI);return s.makeRotation(a)}else if(p<=-t){return s.makeIdentity()}else{const t=r.angleTo(a,e);const n=r.normalize(r.cross(e,a));return s.makeRotation(o.fromAxisAngle(n,t+Math.PI))}}function j(e,o,a,t){const n=u(e,a);const p=s.makeTranslation(t);return s.multiply(s.multiply(p,n),s.makeTranslation(r.negate(o)))}const x=Object.freeze({__proto__:null,ALMOST_ONE:t,chooseOrthogonalVector:n,computeRotationMatrix:u,computeTransformationDelta:j});export{x as TransformationDelta};
5
5
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":""}
1
+ {"version":3,"sources":["src/lib/transforms/transformation-delta.ts"],"names":["ALMOST_ONE","chooseOrthogonalVector","normal","absNorm","Vector3","create","Math","abs","x","y","z","vector","normalize","cross","computeRotationMatrix","normal1","normal2","dot","axisDirection","quaternion","Quaternion","fromAxisAngle","PI","Matrix4","makeRotation","makeIdentity","angle","angleTo","computeTransformationDelta","position1","position2","rotationMatrix","translationDeltaMatrix","makeTranslation","multiply","negate"],"mappings":";;;q0CAEO,MAAMA,EAAa,eAOVC,EACdC,GAEA,MAAMC,EAAUC,EAAQC,OACtBC,KAAKC,IAAIL,EAAOM,GAChBF,KAAKC,IAAIL,EAAOO,GAChBH,KAAKC,IAAIL,EAAOQ,IAElB,MAAMF,EAAIL,EAAQK,EAAIL,EAAQM,GAAKN,EAAQK,EAAIL,EAAQO,EAAI,EAAM,EACjE,MAAMD,EAAIN,EAAQM,GAAKN,EAAQK,GAAKL,EAAQM,EAAIN,EAAQO,EAAI,EAAM,EAClE,MAAMA,EAAIP,EAAQO,GAAKP,EAAQK,GAAKL,EAAQO,GAAKP,EAAQM,EAAI,EAAM,EAEnE,MAAME,EAASP,EAAQC,OAAOG,EAAGC,EAAGC,GACpC,OAAON,EAAQQ,UAAUR,EAAQS,MAAMX,EAAQS,aAajCG,EACdC,EACAC,GAEA,MAAMC,EAAMb,EAAQa,IAAIF,EAASC,GAEjC,GAAIC,EAAMjB,EAAY,CACpB,MAAMkB,EAAgBjB,EAAuBc,GAE7C,MAAMI,EAAaC,EAAWC,cAAcH,EAAeZ,KAAKgB,IAChE,OAAOC,EAAQC,aAAaL,QAGzB,GAAIF,IAAQjB,EAAY,CAC3B,OAAOuB,EAAQE,mBAGZ,CACH,MAAMC,EAAQtB,EAAQuB,QAAQX,EAASD,GACvC,MAAMG,EAAgBd,EAAQQ,UAAUR,EAAQS,MAAME,EAASC,IAC/D,OAAOO,EAAQC,aACbJ,EAAWC,cAAcH,EAAeQ,EAAQpB,KAAKgB,eAkB3CM,EACdb,EACAc,EACAb,EACAc,GAEA,MAAMC,EAAiBjB,EAAsBC,EAASC,GAEtD,MAAMgB,EAAyBT,EAAQU,gBAAgBH,GACvD,OAAOP,EAAQW,SACbX,EAAQW,SAASF,EAAwBD,GACzCR,EAAQU,gBAAgB7B,EAAQ+B,OAAON","sourcesContent":["import { Matrix4, Quaternion, Vector3 } from '@vertexvis/geometry';\n\nexport const ALMOST_ONE = 0.9999;\n/**\n * For any single vector, there are an infinite number of potential orthogonal vectors. This function will determine\n * one orthogonal vector by crossing the provided vector with a unit vector in the positive X, Y, or Z directions.\n * @param normal\n * @returns\n */\nexport function chooseOrthogonalVector(\n normal: Vector3.Vector3\n): Vector3.Vector3 {\n const absNorm = Vector3.create(\n Math.abs(normal.x),\n Math.abs(normal.y),\n Math.abs(normal.z)\n );\n const x = absNorm.x < absNorm.y && absNorm.x < absNorm.z ? 1.0 : 0.0;\n const y = absNorm.y <= absNorm.x && absNorm.y < absNorm.z ? 1.0 : 0.0;\n const z = absNorm.z <= absNorm.x && absNorm.z <= absNorm.y ? 1.0 : 0.0;\n\n const vector = Vector3.create(x, y, z);\n return Vector3.normalize(Vector3.cross(normal, vector));\n}\n\n/**\n * Computes the rotation matrix for two normals. If both normals are neither parallel or anti-parallel,\n * this will compute the rotation matrix delta based on the angle from both normals.\n * If the normals are anti-parallel, the identity matrix will be returned, as no rotation is necessary in this case.\n * If the normals are parallel, an axis direction based on a chosen orthogonal vector will be used\n * to compute the rotation matrix to rotate the plane 180 degrees.\n * @param normal1\n * @param normal2\n * @returns an anti-parallel rotation Matrix4 betwen the given normals\n */\nexport function computeRotationMatrix(\n normal1: Vector3.Vector3,\n normal2: Vector3.Vector3\n): Matrix4.Matrix4 {\n const dot = Vector3.dot(normal1, normal2);\n // the angle is almost 0 in this case.\n if (dot > ALMOST_ONE) {\n const axisDirection = chooseOrthogonalVector(normal1);\n\n const quaternion = Quaternion.fromAxisAngle(axisDirection, Math.PI);\n return Matrix4.makeRotation(quaternion);\n }\n // the angle is almost 180 in this case.\n else if (dot <= -ALMOST_ONE) {\n return Matrix4.makeIdentity();\n }\n // the angle is between 0 & 180\n else {\n const angle = Vector3.angleTo(normal2, normal1);\n const axisDirection = Vector3.normalize(Vector3.cross(normal1, normal2));\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(axisDirection, angle + Math.PI)\n );\n }\n}\n\n/**\n * Computes the translation & rotation matrix delta between two world positions and two normals.\n * such that the computed translation matrix will be the delta between position 1 and position 2,\n * and the rotation will be rotated to be anti-parallel.\n *\n * @param normal1\n * @param position1\n * @param normal2\n * @param position2\n *\n * @returns Matrix4 translation matrix delta from position1 to\n * position2 & an anti-parallel rotation delta.\n */\nexport function computeTransformationDelta(\n normal1: Vector3.Vector3,\n position1: Vector3.Vector3,\n normal2: Vector3.Vector3,\n position2: Vector3.Vector3\n): Matrix4.Matrix4 {\n const rotationMatrix = computeRotationMatrix(normal1, normal2);\n\n const translationDeltaMatrix = Matrix4.makeTranslation(position2);\n return Matrix4.multiply(\n Matrix4.multiply(translationDeltaMatrix, rotationMatrix),\n Matrix4.makeTranslation(Vector3.negate(position1))\n );\n}\n"]}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
+ */
4
+ import{m as s}from"./p-71fbe522.js";class t{constructor(t){this.stream=t;this.isTransforming=false;this.currentDelta=s.makeIdentity()}async dispose(){if(this.isTransforming){this.endTransform()}}async beginTransform(t=s.makeIdentity()){if(!this.isTransforming){this.currentDelta=t;this.isTransforming=true;console.debug("Beginning transform interaction");await this.stream.beginInteraction({transform:{delta:this.toDeltaTransform(t)}})}}async updateTransform(s){this.currentDelta=s;await this.stream.updateInteraction({transform:{delta:this.toDeltaTransform(this.currentDelta,true)}})}async updateTranslation(t){this.currentDelta=s.makeTranslation(t);await this.stream.updateInteraction({transform:{delta:this.toDeltaTransform(this.currentDelta)}})}getCurrentDelta(){return this.currentDelta}async endTransform(){if(this.isTransforming){console.debug(`Ending transform interaction [delta=${this.currentDelta}]`);await this.stream.endInteraction({transform:{delta:this.toDeltaTransform(this.currentDelta)}});this.isTransforming=false;this.currentDelta=s.makeIdentity()}}async endInteraction(){if(this.isTransforming){await this.stream.endInteraction();this.isTransforming=false;this.currentDelta=s.makeIdentity()}}clearTransform(){this.currentDelta=s.makeIdentity();this.endTransform()}toDeltaTransform(t,i=false){const a=s.toObject(t);const n=i?{x:a.m11,y:a.m21,z:a.m31}:{x:a.m11,y:a.m12,z:a.m13};const r=i?{x:a.m12,y:a.m22,z:a.m32}:{x:a.m21,y:a.m22,z:a.m23};const e=i?{x:a.m13,y:a.m23,z:a.m33}:{x:a.m31,y:a.m32,z:a.m33};return{basisX:n,basisY:r,basisZ:e,xlate:{x:a.m14,y:a.m24,z:a.m34},scale:a.m44}}}export{t as T};
5
+ //# sourceMappingURL=p-4025ad8d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["src/lib/transforms/controller.ts"],"names":["TransformController","[object Object]","stream","this","isTransforming","currentDelta","Matrix4","makeIdentity","endTransform","delta","console","debug","beginInteraction","transform","toDeltaTransform","updateInteraction","makeTranslation","endInteraction","columnMajor","asObject","toObject","basisX","x","m11","y","m21","z","m31","m12","m13","basisY","m22","m32","m23","basisZ","m33","xlate","m14","m24","m34","scale","m44"],"mappings":";;;0CAIaA,EAIXC,YAA2BC,GAAAC,KAAAD,OAAAA,EAHnBC,KAAAC,eAAiB,MACjBD,KAAAE,aAAgCC,EAAQC,eAIzCN,gBACL,GAAIE,KAAKC,eAAgB,CACvBD,KAAKK,gBAIFP,qBACLQ,EAAyBH,EAAQC,gBAEjC,IAAKJ,KAAKC,eAAgB,CACxBD,KAAKE,aAAeI,EACpBN,KAAKC,eAAiB,KAEtBM,QAAQC,MAAM,yCAERR,KAAKD,OAAOU,iBAAiB,CACjCC,UAAW,CACTJ,MAAON,KAAKW,iBAAiBL,OAM9BR,sBAAsBQ,GAC3BN,KAAKE,aAAeI,QAEdN,KAAKD,OAAOa,kBAAkB,CAClCF,UAAW,CACTJ,MAAON,KAAKW,iBAAiBX,KAAKE,aAAc,SAK/CJ,wBAAwBQ,GAC7BN,KAAKE,aAAeC,EAAQU,gBAAgBP,SAEtCN,KAAKD,OAAOa,kBAAkB,CAClCF,UAAW,CACTJ,MAAON,KAAKW,iBAAiBX,KAAKE,iBAKjCJ,kBACL,OAAOE,KAAKE,aAGPJ,qBACL,GAAIE,KAAKC,eAAgB,CACvBM,QAAQC,MACN,uCAAuCR,KAAKE,uBAGxCF,KAAKD,OAAOe,eAAe,CAC/BJ,UAAW,CACTJ,MAAON,KAAKW,iBAAiBX,KAAKE,iBAGtCF,KAAKC,eAAiB,MACtBD,KAAKE,aAAeC,EAAQC,gBAIzBN,uBACL,GAAIE,KAAKC,eAAgB,OACjBD,KAAKD,OAAOe,iBAClBd,KAAKC,eAAiB,MACtBD,KAAKE,aAAeC,EAAQC,gBAIzBN,iBACLE,KAAKE,aAAeC,EAAQC,eAC5BJ,KAAKK,eAGCP,iBACNQ,EACAS,EAAc,OAEd,MAAMC,EAAWb,EAAQc,SAASX,GAIlC,MAAMY,EAASH,EACX,CACEI,EAAGH,EAASI,IACZC,EAAGL,EAASM,IACZC,EAAGP,EAASQ,KAEd,CACEL,EAAGH,EAASI,IACZC,EAAGL,EAASS,IACZF,EAAGP,EAASU,KAElB,MAAMC,EAASZ,EACX,CACEI,EAAGH,EAASS,IACZJ,EAAGL,EAASY,IACZL,EAAGP,EAASa,KAEd,CACEV,EAAGH,EAASM,IACZD,EAAGL,EAASY,IACZL,EAAGP,EAASc,KAElB,MAAMC,EAAShB,EACX,CACEI,EAAGH,EAASU,IACZL,EAAGL,EAASc,IACZP,EAAGP,EAASgB,KAEd,CACEb,EAAGH,EAASQ,IACZH,EAAGL,EAASa,IACZN,EAAGP,EAASgB,KAGlB,MAAO,CACLd,OAAAA,EACAS,OAAAA,EACAI,OAAAA,EACAE,MAAO,CACLd,EAAGH,EAASkB,IACZb,EAAGL,EAASmB,IACZZ,EAAGP,EAASoB,KAEdC,MAAOrB,EAASsB","sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Matrix4, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nexport class TransformController {\n private isTransforming = false;\n private currentDelta: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n public constructor(private stream: StreamApi) {}\n\n public async dispose(): Promise<void> {\n if (this.isTransforming) {\n this.endTransform();\n }\n }\n\n public async beginTransform(\n delta: Matrix4.Matrix4 = Matrix4.makeIdentity()\n ): Promise<void> {\n if (!this.isTransforming) {\n this.currentDelta = delta;\n this.isTransforming = true;\n\n console.debug('Beginning transform interaction');\n\n await this.stream.beginInteraction({\n transform: {\n delta: this.toDeltaTransform(delta),\n },\n });\n }\n }\n\n public async updateTransform(delta: Matrix4.Matrix4): Promise<void> {\n this.currentDelta = delta;\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta, true),\n },\n });\n }\n\n public async updateTranslation(delta: Vector3.Vector3): Promise<void> {\n this.currentDelta = Matrix4.makeTranslation(delta);\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n }\n\n public getCurrentDelta(): Matrix4.Matrix4 | undefined {\n return this.currentDelta;\n }\n\n public async endTransform(): Promise<void> {\n if (this.isTransforming) {\n console.debug(\n `Ending transform interaction [delta=${this.currentDelta}]`\n );\n\n await this.stream.endInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n this.isTransforming = false;\n this.currentDelta = Matrix4.makeIdentity();\n }\n }\n\n public async endInteraction(): Promise<void> {\n if (this.isTransforming) {\n await this.stream.endInteraction();\n this.isTransforming = false;\n this.currentDelta = Matrix4.makeIdentity();\n }\n }\n\n public clearTransform(): void {\n this.currentDelta = Matrix4.makeIdentity();\n this.endTransform();\n }\n\n private toDeltaTransform(\n delta: Matrix4.Matrix4,\n columnMajor = false\n ): vertexvis.protobuf.core.IAffineMatrix4f {\n const asObject = Matrix4.toObject(delta);\n\n // TODO: update this to pass a single order for the\n // transform matrix after work in https://vertexvis.atlassian.net/browse/PLAT-1582\n const basisX = columnMajor\n ? {\n x: asObject.m11,\n y: asObject.m21,\n z: asObject.m31,\n }\n : {\n x: asObject.m11,\n y: asObject.m12,\n z: asObject.m13,\n };\n const basisY = columnMajor\n ? {\n x: asObject.m12,\n y: asObject.m22,\n z: asObject.m32,\n }\n : {\n x: asObject.m21,\n y: asObject.m22,\n z: asObject.m23,\n };\n const basisZ = columnMajor\n ? {\n x: asObject.m13,\n y: asObject.m23,\n z: asObject.m33,\n }\n : {\n x: asObject.m31,\n y: asObject.m32,\n z: asObject.m33,\n };\n\n return {\n basisX,\n basisY,\n basisZ,\n xlate: {\n x: asObject.m14,\n y: asObject.m24,\n z: asObject.m34,\n },\n scale: asObject.m44,\n };\n }\n}\n"]}