{"version":3,"file":"c8y-ngx-components-widgets-implementations-three-d-rotation.mjs","sources":["../../widgets/implementations/three-d-rotation/three-d-rotation/three-d-rotation.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation/three-d-rotation.component.html","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-config/three-d-rotation-widget-config.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-config/three-d-rotation-widget-config.component.html","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.ts","../../widgets/implementations/three-d-rotation/three-d-rotation-widget-view/three-d-rotation-widget-view.component.html","../../widgets/implementations/three-d-rotation/three-d-rotation-widget.module.ts","../../widgets/implementations/three-d-rotation/c8y-ngx-components-widgets-implementations-three-d-rotation.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnDestroy,\n  OnInit,\n  ViewChild\n} from '@angular/core';\nimport { combineLatest, from, Observable, of, Subject, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { loadThree } from '@c8y/ngx-components/lazy/three';\nimport { ThreeDRotationWidgetRotate } from '../three-d-rotation.model';\nimport { loadOrbitControls } from '@c8y/ngx-components/lazy/three-orbit-controls';\nimport type THREE from 'three';\nimport type { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\n\n@Component({\n  selector: 'c8y-three-d-rotation',\n  templateUrl: './three-d-rotation.component.html',\n  standalone: true,\n  imports: []\n})\nexport class ThreeDRotationComponent implements AfterViewInit, OnInit, OnDestroy {\n  @ViewChild('canvas')\n  private canvasRef: ElementRef;\n\n  @Input() angles$: Observable<ThreeDRotationWidgetRotate> = of({ x: 0, y: 0, z: 0 });\n  @Input() modelObj$: Observable<any>;\n  @Input() cameraType$: Observable<string> = of('PC');\n  @Input() isWireframe$: Observable<boolean> = of(true);\n\n  get canvas(): HTMLCanvasElement | null {\n    return this.canvasRef?.nativeElement;\n  }\n\n  scene: THREE.Scene;\n  camera: THREE.PerspectiveCamera | THREE.OrthographicCamera;\n  model: THREE.Object3D;\n  private renderer: THREE.WebGLRenderer;\n\n  private afterViewInit$ = new Subject<void>();\n\n  private renderSubscription: Subscription;\n  private controls: OrbitControls;\n\n  ngOnInit() {\n    const three$ = from(loadThree()).pipe(shareReplay(1));\n    const model$ = combineLatest([three$, this.modelObj$]).pipe(\n      filter(([, modelObj]) => !!modelObj),\n      switchMap(([three, modelObj]) => this.loadModel(modelObj, three))\n    );\n    const modelWithWireframe$ = combineLatest([model$, this.isWireframe$]).pipe(\n      map(([model, isWireframe]) => this.setWireframe(model, isWireframe))\n    );\n\n    const rotatedModel$ = combineLatest([modelWithWireframe$, this.angles$]).pipe(\n      filter(([, angles]) => !!angles),\n      map(([model, angles]) => {\n        Object.assign(model.rotation, angles);\n        return model;\n      })\n    );\n\n    const cameraType$ = this.cameraType$.pipe(\n      filter(type => !!type),\n      distinctUntilChanged()\n    );\n\n    let previousCameraType: string;\n    this.renderSubscription = combineLatest([\n      three$,\n      rotatedModel$,\n      cameraType$,\n      this.afterViewInit$\n    ])\n      .pipe(filter(([, model]) => !!model))\n      .subscribe(async ([three, model, cameraType]) => {\n        if (model !== this.model || previousCameraType !== cameraType) {\n          this.model = model;\n          previousCameraType = cameraType;\n          this.createScene(three, model, cameraType);\n        }\n        if (!this.renderer) {\n          await this.setupRenderer(three);\n        }\n        this.render();\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.renderSubscription?.unsubscribe();\n    this.controls?.dispose();\n  }\n\n  ngAfterViewInit() {\n    this.afterViewInit$.next();\n  }\n\n  async loadModel(modelObj: any, three: typeof THREE): Promise<THREE.Object3D<THREE.Event>> {\n    const loader = new three.ObjectLoader();\n    const parsedModel = await loader.parse(modelObj);\n    return parsedModel;\n  }\n\n  async setupRenderer(three: typeof THREE) {\n    //* Renderer\n    // Use canvas element in template\n    this.renderer = new three.WebGLRenderer({ canvas: this.canvas });\n    this.renderer.setPixelRatio(devicePixelRatio);\n    this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);\n\n    const { OrbitControls } = await loadOrbitControls();\n    this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n    this.controls.enableDamping = true;\n    this.controls.dampingFactor = 0.25;\n    this.controls.rotateSpeed = 0.35;\n    this.controls.addEventListener('change', () => this.render());\n  }\n\n  setWireframe(parsedModel: THREE.Object3D, isWireframe: boolean) {\n    parsedModel.children.forEach((child: any) => {\n      if (child.material) {\n        child.material.wireframe = isWireframe;\n      }\n    });\n    return parsedModel;\n  }\n\n  private render(): void {\n    this.renderer?.render(this.scene, this.camera);\n  }\n\n  private createScene(three: typeof THREE, model: THREE.Object3D, cameraType: string) {\n    //* Scene\n    this.scene = new three.Scene();\n    this.scene.background = new three.Color(0xffffff);\n    this.scene.add(model);\n\n    const light = new three.AmbientLight(0xffffff, 0.5);\n    const lightDirectional = new three.DirectionalLight(0xffffff);\n    const lightDirectional2 = new three.DirectionalLight(0xffffff);\n\n    lightDirectional.position.set(20, 25, 30);\n    lightDirectional2.position.set(-20, -25, -30);\n    this.scene.add(lightDirectional);\n    this.scene.add(lightDirectional2);\n    this.scene.add(light);\n\n    this.camera = this.createCamera(three, cameraType);\n  }\n\n  private createCamera(three: typeof THREE, cameraType: string) {\n    let camera: THREE.OrthographicCamera | THREE.PerspectiveCamera;\n    switch (cameraType) {\n      case 'OC':\n        camera = new three.OrthographicCamera(30 / -2, 30 / 2, 30 / 2, 30 / -2, 1, 1000);\n        break;\n      case 'PC':\n      default:\n        camera = new three.PerspectiveCamera(30, this.getAspectRatio(), 0.1, 1000);\n        break;\n    }\n\n    camera.rotateX(Math.PI / 2);\n    camera.rotateY(Math.PI / 2);\n\n    camera.position.z = 23;\n    camera.position.x = 14;\n    camera.position.y = 7;\n\n    return camera;\n  }\n\n  private getAspectRatio() {\n    return this.canvas.clientWidth / this.canvas.clientHeight;\n  }\n}\n","<canvas #canvas class=\"fit-w fit-h\"></canvas>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { ControlContainer, FormBuilder, NgForm, Validators } from '@angular/forms';\nimport { CoreModule, OnBeforeSave } from '@c8y/ngx-components';\nimport { Observable } from 'rxjs';\nimport { ThreeDRotationWidgetConfig } from '../three-d-rotation.model';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\n\n@Component({\n  selector: 'c8y-three-d-rotation-widget-config',\n  templateUrl: './three-d-rotation-widget-config.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  standalone: true,\n  imports: [CoreModule, ButtonsModule]\n})\nexport class ThreeDRotationWidgetConfigComponent implements OnInit, OnBeforeSave {\n  @Input() config: ThreeDRotationWidgetConfig;\n  formGroup: ReturnType<ThreeDRotationWidgetConfigComponent['createForm']>;\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private form: NgForm\n  ) {}\n\n  onBeforeSave(\n    config?: ThreeDRotationWidgetConfig\n  ): boolean | Promise<boolean> | Observable<boolean> {\n    if (this.formGroup.valid) {\n      Object.assign(config, this.formGroup.value);\n      return true;\n    }\n    return false;\n  }\n\n  ngOnInit() {\n    this.initForm();\n  }\n\n  private initForm(): void {\n    this.formGroup = this.createForm(this.formBuilder);\n    this.form.form.addControl('config', this.formGroup);\n    this.formGroup.patchValue(this.config);\n  }\n\n  private createForm(formBuilder: FormBuilder) {\n    return formBuilder.group({\n      objectModel: ['box.min.json', [Validators.minLength(1)]],\n      isWireframe: [true, []],\n      cameraType: ['PC', [Validators.minLength(2), Validators.maxLength(2)]]\n    });\n  }\n}\n","<form [formGroup]=\"formGroup\">\n  <c8y-form-group>\n    <label translate>Select object model for rendering</label>\n    <div class=\"c8y-select-wrapper\">\n      <select class=\"form-control\" formControlName=\"objectModel\">\n        <option value=\"box.min.json\" translate>Box model</option>\n        <option value=\"phoneModel.min.json\" translate>Phone model</option>\n      </select>\n    </div>\n  </c8y-form-group>\n\n  <c8y-form-group>\n    <label translate>Wireframe</label>\n    <button type=\"button\" class=\"btn\" formControlName=\"isWireframe\" btnCheckbox translate>\n      Wireframe\n    </button>\n  </c8y-form-group>\n\n  <c8y-form-group>\n    <label translate>Camera type</label>\n    <div class=\"c8y-select-wrapper\">\n      <select class=\"form-control\" formControlName=\"cameraType\">\n        <option value=\"OC\" translate>Orthographic camera</option>\n        <option value=\"PC\" translate>Perspective camera</option>\n      </select>\n    </div>\n  </c8y-form-group>\n</form>\n","import { Component, Input, OnChanges, Optional, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n  filter,\n  map,\n  shareReplay,\n  switchMap,\n  distinctUntilChanged,\n  startWith\n} from 'rxjs/operators';\nimport { MeasurementRealtimeService } from '@c8y/ngx-components';\nimport { ThreeDRotationWidgetConfig, ThreeDRotationWidgetRotate } from '../three-d-rotation.model';\nimport { loadBoxModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-box-model';\nimport { loadPhoneModel } from '@c8y/ngx-components/widgets/implementations/three-d-rotation/lazy-phone-model';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { ThreeDRotationComponent } from '../three-d-rotation/three-d-rotation.component';\n\n@Component({\n  selector: 'c8y-three-d-rotation-widget-view',\n  templateUrl: './three-d-rotation-widget-view.component.html',\n  providers: [MeasurementRealtimeService],\n  standalone: true,\n  imports: [ThreeDRotationComponent]\n})\nexport class ThreeDRotationWidgetViewComponent implements OnChanges {\n  @Input() config: ThreeDRotationWidgetConfig;\n  angles$: Observable<ThreeDRotationWidgetRotate>;\n  modelObj$: Observable<any>;\n  deviceId$ = new BehaviorSubject<string>(null);\n  modelName$ = new BehaviorSubject<string>(null);\n  cameraType$ = new BehaviorSubject<string>('PC');\n  isWireframe$ = new BehaviorSubject<boolean>(true);\n\n  constructor(\n    private measurementRealtime: MeasurementRealtimeService,\n    @Optional() private dashboard: ContextDashboardComponent\n  ) {\n    this.modelObj$ = this.modelName$.pipe(\n      filter(name => !!name),\n      distinctUntilChanged(),\n      switchMap(name => this.getModelUrl(name)),\n      shareReplay(1)\n    );\n    this.angles$ = this.deviceId$.pipe(\n      filter(id => !!id),\n      distinctUntilChanged(),\n      switchMap(id => this.getAnglesOfDevice$(id)),\n      startWith({ x: 0, y: 0, z: 0 })\n    );\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.config && this.config) {\n      this.onConfigChange();\n    }\n  }\n\n  private onConfigChange() {\n    if (this.config.device?.id) {\n      this.deviceId$.next(`${this.config.device.id}`);\n    } else if (this.dashboard?.context?.id) {\n      this.deviceId$.next(`${this.dashboard.context?.id}`);\n    }\n\n    if (this.config.objectModel) {\n      this.modelName$.next(this.config.objectModel);\n    }\n\n    if (this.config.cameraType) {\n      this.cameraType$.next(this.config.cameraType);\n    }\n\n    if (this.config.isWireframe !== undefined) {\n      this.isWireframe$.next(this.config.isWireframe);\n    }\n  }\n\n  private async getModelUrl(model: string): Promise<any> {\n    // The name *.min.json still exist for backwards compatibility\n    // it might be stored in certain widget configs.\n    if (model === 'box.min.json') {\n      return await loadBoxModel();\n    } else {\n      return await loadPhoneModel();\n    }\n  }\n\n  private getAnglesOfDevice$(deviceId: string): Observable<ThreeDRotationWidgetRotate> {\n    const fragment = 'c8y_Acceleration';\n    const series = ['accelerationX', 'accelerationY', 'accelerationZ'];\n    return this.measurementRealtime\n      .latestValueOfSpecificMeasurement$(fragment, series[0], deviceId, 1)\n      .pipe(\n        filter(m => !!m && m[fragment] && series.every(axisSeries => m[fragment][axisSeries])),\n        map(measurement => {\n          const [xAxisValue, yAxisValue, zAxisValue] = series.map(axisSeries =>\n            Math.round(measurement[fragment][axisSeries].value)\n          );\n          return this.convertValues(xAxisValue, yAxisValue, zAxisValue);\n        })\n      );\n  }\n\n  private convertValues(x: number, y: number, z: number): ThreeDRotationWidgetRotate {\n    let rotateX = Math.atan2(y, z);\n    let rotateY = Math.atan2(x, Math.sqrt(y * y + z * z));\n    rotateX = rotateX ? rotateX % (Math.PI * 2) : 0;\n    rotateY = rotateY ? rotateY % (Math.PI * 2) : 0;\n\n    return {\n      x: rotateX,\n      y: 0,\n      z: rotateY\n    };\n  }\n}\n","<c8y-three-d-rotation\n  [modelObj$]=\"modelObj$\"\n  [angles$]=\"angles$\"\n  [cameraType$]=\"cameraType$\"\n  [isWireframe$]=\"isWireframe$\"\n></c8y-three-d-rotation>\n","import { NgModule } from '@angular/core';\nimport { ThreeDRotationComponent } from './three-d-rotation/three-d-rotation.component';\nimport { ThreeDRotationWidgetConfigComponent } from './three-d-rotation-widget-config/three-d-rotation-widget-config.component';\nimport { ThreeDRotationWidgetViewComponent } from './three-d-rotation-widget-view/three-d-rotation-widget-view.component';\n\n/**\n * @deprecated\n */\n@NgModule({\n  imports: [\n    ThreeDRotationWidgetViewComponent,\n    ThreeDRotationWidgetConfigComponent,\n    ThreeDRotationComponent\n  ]\n})\nexport class ThreeDRotationWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}