import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh'; import { PositionGizmo } from '@babylonjs/core/Gizmos/positionGizmo'; import { UtilityLayerRenderer } from '@babylonjs/core/Rendering/utilityLayerRenderer'; import { MainApp } from './MainApp'; import { Monobehiver } from '../base/Monobehiver'; export class AppPositionGizmo extends Monobehiver { private utilityLayer: UtilityLayerRenderer | null = null; private gizmo: PositionGizmo | null = null; private enabled = true; private rotationEnabled = false; private scaleEnabled = false; constructor(mainApp: MainApp) { super(mainApp); } Awake(): void { const scene = this.mainApp.appScene.object; if (!scene) return; this.utilityLayer = new UtilityLayerRenderer(scene); this.gizmo = new PositionGizmo(this.utilityLayer); this.gizmo.updateGizmoRotationToMatchAttachedMesh = false; this.gizmo.updateGizmoPositionToMatchAttachedMesh = true; } setEnabled(enabled: boolean): void { this.enabled = enabled; if (!enabled) { this.detach(); } } configure(options?: { position?: boolean; rotation?: boolean; scale?: boolean }): void { if (!options) return; if (typeof options.position === 'boolean') { this.setEnabled(options.position); } if (typeof options.rotation === 'boolean') { this.rotationEnabled = options.rotation; } if (typeof options.scale === 'boolean') { this.scaleEnabled = options.scale; } } toggle(): void { this.setEnabled(!this.enabled); } attach(mesh: AbstractMesh | null): void { if (!this.enabled || !this.gizmo) return; this.gizmo.attachedMesh = mesh; } detach(): void { if (this.gizmo) { this.gizmo.attachedMesh = null; } } isEnabled(): boolean { return this.enabled; } getAttachedMesh(): AbstractMesh | null { return this.gizmo?.attachedMesh ?? null; } dispose(): void { this.gizmo?.dispose(); this.utilityLayer?.dispose(); this.gizmo = null; this.utilityLayer = null; } }