projects/atft/src/lib/raycaster/raycaster-group.directive.ts
        
Only components marked as atft-raycaster-group emit raycaster events. NOTE: All childs are also considered by raycaster (very usefull, for composite components).
                        AfterViewInit
                        OnDestroy
            
| Selector | [atft-raycaster-group] | 
                    
                        Methods | 
                
                        
  | 
                
                        Outputs | 
                
constructor(host: AbstractObject3D<any>, raycasterService: RaycasterService)
                     | 
                |||||||||
| 
                             
                                    Parameters :
                                     
                    
  | 
                
| click | |
                        Type :     EventEmitter
                     | 
                |
| mouseEnter | |
                        Type :     EventEmitter
                     | 
                |
| mouseExit | |
                        Type :     EventEmitter
                     | 
                |
| ngAfterViewInit | 
ngAfterViewInit()
                 | 
            
| 
                         
                            Returns :          
                void
                         | 
            
| ngOnDestroy | 
ngOnDestroy()
                 | 
            
| 
                         
                            Returns :          
                void
                         | 
            
| Private onClick | ||||||
                        
                    onClick(event: any)
                 | 
            ||||||
| 
                             
                                Parameters :
                                
                                 
                        
 
                            Returns :          
                            void
                         | 
            
| Private onMouseEnter | ||||||
                        
                    onMouseEnter(event: any)
                 | 
            ||||||
| 
                             
                                Parameters :
                                
                                 
                        
 
                            Returns :          
                            void
                         | 
            
| Private onMouseExit | 
                        
                    onMouseExit()
                 | 
            
| 
                         
                            Returns :          
                void
                         | 
            
| Private subscribeEvents | 
                        
                    subscribeEvents()
                 | 
            
| 
                         
                            Returns :          
                void
                         | 
            
| Private unSubscribeEvents | 
                        
                    unSubscribeEvents()
                 | 
            
| 
                         
                            Returns :          
                void
                         | 
            
import {AfterViewInit, Directive, EventEmitter, OnDestroy, Output} from '@angular/core';
import {AbstractObject3D} from '../object/abstract-object-3d';
import {RaycasterService} from './raycaster.service';
import {RaycasterEvent} from './raycaster-event';
import * as THREE from 'three';
export interface RaycasterEmitEvent {
  component: AbstractObject3D<any>;
  face?: THREE.Face;
}
/**
 * Only components marked as atft-raycaster-group emit raycaster events.
 * NOTE: All childs are also considered by raycaster (very usefull, for composite components).
 */
@Directive({selector: '[atft-raycaster-group]'})
export class RaycasterGroupDirective implements AfterViewInit, OnDestroy {
  @Output() mouseEnter = new EventEmitter<RaycasterEmitEvent>();
  @Output() mouseExit = new EventEmitter<RaycasterEmitEvent>();
  @Output() click = new EventEmitter<RaycasterEmitEvent>();
  constructor(
    private host: AbstractObject3D<any>,
    private raycasterService: RaycasterService
  ) {
    this.onMouseEnter = this.onMouseEnter.bind(this);
    this.onMouseExit = this.onMouseExit.bind(this);
    this.onClick = this.onClick.bind(this);
  }
  ngAfterViewInit(): void {
    this.raycasterService.addGroup(this.host);
    this.subscribeEvents();
  }
  private subscribeEvents() {
    const obj = this.host.getObject();
    obj.addEventListener(RaycasterEvent.mouseEnter, this.onMouseEnter);
    obj.addEventListener(RaycasterEvent.mouseExit, this.onMouseExit);
    obj.addEventListener(RaycasterEvent.click, this.onClick);
  }
  private unSubscribeEvents() {
    const obj = this.host.getObject();
    if (obj) {
      obj.removeEventListener(RaycasterEvent.mouseEnter, this.onMouseEnter);
      obj.removeEventListener(RaycasterEvent.mouseExit, this.onMouseExit);
      obj.removeEventListener(RaycasterEvent.click, this.onClick);
    }
  }
  private onMouseExit() {
    this.mouseExit.emit({
      component: this.host
    });
  }
  private onMouseEnter(event : any) {
    // console.log('RaycasterGroupDirective.onMouseEnter', event);
    this.mouseEnter.emit({
      component: this.host,
      face: event.face
    });
  }
  private onClick(event : any) {
    // console.log('onClick', event);
    this.click.emit({
      component: this.host,
      face: event.face
    });
  }
  ngOnDestroy(): void {
    this.unSubscribeEvents();
  }
}